android 系统存在多个Launcher时,设置开机自动进入默认的Launcher

开机完成并解锁后,如果android系统存在多个Launcher,系统会弹出一个选择框让用户选择进入某个Launcher。如果用户不想选择,而是想直接进入某一个默认的Launcher,要怎么修改?
注意:此修改方法对Google Now Launcher(GoogleHome.apk)无效,因为此APP启动Activity的<intent-filter>中无<category android:name="android.intent.category.HOME" />这个选项。
 
下面以设置Google Launcher2作为默认启动的Launcher为例,
其package name 为 com.android.launcher
launcher activity name 为 com.android.launcher2.Launcher


1、请在PackageManagerService.java中的systemReady函数的最后中增加以下代码。
     if(isFirstBoot())
        {
   //ADD BEGIN 
    String examplePackageName = "com.android.launcher";  //请修改为需要设置的 package name
    String exampleActivityName = "com.android.launcher2.Launcher"; //请修改为需要设置的 launcher activity name  
    Intent intent=new Intent(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    final int callingUserId = UserHandle.getCallingUserId();
    
    List<ResolveInfo> resolveInfoList = queryIntentActivities(intent,null, PackageManager.GET_META_DATA,callingUserId);
    if(resolveInfoList != null){
      int size = resolveInfoList.size();
      for(int j=0;j<size;){
        final ResolveInfo r = resolveInfoList.get(j);
        if(!r.activityInfo.packageName.equals(examplePackageName)){ 
         resolveInfoList.remove(j);
         size -= 1;
      }else
      {
        j++;
      }
      }
      ComponentName[] set = new ComponentName[size];
      ComponentName defaultLauncher=new ComponentName(examplePackageName, exampleActivityName);
      int defaultMatch=0;
      for(int i=0;i<size;i++){
        final ResolveInfo resolveInfo = resolveInfoList.get(i);
        Log.d(TAG, resolveInfo.toString());
        set[i] = new ComponentName(resolveInfo.activityInfo.packageName,resolveInfo.activityInfo.name);
        if(defaultLauncher.getClassName().equals(resolveInfo.activityInfo.name)){
         defaultMatch = resolveInfo.match;
        }
      }
      Slog.e(TAG,"defaultMatch="+Integer.toHexString(defaultMatch));
      IntentFilter filter=new IntentFilter();
      filter.addAction(Intent.ACTION_MAIN);
      filter.addCategory(Intent.CATEGORY_HOME);
      filter.addCategory(Intent.CATEGORY_DEFAULT);
      
      addPreferredActivity2(filter, defaultMatch, set, defaultLauncher);
    }
    //ADD END
  }
2.在PackageManagerService.java中增加addPreferredActivity2函数。
public void addPreferredActivity2(IntentFilter filter, int match,
    ComponentName[] set, ComponentName activity) {
   Log.d("debug_default","addPreferredActivity2 is called.");
   // writer
   synchronized (mPackages) {     
       Slog.i(TAG, "Adding preferred activity " + activity + ":");
       filter.dump(new LogPrinter(Log.INFO, TAG), "  ");
       mSettings.editPreferredActivitiesLPw(0).addFilter(
            new PreferredActivity(filter, match, set, activity, true));
       scheduleWriteSettingsLocked();     
   }
  }
3.修改PackageManagerService.java的函数findPreferredActivity
    
   (1) 对原来的removeMatches 增加判断条件,在launcher时不remove
      if(!(intent.getAction() != null && intent.getAction().equals(intent.ACTION_MAIN) && intent.getCategories()!=null && intent.getCategories().contains(intent.CATEGORY_HOME))) { //ADD          
       Slog.d(TAG,"launcher");      
      }else {
            if (removeMatches) {
                pir.removeFilter(pa);
                if (DEBUG_PREFERRED) {
                    Slog.v(TAG, "Removing match " + pa.mPref.mComponent);
                }
                 break;
            }
       }
(2)
                        if (always && !pa.mPref.sameSet(query, priority)) {
                            Slog.i(TAG, "Result set changed, dropping preferred activity for "
                                    + intent + " type " + resolvedType);
                            if (DEBUG_PREFERRED) {
                                Slog.v(TAG, "Removing preferred activity since set changed "
                                        + pa.mPref.mComponent);
                            }
                            pir.removeFilter(pa);
                            // Re-add the filter as a "last chosen" entry (!always)
                            PreferredActivity lastChosen = new PreferredActivity(
                                    pa, pa.mPref.mMatch, null, pa.mPref.mComponent, false);
                            pir.addFilter(lastChosen);
                            mSettings.writePackageRestrictionsLPr(userId);
                            return null;
                        }
上面这段修改为下面的内容:
                        if (always && !pa.mPref.sameSet(query, priority)) {
                           
       if(!(intent.getAction() != null && intent.getAction().equals(intent.ACTION_MAIN) && intent.getCategories()!=null && 
       
           intent.getCategories().contains(intent.CATEGORY_HOME))) { //ADD
        Slog.i(TAG, "Result set changed, dropping preferred activity for "
                                    + intent + " type " + resolvedType);
                            if (DEBUG_PREFERRED) {
                                Slog.v(TAG, "Removing preferred activity since set changed "
                                        + pa.mPref.mComponent);
                            }
       pir.removeFilter(pa);
       
                            // Re-add the filter as a "last chosen" entry (!always)
                            PreferredActivity lastChosen = new PreferredActivity(
                                    pa, pa.mPref.mMatch, null, pa.mPref.mComponent, false);
                            pir.addFilter(lastChosen);
                            mSettings.writePackageRestrictionsLPr(userId);
                            return null;
       }
                        }
      Slog.i(TAG,"Result set not change, not drop preferred activity for special intent: "+intent);//ADD
                        // Yay! Either the set matched or we're looking for the last chosen




JB系列findPreferredActivity略有调整,见下面:
修改 packageManagerService.java (framework/base/services/java/com/android/server/pm/)的findPreferredActivity方法,将此方法比较靠后的一段代码:
if (!pa.mPref.sameSet(query, priority)) {
    Slog.i(TAG, "Result set changed, dropping preferred activity for " + intent + " type " + resolvedType);
    pir.removeFilter(pa); 
    return null;
}
 
修改为:
if (!pa.mPref.sameSet(query, priority)) {
    if(!(intent.getAction() != null && intent.getAction().equals(intent.ACTION_MAIN) && intent.getCategories()!=null &&
        intent.getCategories().contains(intent.CATEGORY_HOME)))  { //ADD
        Slog.i(TAG, "Result set changed, dropping preferred activity for "+ intent + " type " + resolvedType);
        pir.removeFilter(pa); 
        return null;
    } //ADD
    Slog.i(TAG,"Result set not change, not drop preferred activity for special intent: "+intent);//ADD
}
 
如果用户在设置->应用程序->管理应用程序->所有应用程序列表,找到之前设置的默认Launcher,并取消了默认值,系统会重新弹出launcher选择框。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android设备的默认launcher设置是指系统默认的启动器(Launcher)应用程序。启动器是用户在设备上看到和操作的主屏幕,它提供了桌面、应用程序列表、小部件和壁纸等功能。 在Android设备上,不同的制造商可能会有不同的默认启动器设置,例如Samsung可能会有自己的启动器样式,而Google的Pixel设备则使用原生的Android启动器。 默认启动器有以下几个主要特点和功能: 1. 桌面:默认启动器会在设备主屏幕上显示桌面,用户可以在桌面上添加和管理应用程序、小部件和快捷方式等。 2. 应用程序列表:用户可以通过默认启动器访问设备上安装的所有应用程序的列表,并进行搜索和排序。 3. 小部件:默认启动器支持用户在桌面上添加各种小部件,例如天气、日历、音乐播放器等,以便用户更方便地获取相关信息。 4. 壁纸:默认启动器还允许用户更改桌面背景壁纸,可以选择自己喜欢的图片或者使用系统提供的预设壁纸。 对于用户来说,选择适合自己的默认启动器可以增加使用Android设备的个性化和便利性。用户可以根据自己的需求和偏好,选择不同功能和样式的启动器来进行设置。有些启动器还提供了更多的自定义选项,例如主题、图标包等,使用户能够将设备界面个性化到自己喜欢的样子。 总之,Android设备的默认启动器设置是一个重要的用户体验方面的设置选项,通过它可以实现设备主屏幕的个性化和功能拓展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值