Servicio de ejecución en el fondo?

Una de las funciones de la aplicación que estoy construyendo tenía una función de registro. Hago esto comenzando un objeto de MediaRecorder en un servicio:

Intent intent = new Intent(v.getContext(), RecordService.class); Messenger messenger = new Messenger(handler); intent.putExtra("COUNT", basic); intent.putExtra("MESSENGER", messenger); v.getContext().startService(intent); //service //... mRecorder = new MediaRecorder(); //... 

Ahora introduje una notificación que tenía que dejar al usuario saber cuál es el estado de la grabación sí mismo porque si usted va el el casero o golpea el backbutton, tiene que guardar la grabación. Por lo tanto, si pulsa en la notificación, regresa a la aplicación .

Ahí es donde estoy luchando, si hago clic en la notificación, vuelvo a la aplicación, pero todo se establece en el estado inicial (Timer está de vuelta 00:00:00 y puedo pulsar el botón de grabación de nuevo en lugar del botón de pausa) Lo que debo lograr es, por supuesto, que sigue grabando y que puedo ver el cronómetro en curso + botón de parada . Nota: el temporizador no es un servicio en este momento .. Alguna idea de cómo debería manejar esto?

EDITAR

Supongamos que cierro la aplicación, el servicio sigue funcionando. Reapertura de la aplicación (y por lo tanto la actividad de donde el servicio fue llamado inicialmente) podemos hacer con:

 private boolean isMyServiceRunning() { ActivityManager manager = (ActivityManager) myContext.getSystemService(Context.ACTIVITY_SERVICE); for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { if (MyService.class.getName().equals(service.service.getClassName())) { return true; } } return false; } 

