Android设置或清除默认桌面
16lz
2022-05-27
配置桌面程序
打开应用选择器
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 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 );
使用此方法可以在未设置默认桌面程序的情况下可以直接设置默认桌面,无需跟用户进行交互,但是需要获取系统权限:
要获取系统权限就需要进行系统签名,系统签名可参考:https://blog.csdn.net/hwx865/article/details/72291792
清除默认桌面程序
public static void clearDefaultLauncher(Context context) { try { ArrayList intentList = new ArrayList(); ArrayList cnList = new ArrayList(); 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"字符串,该方法不需要获取系统权限。
更多相关文章
- android camera根据屏幕图像大小设置显示
- android Paint 设置线宽setStrokeWidth()的单位
- Android设置StatusBar颜色
- android 设置progressbar的背景颜色
- android下tcp之client测试
- android editText 自定义边框
- ANDROID画图PATH的使用
- android notification和notificationmanager使用
- android 视频播放器