5

la documentazione API di PackageManager.DONT_KILL_APP dire:comportamenti imprevedibili causati da PackageManager.DONT_KILL_APP

Fare attenzione quando si imposta questo dato cambia stati dei componenti può rendere il comportamento della applicazione contenente imprevedibile.

Sfortunatamente non entrano nei dettagli cosa significano per comportamento imprevedibile.

Nella mia applicazione sto passando lo stato abilitato di un'attività. Prima un servizio consente l'attività e lo avvia:

getPackageManager().setComponentEnabledSetting(
    new ComponentName(MyService.this.getApplicationContext(), 
    MyActivity.class), 
    PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 
    PackageManager.DONT_KILL_APP); 

final Intent launchIntent = new Intent(context, MyActivity.class); 
    launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 
     | Intent.FLAG_ACTIVITY_CLEAR_TOP 
     | Intent.FLAG_ACTIVITY_SINGLE_TOP); 

context.startActivity(launchIntent); 

Se il (singolo-top) L'attività viene riavviata o distrutto si prefigge di diabled ancora:

@Override 
protected void onDestroy() { 
    log.d("ON DESTROY"); 
    super.onDestroy(); 
    getPackageManager().setComponentEnabledSetting(getComponentName(), 
     PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
     PackageManager.DONT_KILL_APP); 
} 

@Override 
protected void onNewIntent(Intent intent) { 
    if (someCondition) { 
     getPackageManager().setComponentEnabledSetting(getComponentName(), 
      PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
      PackageManager.DONT_KILL_APP); 

     Intent i = new Intent(); 
     i.setAction(Intent.ACTION_MAIN); 
     i.addCategory(Intent.CATEGORY_HOME); 
     startActivity(i); 

     finish(); 
     return; 
    } 

    super.onNewIntent(intent); 
} 

Normalmente tutto funziona bene, ma a volte gli oggetti sono nulli in onResume() creati in onCreate() e non vengono toccati da nessun'altra parte. Non sono stato in grado di ricostruire questo problema nel debugger, ma ricevo molte segnalazioni di bug con NullPointerExceptions in onResume() che sono impossibili se in realtà onCreate() è stato chiamato in precedenza.

Un esempio banale per questo è:

private String s; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ... 
    s = new String(""); 
    ... 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    ... 
    s.equals(""); // rarely causes NullPointerException 
    ... 
} 

La mia domanda è: Che sia forse il comportamento imprevedibile di PackageManager.DONT_KILL_APP? O qualcuno ha un'altra idea di come possa accadere?

+0

Ricordare che 'onDestroy' non è garantito per essere chiamato, consultare: http://stackoverflow.com/a/19608985/562139. Sposterei invece qualsiasi logica di mantenimento dello stato su 'onStop'. – scorpiodawg

risposta

0

Sì praticamente, benche non volete l'applicazione per essere ucciso, a volte il sistema ha bisogno di memoria e cestina alcuni oggetti. L'App stessa è ancora lì e invierà solo suResume() ma non ha tutti gli Oggetti creati in precedenza.

+1

Questo spiegherebbe i miei problemi. Sai se c'è qualche documentazione ufficiale su questo, o hai qualche link a informazioni di base che spiega questo comportamento? Se ciò è corretto, sarebbe utile creare gli oggetti in onResume anziché onCreate. Ci proverò, ma purtroppo dovrò aspettare la prossima versione per vedere se funziona, perché anche con test massicci il problema non è mai apparso sui miei dispositivi. –