Die API-Dokumentation von PackageManager.DONT_KILL_APP sagen:Unpredictable Verhalten verursacht durch PackageManager.DONT_KILL_APP
Seien Sie vorsichtig, wenn Sie diesen Satz seit Komponentenstatus zu ändern können die Anwendung enthält das Verhalten unvorhersehbar machen.
Leider gehen sie nicht ins Detail, was sie mit unvorhersehbarem Verhalten meinen.
In meiner Anwendung wechseln ich den aktivierten Status einer Aktivität. Zunächst wird ein Dienst ermöglicht es, die Aktivität und es beginnt:
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);
Wenn die (single-top) Aktivität wieder gestartet wird oder zerstört sie sich wieder auf diabled setzt:
@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);
}
Normalerweise alles funktioniert gut, aber Manchmal sind Objekte in onResume()
null, die in onCreate()
erstellt und nirgendwo anders berührt werden. Ich war nicht in der Lage, dieses Problem im Debugger zu rekonstruieren, aber ich bekomme viele Fehlerberichte mit NullPointerExceptions in onResume()
, die unmöglich sind, wenn onCreate()
wirklich vorher aufgerufen wurde.
Ein triviales Beispiel hierfür ist:
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
...
}
Meine Frage ist: Das ist das das unberechenbare Verhalten von PackageManager.DONT_KILL_APP
werden kann? Oder hat jemand eine andere Idee, wie das passieren kann?
Denken Sie daran, 'onDestroy' kann nicht garantiert aufgerufen werden, siehe: http://StackOverflow.com/a/19608985/562139. Ich würde stattdessen jede Zustandsverwaltungslogik auf "onStop" verschieben. – scorpiodawg