Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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.addPreferredActivity()?_Android_Android Sdk 2.1 - Fatal编程技术网

Android 如何使用PackageManager.addPreferredActivity()?

Android 如何使用PackageManager.addPreferredActivity()?,android,android-sdk-2.1,Android,Android Sdk 2.1,在SDK 1.5中,我使用PackageManager类使用PackageManager.addPackageToPreferred()将首选主屏幕设置为我的应用程序。在新的SDK(使用2.1)中,这已被弃用,因此我尝试使用addPreferredActivity()获得相同的结果,但它没有按预期工作 一些必要的背景。我正在编写一个锁屏替换应用程序,因此我希望主密钥启动我的应用程序(该应用程序将已经运行,因此具有禁用密钥的效果)。当用户“解锁”屏幕时,我打算恢复映射,以便一切正常 在我的Andr

在SDK 1.5中,我使用PackageManager类使用PackageManager.addPackageToPreferred()将首选主屏幕设置为我的应用程序。在新的SDK(使用2.1)中,这已被弃用,因此我尝试使用addPreferredActivity()获得相同的结果,但它没有按预期工作

一些必要的背景。我正在编写一个锁屏替换应用程序,因此我希望主密钥启动我的应用程序(该应用程序将已经运行,因此具有禁用密钥的效果)。当用户“解锁”屏幕时,我打算恢复映射,以便一切正常

在我的AndroidManifest.xml中,我有:

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
    <category android:name="android.intent.category.HOME"/>
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<uses-permission android:name="android.permission.SET_PREFERRED_APPLICATIONS">
</uses-permission>
由此产生的行为是,当我按下Home键时,应用程序选择器出现,这表明clearPackagePreferredActivities()调用工作,但我的应用程序没有作为首选添加。此外,下面日志中的第一行表示“出于意图而放弃首选活动”:

04-06 02:34:42.379:INFO/PackageManager(1017):结果集已更改,删除了Intent的首选活动{act=android.Intent.action.MAIN cat=[android.Intent.category.HOME]flg=0x10200000}类型null

04-06 02:34:42.379:INFO/ActivityManager(1017):开始活动:Intent{act=android.Intent.action.MAIN cat=[android.Intent.category.HOME]flg=0x10200000cmp=android/com.android.internal.app.ResolverActivity}


有人知道第一条日志消息是什么意思吗?也许我没有正确使用API,有什么想法吗?任何帮助都将不胜感激。

如果我将
组件
阵列初始化为设备上的所有家庭应用程序,这似乎对我有效:

ComponentName[] components = new ComponentName[]
{
   new ComponentName("com.intuitiveui.android", "com.intuitiveui.android.Friday"),
   new ComponentName("com.android.launcher2","com.android.launcher2.Launcher")
};

我的问题是如何动态地填充它。

@afonseca:我也在处理同样的问题。谢谢你的代码,我用它开始。也谢谢希蒙。我把他的答案和我的合并在一起。我已经让代码工作(在1.6和2.1更新1中)。它已经调整了一点,但2个主要的变化似乎是希蒙斯的建议和:“.Launcher”改为“com.android.Launcher.Launcher”。工作代码发布在下面

再见

PackageManager pm = getPackageManager();

IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.MAIN");
filter.addCategory("android.intent.category.HOME");
filter.addCategory("android.intent.category.DEFAULT");

Context context = getApplicationContext();
ComponentName component = new ComponentName(context.getPackageName(), TestReplaceHomeAppActivity.class.getName());

ComponentName[] components = new ComponentName[] {new ComponentName("com.android.launcher", "com.android.launcher.Launcher"), component};

pm.clearPackagePreferredActivities("com.android.launcher");
pm.addPreferredActivity(filter, IntentFilter.MATCH_CATEGORY_EMPTY, components, component);

addPreferredActivity在2.2中不再工作,clearPackagePreferredActivities仍然工作,但您只能清除运行此操作的包的首选项


android google群组上有很多关于这个问题的帖子,而且google的官方立场(目前)是不向您提供超越用户偏好的方法。

这个答案可能来得有点晚,但API文档称对于
clearPackagePreferredActivities

应用程序只能清除自己的包

因此,我认为在“恢复映射”中,您唯一能做的是:

getPackageManager().clearPackagePreferredActivities(getPackageName());

因此,清除主屏幕的默认设置。

关于该问题的详细信息。希望你得到你的答案。欢迎使用Stack Overflow。@Shimon:要动态获取已安装家庭应用程序的列表,您可能需要从PackageManager.QueryInputActivities(android.content.Intent,int)开始。祝你们好运,A罗纳斯。谢谢你们,回答得很好。我希望Android文档中有更多的例子,谢谢Matt和a2ronus。非常有用。根据Android文档,“addPreferredActivity”已被弃用。
getPackageManager().clearPackagePreferredActivities(getPackageName());