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?
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