不可预知的行为PackageManager.DONT_KILL_APP的API文档说:造成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()
中创建且在其他任何地方都未触及。我无法在调试器中重新构建这个问题,但是如果onCreate()
之前真的被调用过,那么我在onResume()
中得到了许多带有NullPointerExceptions的bug报告,这是不可能的。
一个简单的例子这是:
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 2016-12-22 20:40:33