PackageManager.DONT_KILL_APP导致的不可预测的行为



PackageManager.DONT_KILL_APP的API文档说:

设置此选项时要小心,因为更改组件状态会使包含的应用程序的行为变得不可预测。

不幸的是,他们没有详细说明他们所说的不可预测的行为是什么意思。

在我的应用程序中,我正在切换活动的启用状态。首先,服务启用活动并启动它:

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);

如果(单顶)活动再次启动或被破坏,它将再次设置为禁用:

@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()中创建的,在其他任何地方都没有接触。我无法在调试器中重建这个问题,但我在onResume()中收到了许多NullPointerExceptions的错误报告,如果以前真的调用了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不可预测的行为吗?或者有人知道这是怎么发生的吗?

是的,尽管你不想让应用程序被杀死,但有时系统需要内存并破坏一些对象。应用程序本身仍然存在,只会调用onResume(),但没有它之前创建的所有对象。

相关内容

  • 没有找到相关文章

最新更新