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:
- ¿Cómo comprobar si una actividad se está ejecutando en segundo plano / primer plano de un servicio?
- Android Start_redeliver_intent tarda mucho tiempo (horas) en reiniciar el servicio
- StartForeground causando problemas con cordova
- Cómo detectar el botón de volumen haga clic en el servicio de fondo o en el entorno nativo en Android?
- Google Analytics V4 Medición de la campaña Las pruebas no funcionan
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.
- ¿Qué hace setAction () para intención (Broadcast)
- Simular Android matando y reiniciar el servicio
- Cómo hacer que el servicio Android se comunique con la actividad
- ¿Cómo hacer que el daemon nativo de Unix / Linux funcione en Android?
- Android - Uso de Google Analytics v4 Campaign Measurement
- Servicio y cordova plugin
- Cómo obtener la intención que detiene el servicio en android
- Retraso en el lanzamiento de la actividad del servicio de chat principal
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