Android: change default Home Application

前端 未结 4 1213
悲&欢浪女
悲&欢浪女 2020-11-29 02:09

for some specific requirement I am required to change Android Default Home application with my customized Home application ( a setting inside my app that will toggle default

4条回答
  •  萌比男神i
    2020-11-29 02:51

    This code works on my ICS device: I use a service that is sensible to some call, one of them is called SET_PREFERRED_LAUNCHER, the put in a bundle your new default Launcher package (PREFERRED_PACKAGE_KEY) and it's activity (PREFERRED_ACTIVITY_KEY)

    Method installPackageMethod = null;
    Method deletePackageMethod = null;
    Method setPreferredActivityMethod = null;
    Method replacePreferredActivityMethod = null;
    Object pm = null;
    
    
        @Override
    public void onCreate() {
        super.onCreate();
            if (pm == null)
            pm = getPackageManager();
        try {
            if (setPreferredActivityMethod == null)
                setPreferredActivityMethod = pm.getClass().getMethod(
                        "addPreferredActivity", IntentFilter.class, int.class,
                        ComponentName[].class, ComponentName.class);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
    
    
    private final class ServiceHandler extends Handler {
        private Context context;
    
        public ServiceHandler(Looper looper, Context ctx) {
            super(looper);
            context = ctx;
        }
    
        @Override
        public void handleMessage(Message msg) {
            Intent intent = (Intent) msg.getData().getParcelable(
                    UPDATER_SERVICE_ACTION);
            int request = intent.getIntExtra(
                    REQUEST_KEY,
                    REQUEST_UNKNOWN);
            Bundle bundle = intent.getExtras();
    
            switch (request) {
            case INSTALL_APPLICATION: {
                if (bundle != null) {
                    String appPath = bundle
                            .getString(APP_PATH_KEY);
                    if (appPath != null) {
                        LogUtil.e(TAG, "try to install " + appPath);
    
                        try {
                            am.installPackage(appPath);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
    
                        LogUtil.e(TAG, "install of " + appPath + " done");
                    }
                }
                break;
            }
            case UNISTALL_PACKAGE: {
                if (bundle != null) {
                    String packagename = bundle
                            .getString(PACKAGE_NAME_KEY);
                    if (packagename != null) {
                        LogUtil.e(TAG, "unistall " + packagename);
    
                        try {
                            deletePackageMethod
                                    .invoke(pm, packagename, null, 0);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
                break;
            }
            case SET_PREFERRED_LAUNCHER: {
                if (bundle != null) {
                    String package_name = bundle
                            .getString(PREFERRED_PACKAGE_KEY);
                    if (package_name == null) {
                        LogUtil.e(TAG,
                                "WARNING: setDefaultActivity cannot continue, package is NULL");
                        return;
                    }
                    String activity_name = bundle
                            .getString(PREFERRED_ACTIVITY_KEY);
                    if (activity_name == null) {
                        LogUtil.e(TAG,
                                "WARNING: setDefaultActivity cannot continue, activity is NULL");
                        return;
                    }
    
                    LogUtil.e(TAG, "setDefaultActivity activity="
                            + activity_name + " package=" + package_name);
    
                    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",
                                    "com.android.launcher2.Launcher"),
                            new ComponentName(package_name, activity_name) };
                    ComponentName activity = new ComponentName(package_name,
                            activity_name);
                    try {
                        setPreferredActivityMethod.invoke(pm, filter,
                                IntentFilter.MATCH_CATEGORY_EMPTY, components,
                                activity);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
            }
    
        }
    
    }
    

    Remember to add in your manifest file this permission:

        
    

    Usage:

        public void setPreferredLauncher(String activity_name,String package_name)
    {
        Intent intent = new Intent(UPDATER_SERVICE_ACTION);
        intent.putExtra(REQUEST_KEY, SET_PREFERRED_LAUNCHER);
        intent.putExtra(PREFERRED_ACTIVITY_KEY, activity_name);
        intent.putExtra(PREFERRED_PACKAGE_KEY, package_name);
        context.startService(intent);
    }
    

    where:

        public static final String _UPDATER_SERVICE_ACTION = "com.android.updaterservice.ACTION";
    public static final String REQUEST_KEY = "com.android.updaterservice.REQUEST_KEY";
    public static final String PACKAGE_NAME_KEY = "com.android.updaterservice.PACKAGE_NAME_KEY";
    public static final String APP_PATH_KEY = "com.android.updaterservice.APP_PATH_KEY";
    public static final String PREFERRED_ACTIVITY_KEY = "com.android.updaterservice.PREFERRED_ACTIVITY_KEY";
    public static final String PREFERRED_PACKAGE_KEY = "com.android.updaterservice.PREFERRED_PACKAGE_KEY";
    public static final String INSTALL_PACKAGE_RESULT = "com.android.updaterservice.INSTALL_PACKAGE_RESULT";
    public static final String PACKAGE_NAME = "PACKAGE_NAME";
    public static final String INSTALL_SUCCEEDED = "INSTALL_SUCCEEDED";
    public static final int REQUEST_UNKNOWN = -1;
    public static final int INSTALL_APPLICATION = 1;
    public static final int UNISTALL_PACKAGE = 2;
    public static final int SET_PREFERRED_LAUNCHER = 3;
    

提交回复
热议问题