【问题标题】:Unpredictable behaviour caused by PackageManager.DONT_KILL_APPPackageManager.DONT_KILL_APP 导致的不可预测的行为
【发布时间】:2013-02-04 08:10:47
【问题描述】:

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 的不可预测的行为吗?或者有没有人知道这是怎么发生的?

【问题讨论】:

标签: android nullpointerexception onresume android-package-managers


【解决方案1】:

是的,虽然您不希望应用程序被杀死,但有时系统需要内存并丢弃一些对象。应用程序本身仍然存在,只会调用 onResume() 但没有它之前创建的所有对象。

【讨论】:

  • 这可以解释我的问题。您是否知道是否有任何官方文档,或者您是否有任何指向解释此行为的背景信息的链接?如果这是正确的,它将有助于在 onResume 而不是 onCreate 中创建对象。我会试试这个,但遗憾的是我必须等待下一个版本才能看到它是否有效,因为即使经过大量测试,问题也从未出现在我的设备上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 1970-01-01
  • 2017-09-09
  • 2019-06-14
  • 2012-12-28
  • 2012-02-14
  • 1970-01-01
相关资源
最近更新 更多