版权声明:本文为CSDN博主「奉君逍遥」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hwx865/java/article/details/88311855
配置桌面程序
<activity android:name=".ui.main.MainActivity">
<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>
</activity>
打开应用选择器
public static void openResolverLauncher(Context context) {
// 华为手机上
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setComponent(new ComponentName("com.huawei.android.internal.app", "com.huawei.android.internal.app.HwResolverActivity"));
context.startActivity(intent);
// 大部分手机上
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setClassName("android", "com.android.internal.app.ResolverActivity");
context.startActivity(intent);
}
跳转打开应用选择器,根据仅此一次或总是两种结果选择需要打开的桌面选择器,当使用仅此一次打开桌面时,默认的桌面程序并未被设置,下次按HOME键还会弹出应用选择器选择要打开的桌面程序。该方法如果用在无人值守终端设备上并不是很友好,重启后弹出应用选择器将无法启动终端程序。
设置默认桌面程序
public static void setDefaultLauncher(Context context, String defPackageName, String defClassName) {
try {
if (!TextUtils.isEmpty(defPackageName) && !TextUtils.isEmpty(defClassName)) {
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.MAIN");
filter.addCategory("android.intent.category.HOME");
filter.addCategory("android.intent.category.DEFAULT");
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
// 返回给定条件的所有ResolveInfo对象(本质上是Activity)
List<ResolveInfo> list = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
int bestMatch = 0;
final int size = list.size();
ComponentName[] set = new ComponentName[size];
for (int i = 0; i < size; i++) {
ResolveInfo ri = list.get(i);
set[i] = new ComponentName(ri.activityInfo.packageName, ri.activityInfo.name);
if (ri.match > bestMatch) {
bestMatch = ri.match;
}
}
ComponentName preActivity = new ComponentName(defPackageName, defClassName);
context.getPackageManager().addPreferredActivity(filter, bestMatch, set, preActivity);
}
} catch (java.lang.SecurityException e) {
e.printStackTrace();
}
}
调用如下:
String defPackageName = "com.demo";
String defClassName = "com.demo.ui.main.MainActivity";
setDefaultLauncher(context, defPackageName, defClassName );
使用此方法可以在未设置默认桌面程序的情况下可以直接设置默认桌面,无需跟用户进行交互,但是需要获取系统权限:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.demo"
android:sharedUserId="android.uid.system">
<uses-permission android:name="android.permission.SET_PREFERRED_APPLICATIONS" />
要获取系统权限就需要进行系统签名,系统签名可参考:https://blog.csdn.net/hwx865/article/details/72291792
清除默认桌面程序
public static void clearDefaultLauncher(Context context) {
try {
ArrayList<IntentFilter> intentList = new ArrayList<IntentFilter>();
ArrayList<ComponentName> cnList = new ArrayList<ComponentName>();
context.getPackageManager().getPreferredActivities(intentList, cnList, null);
for (int i = 0; i < cnList.size(); i++) {
IntentFilter dhIF = intentList.get(i);
if (dhIF.hasAction(Intent.ACTION_MAIN) && dhIF.hasCategory(Intent.CATEGORY_HOME)) {
//清除原有的默认launcher
context.getPackageManager().clearPackagePreferredActivities(cnList.get(i).getPackageName());
}
}
} catch (java.lang.SecurityException e) {
e.printStackTrace();
}
}
使用该方法清除默认桌面程序后方可设置默认桌面程序,调用该方法同样需要获取系统权限。
判断是否默认桌面程序
public static boolean isDefaultLauncher(Context context) {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory("android.intent.category.HOME");
intent.addCategory("android.intent.category.DEFAULT");
PackageManager pm = context.getPackageManager();
ResolveInfo info = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
boolean isDefault = context.getPackageName().equals(info.activityInfo.packageName);
return isDefault;
}
用于判断当前程序是否是默认桌面程序,如果设置了默认桌面程序info.activityInfo.packageName获取的是包名,如未设置默认桌面程序返回的是“android”字符串,该方法不需要获取系统权限。