2015-03-26 11 views
5

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.

+0

non capisco: si chiama stopService che aspetta onStartCommand per essere chiamato? – pskink

+0

No, chiamo stopService e aspetto che onDestroy venga chiamato. –

+0

quindi perché si passa "stop immediatamente" extra nell'intenzione di stopService? cosa vuoi esattamente raggiungere? – pskink

risposta

0

Penso che IntentService aiuterà il tuo caso. Estendi il tuo servizio come IntentService piuttosto che servizio, che vuoi arrestare automaticamente.

IntentService è una classe base per Servizi che gestiscono richieste asincrone (espresse come Intenti) su richiesta. I client inviano richieste tramite chiamate startService (Intent); il servizio viene avviato in base alle necessità, gestisce ogni Intent a sua volta utilizzando un thread di lavoro e si arresta automaticamente quando termina il lavoro.

+0

IntentService sembra davvero utile! Ma è necessario dal momento che sono già in un processo diverso? –

+0

Ma stai creando un servizio, vero? Basta creare di tipo IntentService, il servizio che si desidera interrompere dopo aver eseguito il lavoro. È fatto per quello scopo. –

+0

Ma voglio che il mio servizio sia di lunga durata. –

Problemi correlati