设置default Launcher


系统有多个Launcher时,会在packages.xml 设置如下信息:


/data/system/packages.xml















如何在启动时自动设置default Launcher呢?

方法一:
在PackageManagerService构造函数中,会读取packages.xml文件:mRestoredSettings = mSettings.readLPw();
所以在之前添加设置:


readPermissions();
            
String firstBoot = SystemProperties.get("persist.sys.preactivity"); 
if ("0".equals(firstBoot)) {
    addPreferredActivityForULauncher();
}
SystemProperties.set("persist.sys.preactivity", "1");


mRestoredSettings = mSettings.readLPw();


private void addPreferredActivityForULauncher() {
    IntentFilter filter = new IntentFilter();
    filter.addAction("android.intent.action.MAIN");
    filter.addCategory("android.intent.category.HOME"); 
    filter.addCategory("android.intent.category.DEFAULT");
    ComponentName preActivity = new ComponentName("com.android.ulauncher", "com.android.ulauncher.Launcher"); 
    ComponentName[] set = new ComponentName[] {new ComponentName("com.android.launcher", "com.android.launcher2.Launcher"), preActivity}; 
    mSettings.mPreferredActivities.addFilter(
            new PreferredActivity(filter, IntentFilter.MATCH_CATEGORY_EMPTY, set, preActivity));
    scheduleWriteSettingsLocked();
}

方法二:

在ActivityManagerService 


 boolean startHomeActivityLocked() {
        
        /* launch the defualt launcher when the system boots for the first time */
setDefaultLauncher();

...

}

private void setDefaultLauncher(){    // get default component    String  packageName = SystemProperties.get("ro.sw.defaultlauncherpackage", "no");    String  className = SystemProperties.get("ro.sw.defaultlauncherclass", "no");    Slog.i(TAG, "defautl packageName = " + packageName + ", default className = " + className);    if(!packageName.equals("no") && !className.equals("no")){        boolean firstLaunch = SystemProperties.getBoolean("persist.sys.sw.firstLaunch", true);        Slog.d(TAG, "firstLaunch = " + firstLaunch);        if(firstLaunch){            mFirstLaunch = true;                // do this only for the first boot                 SystemProperties.set("persist.sys.sw.firstLaunch", "false");            }            Slog.d(TAG, "mFirstLaunch = " + mFirstLaunch);        if(mFirstLaunch){        IPackageManager pm = ActivityThread.getPackageManager();                                //clear the current preferred launcher        ArrayList intentList = new ArrayList();        ArrayList cnList = new ArrayList();        mContext.getPackageManager().getPreferredActivities(intentList, cnList, null);        IntentFilter dhIF;        for(int i = 0; i < cnList.size(); i++)        {        dhIF = intentList.get(i);        if(dhIF.hasAction(Intent.ACTION_MAIN) &&        dhIF.hasCategory(Intent.CATEGORY_HOME))         {        mContext.getPackageManager().clearPackagePreferredActivities(cnList.get(i).getPackageName());        }        }                                // get all Launcher activities        Intent intent = new Intent(Intent.ACTION_MAIN);        intent.addCategory(Intent.CATEGORY_HOME);        List list = new ArrayList();        try         {        list = pm.queryIntentActivities(intent,                        intent.resolveTypeIfNeeded(mContext.getContentResolver()),                        PackageManager.MATCH_DEFAULT_ONLY);        }catch (RemoteException e) {                    throw new RuntimeException("Package manager has died", e);                }                 // get all components and the best match        IntentFilter filter = new IntentFilter();        filter.addAction(Intent.ACTION_MAIN);        filter.addCategory(Intent.CATEGORY_HOME);        filter.addCategory(Intent.CATEGORY_DEFAULT);        final int N = list.size();                ComponentName[] set = new ComponentName[N];                int bestMatch = 0;        for (int i = 0; i < N; i++)        {        ResolveInfo r = list.get(i);        set[i] = new ComponentName(r.activityInfo.packageName,                                    r.activityInfo.name);        if (r.match > bestMatch) bestMatch = r.match;        }        // add the default launcher as the preferred launcher        ComponentName launcher = new ComponentName(packageName, className);        try         {        pm.addPreferredActivity(filter, bestMatch, set, launcher);        } catch (RemoteException e) {                    throw new RuntimeException("Package manager has died", e);                }             }    }}

更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. android 编译学习
  6. Android通知栏学习(基础篇)
  7. Android开发常用命令行
  8. Android(安卓)Service 启动流程
  9. Android学习笔记之获得屏幕属性DisplayMetrics

随机推荐

  1. android:layout_weight的真实含义
  2. Android碎片化问题 java.lang.NoClassDef
  3. Android中两种设置全屏的方法 && Android
  4. android studio 怎么取消默认AppcompatAc
  5. listview 左滑弹出删除按钮,需要折腾一下
  6. Android样式——Styles
  7. Android(安卓)Recovery的汉化 显示中文
  8. Android(安卓)Service用法讲解与实例
  9. Android开发学习之设置Android壁纸的功能
  10. Linux下Android内核源码下载