В API Документов PackageManager.DONT_KILL_APP сказать:непредсказуемое поведение, вызванное PackageManager.DONT_KILL_APP
Будьте осторожны при установке этого, поскольку изменение состояния компонентов может сделать поведение объемлющего приложения непредсказуемы.
К сожалению, они не вдаваться в подробности, что они подразумевают под непредсказуемым поведением.
В моем приложении я переключаю включенное состояние активности. Первая услуга позволяет деятельность и запускает его:
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);
Если (один-топ) активности запускается снова или уничтожена она устанавливает себя diabled снова:
@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);
}
Обычно все работает отлично, но иногда объекты имеют нулевое значение в onResume()
, которые создаются в onCreate()
и не трогают нигде. Мне не удалось восстановить эту проблему в отладчике, но я получаю много сообщений об ошибках с помощью NullPointerExceptions в onResume()
, которые невозможны, если onCreate()
действительно был вызван ранее.
Тривиальный пример для этого:
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
...
}
Мой вопрос: Может ли это быть непредсказуемым поведением PackageManager.DONT_KILL_APP
? Или у кого-нибудь есть другая идея, как это может произойти?
Помните, что 'onDestroy' не может быть вызван, см. Http://stackoverflow.com/a/19608985/562139. Я бы переместил любую логику обслуживания состояния на 'onStop'. – scorpiodawg