Así que en parte tengo eso cubierto, pero, las variables pasadas de ese servicio a esa actividad ahora se han ido. ¿Parece que mi Manejador en mi Actividad no los recoge después de reabrir esa Actividad?

 private Handler handler = new Handler() { public void handleMessage(Message message) { //.. Bundle bundle = message.getData(); fileName = bundle.getString("FILENAME"); tvFileName.setText(fileName); Log.e("Filename", "transfered: " + fileName); }; }; 

//EDITAR

Fragmento:

 public class LayoutOne extends Fragment implements OnClickListener { //vars @Override public void onPause() { super.onPause(); if (mRecorder != null) { mRecorder.release(); mRecorder = null; } if (mPlayer != null) { mPlayer.release(); mPlayer = null; } } private Handler handler = new Handler() { public void handleMessage(Message message) { int i = message.arg1; Bundle bundle = message.getData(); fileName = bundle.getString("FILENAME"); tvFileName.setText(fileName); Log.e("Handler", "Succesfully transfered: " + (Integer.toString(i))); Log.e("Filename", "Succesfully transfered: " + fileName); }; }; @Override public void onClick(View v) { switch (v.getId()) { case R.id.bRecord: if (mStartRecording) { mStartRecording = false; Intent intent = new Intent(v.getContext(), RecordService.class); Messenger messenger = new Messenger(handler); intent.putExtra("MESSENGER", messenger); v.getContext().startService(intent); } else { mRecordButton.setText("Record"); Intent stopIntent = new Intent(v.getContext(), RecordService.class); try { v.getContext().stopService(stopIntent); } catch (Exception e) { e.printStackTrace(); } mStartRecording = true; } break; case R.id.bStop: Intent stopIntent = new Intent(v.getContext(), RecordService.class); v.getContext().stopService(stopIntent); break; } } public static Fragment newInstance(Context context) { LayoutOne f = new LayoutOne(); return f; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { root = (ViewGroup) inflater.inflate(R.layout.layout_one, null); myContext = container.getContext(); //buttons mgr = (NotificationManager) myContext.getSystemService(Context.NOTIFICATION_SERVICE); return root; } public void notifyMe(View v) { Notification note = new Notification(R.drawable.ic_launcher, getString(R.string.notificationbar), System.currentTimeMillis()); PendingIntent i = PendingIntent.getActivity(myContext, 0, new Intent( myContext, ViewPagerStyle1Activity.class), 0); note.setLatestEventInfo(myContext, getString(R.string.app_name), getString(R.string.notification), i); note.number = ++count; note.vibrate = new long[] { 500L, 200L, 200L, 500L }; note.flags |= Notification.FLAG_AUTO_CANCEL; mgr.notify(NOTIFY_ME_ID, note); } public void clearNotification(View v) { mgr.cancel(NOTIFY_ME_ID); } // /SHARED PREFERENCES SETTINGS/// //… private void initiatePopupWindow() { //.. } @Override public void onResume() { super.onResume(); Intent intent = new Intent(myContext, RecordService.class); myContext.startService(intent); myContext.bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE); } private ServiceConnection mServiceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub LocalBinder binder = (LocalBinder) service; myService = binder.getService(); //myService.setBound(true); initializeUI(); } @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub } }; protected void initializeUI() { //.. } } @Override public void onDestroy() { // TODO Auto-generated method stub myContext.unbindService(mServiceConnection); } @Override public void onStop() { // TODO Auto-generated method stub myContext.unbindService(mServiceConnection); } } 

//SERVICIO

 public class RecordService extends Service { //vars public class LocalBinder extends Binder { RecordService getService() { return RecordService.this; } } @Override public void onCreate() { Log.i("Oncreate", "Service onCreate"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Bundle extras = intent.getExtras(); if (extras != null) { messenger = (Messenger) extras.get("MESSENGER"); count = Integer.toString(extras.getInt("COUNT")); try { Message message = new Message(); int arg = 0; message.arg1 = arg; mFileNamePass=”test”; Bundle bundle = new Bundle(); bundle.putString("FILENAME", mFileNamePass); message.setData(bundle); messenger.send(message); } catch (android.os.RemoteException e1) { Log.w(getClass().getName(), "Exception sending message", e1); } } else { Log.i("Extras","Didn't find extras"); } Runnable r = new Runnable() { @Override public void run() { checkIfFolderExists(); String dateFull = calculateDate(); mFileName = Environment.getExternalStorageDirectory() .getAbsolutePath(); mFileName += "test.3gp"; mRecorder = new MediaRecorder(); mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); mRecorder.setOutputFile(mFileName); mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); try { mRecorder.prepare(); } catch (IOException e) { Log.e(LOG_TAG, "prepare() failed"); } mRecorder.start(); Log.i("Service", "Service running"); } }; Thread t = new Thread(r); t.start(); return RecordService.START_STICKY; } @Override public void onDestroy() { Runnable stopRecord = new Runnable() { @Override public void run() { mRecorder.stop(); mRecorder.release(); mRecorder = null; } }; Thread stopRecordThread = new Thread(stopRecord); stopRecordThread.start(); Log.i("Service", "Service stopped"); super.onDestroy(); } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } } 

One Solution collect form web for “Servicio de ejecución en el fondo?”

En primer lugar, no es necesario comprobar si su Service se ejecuta por algún método ActivityManager . Si llama a startService() && bindService() en su onResume() , Android es lo suficientemente inteligente como para limitarse a enlazar con el Service si ya se está ejecutando, y si no, creará el Service pasando por su ciclo de vida documentado y luego eso.

Lo que podría hacer aquí es lo siguiente:

 @Override public void onResume() { super.onResume(); Intent intent = new Intent(this, YourService.class); startService(intent); bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE); } 

Ahora, digamos que su servicio ya está en ejecución y desea obtener sus valores adecuados. En el método onServiceConnected() de su ServiceConnection() , puede llamar a un método como initializeUI() cuando se realiza la vinculación:

 private ServiceConnection mServiceConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { LocalBinder binder = (LocalBinder) service; myService = binder.getService(); myService.setBound(true); initializeUI(); } public void onServiceDisconnected(ComponentName className) { } }; 

Y ahora, tiene la variable myService que apunta a su objeto de Service que puede llamar a sus getters , como myService.getTimer() y myService.isRecording() .

 public void initializeUI() { timerTextview.setText( myService.getTime() ); someOtherUiElement.setText( myService.getSomething() ); if( myService.isRecording() ) recordButton.setImageResource( R.drawable.pause ); } //etc... 

Por cierto, no sé si también estás luchando por mantener el servicio en ejecución cuando salgas de la aplicación. Si lo haces, el uso de startService(intent) mantendrá tu Service funcionamiento siempre y cuando tenga suficiente memoria. Debe tener un pedazo de código en el que puede llamar a myService.stopService() , de lo contrario, el servicio se ejecutará durante un tiempo muy largo.

  • Cómo mostrar un cuadro de diálogo de un servicio
  • Android: Cómo detener el servicio de música de mi aplicación, si otra aplicación reproduce música.
  • Inicio del servicio de fondo cuando se enciende Android
  • Android: mantener el servicio en ejecución cuando se mata la aplicación
  • En Android: ¿Cómo llamar a la función de la actividad de un servicio?
  • Android: superposición en la ventana sobre las actividades de una tarea
  • Iniciar el servicio en el arranque, pero no toda la aplicación de Android
  • Android detecta el estado táctil desde cualquier aplicación
  • Servicio de Android - URL de ping
  • ¿Hay alguna manera de obtener actualizaciones de fondo de la API de Google Fit?
  • "No se puede realizar esta acción en una instancia no sellada" excepción java.lang.IllegalStateException
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.