Ho un servizio in background chiamato MyService
in un processo remoto (applicazione specifica) chiamato MyApp:MyOtherProcess
. Cosa succede a MyApp:MyOtherProcess
e MyService
quando faccio scorrere l'applicazione?Arresto dei servizi nei processi remoti
L'app => l'interfaccia utente delle app in esecuzione mi dice che ho 0 processi e 1 servizio. Lo interpreto come MyApp:MyOtherProcess
non è attivo ma si sveglierà quando MyService
si sveglia.
Il pensiero MyService
è ancora avviato, quindi ho provato a interrompere il servizio.
arresto MyService:
Intent i = new Intent(context, MyService.class);
if (isMyOtherProcessRunning(context)) {
//Test case: I have swiped away the application
//Ahh, nothing is logged so I think MyService.onDestory is not invoked!
//Is MyService still running???
context.stopService(context, i);
} else {
//Test case: I have not swiped away the application
//Good, "destroying" is logged so MyService.onDestroy was invoked!
context.stopService(context, i);
}
MyService:
public MyService : Service {
@Override
public void onCreate() {
Log.d("MyService", "creating");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("MyService", "starting");
return START_REDELIVER_INTENT;
}
@Override
public void onDestroy() {
Log.d("MyService", "destroying");
}
}
Helper:
public boolean isMyOtherProcessRunning(Context applicationContext) {
ActivityManager activityManager = (ActivityManager)applicationContext.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses();
for(int i = 0; i < procInfos.size(); i++)
{
String processName = procInfos.get(i).processName;
if(processName.equals("MyApp:MyOtherProcess")) {
return true;
}
}
return false;
}
AndroidManifest.xml:
<service android:enabled="true" android:name="com.myapp.MyService" android:process=":MyOtherProcess" />
Per risolvere il problema, avvio MyService
e interrompo immediatamente lo MyService
se il processo è stato interrotto. Sembra una cattiva pratica. Il riavvio di un servizio solo per ucciderlo è una cattiva pratica? Mi sembra di non capire come viene mantenuto MyService
quando il processo di contenimento è "ucciso" ... il processo viene persino ucciso, in primo luogo ... può un processo diventare semplicemente inattivo ... così perso!
soluzione attuale
arresto MyService:
Intent i = new Intent(context, MyService.class);
if (isMyOtherProcessRunning(context)) {
//Test case: I have swiped away the application
//Ahh, nothing is logged so I think MyService.onDestory is not invoked!
//Is MyService still running???
i.putExtra("stopImmediately", true);
context.stopService(context, i);
} else {
//Test case: I have not swiped away the application
//Good, "destroying" is logged so MyService.onDestroy was invoked!
context.stopService(context, i);
}
MyService:
public MyService : Service {
@Override
public void onCreate() {
Log.d("MyService", "creating");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("MyService", "starting");
if (intent.getBooleanExtra("stopImmediately", false)) {
this.stopSelf();
return START_NOT_STICKY;
}
return START_REDELIVER_INTENT;
}
@Override
public void onDestroy() {
Log.d("MyService", "destroying");
}
}
che sto con sistema operativo Android 4.4.4 API 19 su un Samsung Galaxy S5 con la versione Genymotion 2.3.1.
non capisco: si chiama stopService che aspetta onStartCommand per essere chiamato? – pskink
No, chiamo stopService e aspetto che onDestroy venga chiamato. –
quindi perché si passa "stop immediatamente" extra nell'intenzione di stopService? cosa vuoi esattamente raggiungere? – pskink