5

不可预知的行为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难以预料的行为?还是有人有另一个想法如何发生?

+0

记住'onDestroy'不保证被调用,请参阅:http://stackoverflow.com/a/19608985/562139。相反,我会将任何状态维护逻辑移动到“onStop”。 – scorpiodawg 2016-12-22 20:40:33

回答

0

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

+1

这会解释我的问题。你知道有没有关于这方面的官方文档,或者你有任何链接到解释这种行为的背景信息?如果这是正确的,它将有助于在onResume而不是onCreate中创建对象。我会尝试这一点,但遗憾的是,我不得不等待下一个版本的发布,看看它是否可行,因为即使进行大规模测试,问题也不会出现在我的设备上。 – 2013-02-19 15:52:15