我如何使用PackageManager.addPreferredActivity()?

时间:2010-04-06 10:02:57

标签: android android-sdk-2.1

在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}输入null

     

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 个答案:

答案 0 :(得分:11)

@afonseca:我正在处理同样的问题。感谢您的代码,我用它来开始。还要感谢Shimon。我将他的答案合并到了我的脑海里。我已经有了代码工作(1.6和2.1更新1)。它已被调整了一点,但主要的变化似乎是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);

答案 1 :(得分:4)

这个答案有点晚,但API文档对clearPackagePreferredActivities说:

  

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

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

getPackageManager().clearPackagePreferredActivities(getPackageName());

然后清除HOME画面的默认设置。

答案 2 :(得分: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")
};

我的问题是如何动态填写此内容。

答案 3 :(得分:1)

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

Android google网上有很多关于这个问题的帖子和谷歌的官方立场(目前)没有为你提供超越用户偏好的方法。