android 的manageSpaceActivity引发的血案

时间:2022-09-20 07:30:12


前言:

看这篇文章首先要知道android:manageSpaceActivity 这个属性是什么。这个属性是在application时候定义的,这个属性指定了一个用于清除数据的Activity,这样一来开发者可以向用户指定开放那些数据用于清除,否则,默认情况是全部都会清除的。看看原文说明:

The fully qualified name of an Activity subclass that the system can launch to let users manage the memory occupied by the application on the device. The activity should also be declared with an element.

前几天手机出现一个BUG(具体描述如下):

进入“应用程序”,然后从应用程序列表中选择一个进入 到该应用程序信息。会发现有些应用程序是有“启用、停用”的按钮,并且下面还有一个“管理空间”按钮。当你在这里选择“停用”按钮后,如果你再选择下面的“管理空间”按钮,就会出现停止运行。打开LOG信息你会发现如下的报错(这里我用内置的“百度浏览器”来做分析):

01-01 00:02:54.016: D/dalvikvm(1021): GC_FOR_ALLOC freed 1293K, 11% free 11946K/13284K, paused 26ms, total 26ms
01-01 00:02:54.017: E/AndroidRuntime(1021): FATAL EXCEPTION: main
01-01 00:02:54.017: E/AndroidRuntime(1021): android.content.ActivityNotFoundException: Unable to find explicit activity class {com.baidu.browser.apps/com.baidu.browser.settings.BdManageSpaceActivity}; have you declared this activity in your AndroidManifest.xml?
01-01 00:02:54.017: E/AndroidRuntime(1021): at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1627)

从上面的报错信息可以明确的知道:系统调用了一个无法找到的Activity,还建议你去确认一下是否在这个app的AndroidManifest.xml是否有配置。从这个报错信息可以很快知道这样的结果:“百度浏览器”这个APP肯定有问题,具体的说应该是这个APP的这个Activity:BdManageSpaceActivity存在问题,要么没有注册、要么没有注册对,要么这个Activity就不存在等。不过,我要说的是:事实并非如此!

要找到问题,首先去确认一下“百度浏览器”这个APP的BdManageSpaceActivity是否OK。让人大跌眼镜的是:AndroidManifest.xml里面定义是OK的,BdManageSpaceActivity.java也是没有问题的。下面是BdManageSpaceActivity在AndroidManifest.xml中的申明:

?
1 </application>
?
1  
?
1 </activity>
这样一来“百度浏览器”确实是OK的,其实分析到这里,我就明白了一些道理:一开始怀疑“百度浏览器”有问题是因为上面的报错信息,这个报错信息误导了我,其实早该想到“百度浏览器”是没有问题的,因为出现“停止运行”的情况是在别的APP经过不同寻常的操作而照成的,而一般的正常操作是OK的,既然正常操作的“百度浏览器”的BdManageSpaceActivity这个Activity能够正常启用,那么就已经说明“百度浏览器”的BdManageSpaceActivity是没有问题的。

好了,我们来分析第二步:看看设置里面的“应用管理”这个APP到底在“停用”这个“百度浏览器”做了些什么?

?
1 mPm.setApplicationEnabledSetting(mInfo.packageName, mState,
0);
这里的 mState = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT , 这样一来这个APP就被停用了,在Luncher里面都没有了,而且这个APP的一切活动都将被终止。 也因此通过“管理空间”去调用这个被停用的APP的一个Activity是不可能找得到的。