2014-12-06 144 views
0

我刚开始学习如何通过一些代码示例创建简单的android应用程序。试图在后台运行服务

我拿了一个音频捕获代码的例子,只使用了一个活动,并希望添加一个服务。以便用户从视图中单击一个按钮,然后活动将开始/停止录音服务。

目标是用户将进入该应用程序,点击“开始”按钮,然后服务将开始,并将永远保持在后台,直到他返回到应用程序并点击“停止”。

问题是,无论何时我离开应用程序并打开“最近使用的应用程序”并滑出我的应用程序,出于某种原因,我可以看到Congrats! MyService CreatedMy Service Started消息。我不知道为什么,当我滑出了最近使用的应用菜单的服务正在重新启动,我希望它是继续运行或接近..

record.java(活动):

package com.example.recordtocloud; 
import java.io.File; 
import java.io.IOException; 

import android.media.MediaPlayer; 
import android.media.MediaRecorder; 
import android.os.Bundle; 
import android.os.Environment; 
import android.app.Activity; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Toast; 
import android.content.Intent; 

import android.app.Activity; 
import android.os.Bundle; 

public class record extends Activity { 
    /** 
    * Called when the activity is first created. 
    */ 

    private Button start,stop,play; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     start = (Button)findViewById(R.id.button1); 
     stop = (Button)findViewById(R.id.button2); 
     play = (Button)findViewById(R.id.button3); 

     //stop.setEnabled(false); 
     //play.setEnabled(false); 

    } 

    public void start(View view){ 
     startService(new Intent(this, recordbg.class)); 

     //start.setEnabled(false); 
     //stop.setEnabled(true); 
     //Toast.makeText(getApplicationContext(), "Recording started", Toast.LENGTH_LONG).show(); 

    } 

    public void stop(View view){ 
     stopService(new Intent(this, recordbg.class)); 

     //stop.setEnabled(false); 
     //play.setEnabled(true); 
     //Toast.makeText(getApplicationContext(), "Audio recorded successfully", 
       //Toast.LENGTH_LONG).show(); 
    } 

    public void play(View view) throws IllegalArgumentException, 
      SecurityException, IllegalStateException, IOException{ 

     MediaPlayer m = new MediaPlayer(); 
     m.setDataSource(Environment.getExternalStorageDirectory(). 
       getAbsolutePath() + "/myrecording.3gp"); 
     m.prepare(); 
     m.start(); 
     Toast.makeText(getApplicationContext(), "Playing audio", Toast.LENGTH_LONG).show(); 

    } 
} 

recordbg.java(服务):

package com.example.recordtocloud; 

import android.app.Service; 
import android.content.Intent; 
import android.media.MediaRecorder; 
import android.os.Environment; 
import android.os.IBinder; 
import android.widget.Toast; 
import android.util.Log; 

import java.io.IOException; 

public class recordbg extends Service { 
    private MediaRecorder myAudioRecorder; 
    private String outputFile = null; 
    private static final String TAG = "recordbg"; 

    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     Toast.makeText(this, "Congrats! MyService Created", Toast.LENGTH_LONG).show(); 
     Log.d(TAG, "onCreate"); 

     outputFile = Environment.getExternalStorageDirectory(). 
       getAbsolutePath() + "/myrecording.3gp"; 

     myAudioRecorder = new MediaRecorder(); 
     myAudioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     myAudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
     myAudioRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB); 
     myAudioRecorder.setOutputFile(outputFile); 
    } 

    @Override 
    public void onStart(Intent intent, int startId) { 
     Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show(); 
     Log.d(TAG, "onStart"); 
     try { 
      myAudioRecorder.prepare(); 
      myAudioRecorder.start(); 

     } catch (IllegalStateException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onDestroy() { 
     Toast.makeText(this, "MyService Stopped", Toast.LENGTH_LONG).show(); 
     Log.d(TAG, "onDestroy"); 
     myAudioRecorder.stop(); 
     myAudioRecorder.release(); 
     myAudioRecorder = null; 
    } 
} 

回答

0

A “永远” 的后台服务不存在Android的原因有两个:

  1. 没有唤醒锁的CPU可以深度睡眠;
  2. 操作系统可能随时杀死您的进程。

对于点1)你可以抓住一个唤醒锁,以保持CPU清醒。对于点2)你可以创建一个前台服务。前台服务可以被操作系统杀死,但可能性很低。

编辑: 更新您的代码,因为你必须实现onStartCommand(),而不是在onStart(),见here

+0

你能告诉我,如果我上面列出的服务目前“前景”?此外,为什么当我从“最近使用的应用”菜单中删除应用时,我看到了“已创建服务”和“已启动服务”消息? – 2014-12-06 11:03:04

+0

没有您的服务不在前台。也许操作系统正在查杀并重新启动你的应用程序。另外你必须实现onStartCommand(),看看我的更新。 – greywolf82 2014-12-06 11:07:00