Nova 到底是如何做到这一点的?我实际上是在尝试做同样的事情:为用户提供一个按钮来清除并选择他们的新默认启动器。
我能够获取默认应用名称并显示它:
private String getPrefered(Intent i) {
PackageManager pm = this.getActivity().getPackageManager();
final ResolveInfo mInfo = pm.resolveActivity(i, 0);
return (String) pm.getApplicationLabel(mInfo.activityInfo.applicationInfo);
}
Intent i
在哪里
Intent home = new Intent("android.intent.action.MAIN");
home.addCategory("android.intent.category.HOME");
然后我调用系统ResolveActivity,
private void makePrefered() {
Intent selector = new Intent("android.intent.action.MAIN");
selector.addCategory("android.intent.category.HOME");
selector.setComponent(new ComponentName("android", "com.android.internal.app.ResolverActivity"));
startActivity(selector);
}
选择器出现并正常运行,但实际上并没有设置或清除任何值。在调试它时,似乎我错过了一些额外的东西?当我调用 makePrefered
方法时,我收到以下日志消息,
I/ActivityManager( 602): START {act=android.intent.action.MAIN cat=[android.intent.category.HOME] cmp=android/com.android.internal.app.ResolverActivity u=0} from pid 22641
当我使用 Nova 实现时,我看到了所有这些,
I/PackageManager( 602): Result set changed, dropping preferred activity for Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 (has extras) } type null
I/ActivityManager( 602): START {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 cmp=android/com.android.internal.app.ResolverActivity (has extras) u=0} from pid 22905
I/ActivityManager( 602): START {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 cmp=com.mycolorscreen.canvas/.Launcher (has extras) u=0} from pid 22905
- 我怎样才能进入那里并查看与该 bundle 一起发送的内容?
- 如何才能清除首选应用?不要告诉我你不能,我已经看过足够多的答案了。 Nova 做到了,而且完全按照我的意愿去做。
最佳答案
执行此操作的代码实际上只是一个非常聪明的解决方法。
当一个组件带有
<category android:name="android.intent.category.HOME" />
启用,通常从安装新的家庭应用程序开始,默认家庭应用程序会被清除。
通过像这样使用 home 组件创建一个空 Activity 来利用这一点。
<activity
android:name="com.t3hh4xx0r.haxlauncher.FakeHome"
android:enabled="false">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
当你想设置你的新默认值时,你启用这个组件,然后调用主 Intent 然后再次禁用你的假主页组件。
public static void makePrefered(Context c) {
PackageManager p = c.getPackageManager();
ComponentName cN = new ComponentName(c, FakeHome.class);
p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
Intent selector = new Intent(Intent.ACTION_MAIN);
selector.addCategory(Intent.CATEGORY_HOME);
c.startActivity(selector);
p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
}
最终结果是系统认为安装了新的家庭应用程序,因此清除默认设置,允许您设置您的没有特殊权限。
感谢来自 TeslaCoil 和 NovaLauncher 的 Kevin 提供有关如何完成此操作的信息!
关于java - 清除和设置默认家庭应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13167583/