需要权限
<uses-permission android:name="android.permission.SET_PREFERRED_APPLICATIONS" /> <uses-permission android:name="android.permission.FORCE_STOP_PACKAGES" />
且需在配置文件中添加android:sharedUserId="android.uid.system",并签名
签名方法参考https://blog.csdn.net/u010559573/article/details/102501458
private void switchLauncher(Context context,ComponentName activity) {
PackageManager pm = context.getPackageManager();
Log.d("YYY","switch launcher "+activity);
try {
Class<?> packageManager = Class.forName("android.content.pm.PackageManager");
Method replacePreferedActivity = packageManager.getMethod("replacePreferredActivity",IntentFilter.class,int.class,ComponentName[].class,ComponentName.class);
IntentFilter homeFilter = new IntentFilter(Intent.ACTION_MAIN);
homeFilter.addCategory(Intent.CATEGORY_HOME);
homeFilter.addCategory(Intent.CATEGORY_DEFAULT);
List<ResolveInfo> resolveInfos = new ArrayList<ResolveInfo>();
ComponentName curLauncher = listHomeActivitys(context,resolveInfos);
if(resolveInfos != null && resolveInfos.size() > 0) {
ComponentName[] componentNames = new ComponentName[resolveInfos.size()];
for(int i =0 ; i<resolveInfos.size();i++) {
ActivityInfo activityInfo = resolveInfos.get(i).activityInfo;
if(activityInfo != null) {
ComponentName cn = new ComponentName(activityInfo.packageName, activityInfo.name);
componentNames[i] = cn;
Log.d("YYY","launcher:"+cn);
}
}
replacePreferedActivity.setAccessible(true);
replacePreferedActivity.invoke(homeFilter,IntentFilter.MATCH_CATEGORY_EMPTY,componentNames,activity);
killPackage(context,curLauncher.getPackageName());
}else {
Log.e("YYY","get home resolve info empty");
}
} catch (Exception e) {
Log.e("YYY",""+e);
e.printStackTrace();
}
}
private ComponentName listHomeActivitys(Context context,List<ResolveInfo> outs){
PackageManager pm = context.getPackageManager();
Object cn = null;
try {
Class<?> packageManager = Class.forName("android.content.pm.PackageManager");
Method getHomeActivities = packageManager.getMethod("getHomeActivities",List.class);
getHomeActivities.setAccessible(true);
cn = getHomeActivities.invoke(pm,outs);
}catch (Exception e) {
Log.e("YYY",""+e);
e.printStackTrace();
}
return (ComponentName) cn;
}
private void killPackage(Context context,String pkg) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
am.killBackgroundProcesses(pkg);
}