Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android PackageManager.DONT_KILL_应用程序导致的不可预测行为_Android_Nullpointerexception_Onresume_Android Package Managers - Fatal编程技术网

Android PackageManager.DONT_KILL_应用程序导致的不可预测行为

Android PackageManager.DONT_KILL_应用程序导致的不可预测行为,android,nullpointerexception,onresume,android-package-managers,Android,Nullpointerexception,Onresume,Android Package Managers,API文档说明: 设置此选项时要小心,因为更改组件状态会使包含应用程序的行为不可预测 不幸的是,他们没有详细说明他们所说的不可预测的行为是什么意思 在我的应用程序中,我正在切换活动的启用状态。首先,服务启用活动并启动它: getPackageManager().setComponentEnabledSetting( 新组件名称(MyService.this.getApplicationContext(), MyActivity.class), PackageManager.COMPONENT\u

API文档说明:

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

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

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

getPackageManager().setComponentEnabledSetting(
新组件名称(MyService.this.getApplicationContext(),
MyActivity.class),
PackageManager.COMPONENT\u ENABLED\u STATE\u ENABLED,
PackageManager.Don_KILL_APP);
最终意图启动意图=新意图(上下文,MyActivity.class);
launchIntent.setFlags(Intent.FLAG\u活动\u新任务
|Intent.FLAG\u活动\u清除\u顶部
|意图。标记活动(单个顶部);
背景。startActivity(launchIntent);
如果(单顶)活动再次启动或被销毁,它会再次将自身设置为diabled:

@覆盖
受保护的空onDestroy(){
日志d(“销毁时”);
super.ondestory();
getPackageManager().setComponentEnabledSetting(getComponentName(),
PackageManager.COMPONENT\u已启用\u状态\u已禁用,
PackageManager.Don_KILL_APP);
}
@凌驾
受保护的void onNewIntent(意图){
如果(某些条件){
getPackageManager().setComponentEnabledSetting(getComponentName(),
PackageManager.COMPONENT\u已启用\u状态\u已禁用,
PackageManager.Don_KILL_APP);
意图i=新意图();
i、 设置动作(意图、动作和主);
i、 添加类别(意图、类别和主页);
星触觉(i);
完成();
返回;
}
super.onNewIntent(意向);
}
正常情况下,一切正常,但有时在
onResume()
中创建的对象在
onCreate()
中是空的,在其他任何地方都不会触及。我无法在调试器中重建此问题,但我在
onResume()
中获得了许多带有NullPointerException的错误报告,如果以前确实调用了
onCreate()
,则这些错误报告是不可能的

一个简单的例子是:

私有字符串s;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
...
s=新字符串(“”);
...
}
@凌驾
受保护的void onResume(){
super.onResume();
...
s、 等于(“”;//很少导致NullPointerException
...
}

我的问题是:这是否是PackageManager.DONT_KILL_APP的不可预测行为?或者有人知道这是怎么发生的吗?

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

这可以解释我的问题。你知道是否有任何关于这方面的官方文件,或者你有任何解释这种行为的背景信息链接吗?如果这是正确的,将有助于在onResume而不是onCreate中创建对象。我将尝试此方法,但遗憾的是,我将不得不等待下一个版本,以查看它是否有效,因为即使进行了大量测试,问题也从未出现在我的设备上。请记住,
onDestroy
不能保证被调用,请参阅:。我会将任何状态维护逻辑移到
onStop