Docs API PackageManager.DONT_KILL_APP powiedzieć:nieprzewidywalne zachowanie spowodowane PackageManager.DONT_KILL_APP
Bądź ostrożny, gdy ustawienie to od zmieniających stany elementów może sprawić zachowanie zawierającego aplikacji nieprzewidywalne.
Niestety, nie podają szczegółowo, co oznaczają nieprzewidywalne zachowanie.
W mojej aplikacji przełączam włączony stan działania. Pierwsza usługa umożliwia aktywność i zaczyna go:
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);
Jeśli (single-top) działalność rozpoczęła ponownie lub zniszczone ustawia się do diabled ponownie:
@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);
}
Normalnie wszystko działa poprawnie, ale czasami obiekty mają wartość NULL w onResume()
, które są tworzone w onCreate()
i nie są nigdzie dotykane. Nie mogłem zrekonstruować tego problemu w debugerze, ale dostaję wiele raportów o błędach z NullPointerExceptions w onResume()
, które są niemożliwe, jeśli onCreate()
był naprawdę nazywany wcześniej.
trywialny przykład na to:
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
...
}
Moje pytanie brzmi: Czy to może być nieprzewidywalne zachowanie PackageManager.DONT_KILL_APP
? A może ktoś ma inny pomysł, jak to się może stać?
Pamiętaj, że 'onDestroy' nie może zostać wywołane, zobacz: http://stackoverflow.com/a/19608985/562139. Zamiast tego przestawiłbym jakąkolwiek logikę konserwacji stanu na "onStop". – scorpiodawg