Transmitir datos a onDestroy () de Service

Quiero saber si el servicio se terminó de una actividad en particular, por lo que estoy pasando una cadena de esa actividad al llamar a stopServivce(service) .

Aquí está el código:

 Intent service = new Intent(Activity.this, service.class); service.putExtra("terminate", "activity terminated service"); stopService(service); 

Pero parece que puedo acceder a esta variable con getIntent().getExtras().getString("terminate); en el método onDestroy() .

[EDITAR]

Encontré un camino alrededor de este obstáculo, pero quisiera que mi pregunta todavía fuera contestada. Acabo de hacer lo que tenía que hacer en el método onDestroy() en la actividad y luego se llama stopService(service) . Tuve la suerte de que mi situación no necesitaba nada más complicado.

No hay manera de acceder a la Intent en onDestroy . Tienes que señalar el servicio de otra manera (Binder, Preferencias compartidas, Transmisión local, Datos globales o Messenger). Un buen ejemplo de uso de difusión se da en esta respuesta . También puede conseguir que esto funcione llamando a startService lugar de stopService . startService sólo inicia un nuevo servicio si aún no existe, por lo que varias llamadas a startService es un mecanismo que envía el Intent al servicio. Usted ve este truco es el uso de BroadcastReceivers . Puesto que usted tiene acceso al Intent en onStartCommand , por lo que puede implementar la terminación mediante el cheque de los extras de Intent y llamando a stopSelf si se le ordena terminar. Aquí está un bosquejo de ella en la acción –

 public int onStartCommand(Intent intent, int flags, int startId) { final String terminate = intent.getStringExtra("terminate"); if(terminate != null) { // ... do shutdown stuff stopSelf(); } return START_STICKY; } 

Sólo para ilustrar lo que sugiere el iagreen;

En Actividad

 Intent broadcastIntent = new Intent(); broadcastIntent.setAction("com.package.yourfilter"); broadcastIntent.putExtra("activity_name", "your_activity"); sendBroadcast(broadcastIntent); 

En servicio

  private YourActionReceiver abc; this.abc = new YourActionReceiver(); registerReceiver(this.abc, new IntentFilter("com.package.yourfilter")); public class YourActionReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // Get the name of activity that sent this message } } 

Estado global

es tu amigo. 🙂
Compruebe una Cadena Global siempre que lo necesite (diga antes de terminar). También puede que desee tener un state enumeración. O una bandera para ver si el estado es válido.

Receta:

El problema más general que usted está encontrando es cómo ahorrar estado a través de varias actividades y todas las partes de su uso. Una variable estática (por ejemplo, un singleton) es una forma común de Java de lograr esto. He encontrado sin embargo, que una manera más elegante en Android es asociar su estado con el contexto de la aplicación.

Como ustedes saben, cada Actividad es también un Contexto, que es información sobre su entorno de ejecución en el sentido más amplio. Su aplicación también tiene un contexto, y Android garantiza que existirá como una sola instancia en su aplicación.

La forma de hacerlo es crear su propia subclase de android.app.Application y, a continuación, especificar esa clase en la etiqueta de la aplicación en su manifiesto. Ahora Android creará automáticamente una instancia de esa clase y la pondrá a disposición para toda la aplicación. Puede acceder a él desde cualquier contexto utilizando el método Context.getApplicationContext () (Activity también proporciona un método getApplication () que tiene exactamente el mismo efecto):

 class MyApp extends Application { private String myState; public String getState(){ return myState; } public void setState(String s){ myState = s; } } class Blah extends Activity { @Override public void onCreate(Bundle b){ ... MyApp appState = ((MyApp)getApplicationContext()); String state = appState.getState(); ... } } class BlahBlah extends Service { @Override public void onCreate(Bundle b){ ... MyApp appState = ((MyApp)getApplicationContext()); String state = appState.getState(); ... } } 

Esto tiene esencialmente el mismo efecto que usar una variable estática o un singleton, pero se integra bastante bien en el marco existente de Android. Tenga en cuenta que esto no funcionará en todos los procesos (si su aplicación es una de las raras que tiene varios procesos).

Los créditos van a @Soonil

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.