19

在 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>

在我的代码中,我有以下代码段:

// Set as home activity
// This is done so we can appear to disable the Home key.
PackageManager pm = getPackageManager();
//pm.addPackageToPreferred(getPackageName());
    
IntentFilter filter = new IntentFilter("android.intent.action.MAIN");
filter.addCategory("android.intent.category.HOME");
filter.addCategory("android.intent.category.DEFAULT");
    
ComponentName[] components = new ComponentName[] 
{
    new ComponentName("com.android.launcher", ".Launcher")
};
    
Context context = getApplicationContext();
ComponentName component = new ComponentName(context.getPackageName(),
MyApp.class.getName());
    
pm.clearPackagePreferredActivities("com.android.launcher");
pm.addPreferredActivity(filter, IntentFilter.MATCH_CATEGORY_EMPTY,
components, component);

结果行为是当我按下 Home 键时应用程序选择器出现,这表明 clearPackagePreferredActivities() 调用有效,但我的应用程序没有被添加为首选。此外,下面日志中的第一行说明了“放弃 Intent 的首选活动”:

04-06 02:34:42.379: INFO/PackageManager(1017): 结果集已更改,放弃 Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 } 的首选活动输入空

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

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

4

4 回答 4

11

@afonseca:我正在处理同样的问题。感谢您的代码,我用它开始。还要感谢西蒙。我将他的答案合并到我的。我已经让代码工作了(在 1.6 和 2.1 更新 1 上)。它进行了一些调整,但 2 个主要变化似乎是 Shimons 的建议,并且:“.Launcher”已更改为“com.android.launcher.Launcher”。工作代码发布在下面。

Ciao,a2ronus

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);
于 2010-05-07T13:16:35.700 回答
4

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

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

所以,我认为在“恢复映射”中,你唯一能做的就是:

getPackageManager().clearPackagePreferredActivities(getPackageName());

等清除 HOME 屏幕的默认设置。

于 2013-04-27T02:32:41.547 回答
2

components如果我将数组初始化为设备上的应用程序,这似乎对我有用ALL HOME

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

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

于 2010-05-06T06:27:06.120 回答
1

addPreferredActivity 在 2.2 中不再起作用, clearPackagePreferredActivities 仍然有效,但您只能清除运行此程序包的首选项。

android google groups 上有很多关于这个问题的帖子,而且 google 的官方立场(目前)不会为您提供覆盖用户偏好的方法。

于 2010-10-19T13:29:11.607 回答