2010-04-27 31 views
14

Forse puoi aiutare.Killer processo Android

E 'possibile ottenere l'elenco di tutti Processes che sono in esecuzione nel sistema Android, e uccidere alcuni di loro? So che ci sono alcune applicazioni (task managers), ma mi piacerebbe scrivere la mia, semplice applicazione.

Vorrei scrivere semplici task manager, proprio elenco di tutti i processi e pulsante, che uccideranno alcuni di loro.

Potresti scrivere alcuni metodi Java che posso chiamare al fine di ottenere l'elenco dei processi, e il metodo per ucciderli. O dammi solo qualche consiglio.

risposta

41

L'uccisione di app/servizi in Android è generalmente una idea davvero pessima. Mentre è possibile scrivere le app task killer, non dovrebbe essere incoraggiato per scopi diversi da quelli di sviluppo/debug.

gestione compito è la responsabilità degli Android O/S, le attività che si possono vedere non sono processi (nel senso dei processi che si vedono nel task manager di Windows, ad esempio), infatti, hanno solo un processo in cui Android dice loro che possono averne uno.

Le app vengono regolarmente interrotte da questi strumenti di gestione delle attività, poiché spesso non riescono a ripristinarsi dalla terminazione forzata, in particolare se erano impegnate a scrivere su un file oa utilizzare un'altra risorsa quando sono stati uccisi. Mette anche gli utenti del portatile in una falsa aspettativa che le app elencate siano in realtà RUNNING sul loro telefono, che spesso non sono. Questo è spiegato nel [docs ActivityManager] [1]:

informazioni è possibile recuperare su un particolare compito che è attualmente "esecuzione" nel sistema. Si noti che un'attività in esecuzione non significa che l'attività effettiva di ha un processo in cui è in esecuzione attivamente ; significa semplicemente che l'utente è andato ad esso e non chiuse, ma attualmente il sistema potrebbe aver ucciso il suo processo ed è solo aggrappata al suo ultimo stato in fine di riavviare quando l'utente ritorni.

Quando si vede l'elenco dei running applicazioni in applicazioni come TaskKiller o Quick System Info, molti di loro non sono in realtà in esecuzione, sono solo in uno stato sospeso. Queste app non consumano risorse di sistema perché Android ha deciso di interromperle finché non saranno nuovamente necessarie. Tuttavia, quando li uccidi, non darai loro il tempo di spegnersi in modo pulito, e quando proverai a lanciarli la prossima volta ti verrà presentata una finestra di dialogo di chiusura forzata ostile. Ho visto le app rompersi completamente, con anche una re-installazione inefficace, perché stanno cercando di leggere un file danneggiato sulla scheda SD, o usano chiamate API non ufficiali.

In breve, gli amici non consentono agli amici di utilizzare i killers delle attività in Android.

In ogni caso, per rispondere alla tua domanda, lo ActivityManager è ciò che la maggior parte di queste app utilizza per elencare le attività in esecuzione/sospeso.

freetaskmanager è un esempio di uno di questi task managers in uso.

+0

Ok, capisco. Grazie per il chiarimento. Quindi forse cercherò di scrivere il mio semplice task manager. – Martin

+4

Fantastica spiegazione! –

+9

Anche se sono d'accordo sul fatto che i processi di omissione siano una cattiva idea, trovo che sul mio telefono può essere necessario in quanto alcune applicazioni non offrono un modo per chiudersi correttamente e il mio telefono può diventare piuttosto lento e non reattivo. L'utilizzo di un task killer risolve questo problema. – stealthcopter

6
// Get currently running application processes 
    List<ActivityManager.RunningAppProcessInfo> list = servMng.getRunningAppProcesses(); 
    if(list != null){ 
    for(int i=0;i<list.size();++i){ 
     if("com.android.email".matches(list.get(i).processName)){ 
     int pid = android.os.Process.getUidForName("com.android.email"); 
      android.os.Process.killProcess(pid); 
     }else{ 
     mTextVIew.append(list.get(i).processName + "\n"); 
     } 
    } 
    } 


    /* 
    // Get currently running service 
    List<ActivityManager.RunningServiceInfo> list = servMng.getRunningServices(1024); 
    if(list != null){ 
    for(int i=0;i<list.size();++i){ 
     mTextVIew.append(list.get(i).service.getClassName() + "\n"); 
    } 
    } 
    */ 

    /* 
    // Get currently running tasks 
    List<ActivityManager.RunningTaskInfo> list = servMng.getRunningTasks(1024); 
    if(list != null){ 
    for(int i=0;i<list.size();++i){ 
     mTextVIew.append(list.get(i).toString() + "\n"); 
    } 
    } 
    */ 
+0

Questo non funzionerà per l'OP, perché il kernel impedisce android.os.Process.killProcess dall'uccidere l'applicazione oltre l'ambito del suo pacchetto. –

3

Uscire da un'app per Android tramite Java è a dir poco difficile. Uccidere l'app tramite l'interfaccia Process Object è generalmente considerata una cattiva forma per tutti i motivi sopra elencati, non li rimuoverò, ma non credo che lo scoraggiamento pubblicato abbia lo scopo di impedirti di fare tutto insieme, ti fanno solo consapevole di possibili avvertimenti. Ecco il trucco, Android deve tenere traccia delle attività e load/run order perché i dispositivi hanno un pulsante back ... quindi devi obbligatoriamente chiamare finish() o finishFromChild(childActivity) e quando l'utente exits l'app, c'è una precedente attività dalla tua app, ignorando felicemente il tuo codice che ha chiesto di uscire.

A volte, devi solo uccidere l'app. Quindi ... prima di uccidere questo processo digitale, devi fare un po 'di pianificazione. Assicurati che l'utente non uccida nessun file I/O o comunicazione di rete vitale per la tua app. La mia strategia per questo era di fare in modo che le mie attività svolgessero tutte le operazioni di sollevamento o di sollevamento in prossimità degli eventi di carico.

Inoltre, chiedo sempre all'utente prima di uscire, una convenzione di interfaccia utente dell'applicazione desktop che si traduce correttamente qui.

Il codice di cui sopra manca il marchio chiamando "getUidForName" ...

Questo esempio cattura il nativo Android back button evento dal pulsante hardware indietro e richiede all'utente "vuoi veramente lasciare la mia app "e se l'utente seleziona" sì "uccide l'app.

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    //Handle the back button 
    if(keyCode == KeyEvent.KEYCODE_BACK) { 
     //Ask the user if they want to quit 
     new AlertDialog.Builder(this) 
     .setIcon(android.R.drawable.exclamationpoint) 
     .setTitle("Exit?") 
     .setMessage("You are about to exit the Application. " + 
        "Do you really want to exit?") 
     .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       //Stop the activity 
       //maintenancetabs.this.finish(); 
       int pid = android.os.Process.myPid(); 
       android.os.Process.killProcess(pid); 
       } 
     }) 
     .setNegativeButton("No", null) 
     .show(); 
     return true; 
    }  else { 
     return super.onKeyDown(keyCode, event); 
    } 
} 
+0

+1 Grazie mille! Anche scritto in modo conciso. – AgentKnopf

+0

Questo non fa sorgere la domanda, mostra come uccidere l'app, non altre app. –

Problemi correlati