博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android 当系统存在多个Launcher时,如何设置开机自动进入默认的Launcher?
阅读量:4207 次
发布时间:2019-05-26

本文共 2984 字,大约阅读时间需要 9 分钟。

来自MTK  FAQ

当系统存在多个Launcher时,开机完成并解锁后,系统会弹出一个选择框让用户选择进入哪一个Launcher,如果不想选择,而是想直接进入某一个默认的Launcher,并且用户在设置->应用程序->管理应用程序->所有应用程序列表,找到之前设置的那个默认的Launcher,并且取消了默认值,可以重新弹出launcher选框。

下面以设置Google Launcher2作为默认启动的Launcher为例,其包名为com.android.launcher2

packages/apps/Provision/src/com/android/DefaultActivity.java文件

       ......

// remove this activity from the package manager.

               PackageManager pm = getPackageManager();

 

                   //add  start  

                   Intent intent=new Intent(Intent.ACTION_MAIN);

                   intent.addCategory(Intent.CATEGORY_HOME);

                   List<ResolveInfo> resolveInfoList = pm.queryIntentActivities(intent, 0);

                   if(resolveInfoList != null){

                            int size = resolveInfoList.size();

                            for(int j=0;j<size;j++){

                                     final ResolveInfo r = resolveInfoList.get(j);

                                     if(r.activityInfo.packageName.equals(this.getPackageName())){    //attention

                                               resolveInfoList.remove(j);

                                               size -= 1;

                                               j--;

                                      }

                            }

                           

                            ComponentName[] set = new ComponentName[size];

                            ComponentName defaultLauncher=new ComponentName("com.android.launcher2", "com.android.launcher2.Launcher");

                            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;

                                     }

                            }

                            Log.d(TAG,"defaultMatch="+Integer.toHexString(defaultMatch));

                            IntentFilter filter=new IntentFilter();

                            filter.addAction(Intent.ACTION_MAIN);

                            filter.addCategory(Intent.CATEGORY_HOME);

                            filter.addCategory(Intent.CATEGORY_DEFAULT);

                            pm.clearPackagePreferredActivities(defaultLauncher.getPackageName());

                            pm.addPreferredActivity(filter, defaultMatch, set, defaultLauncher);

                   }

                   //add  end

 

        // remove this activity from the package manager.

        ComponentName name = new ComponentName(this, DefaultActivity.class);

 pm.setComponentEnabledSetting(name,

PackageManager.COMPONENT_ENABLED_STATE_DISABLED,

          PackageManager.DONT_KILL_APP);

       ......

 

然后修改packages/apps/Provision/AndroidManifest.xml文件,增加以下语句:

<uses-permission android:name=”android.permission.SET_PREFERRED_APPLICATIONS” />

 

说明:上面添加的代码中,需要注意如下这个if判断条件写法不是唯一的,如果按照FAQ的写法,设置默认Launcher不成功,则要根据系统当前apk的情况来做修改;

if(r.activityInfo.packageName.equals(this.getPackageName())){

 

不成功的原因是:系统有其他的apk也会接收Intent.ACTION_MAIN,CATEGORY_HOME的intent,而这些apk又不是Launcher程序(启动器程序);

这种情况下就需要在这个if判断中将这些apk的相应Activity剔除掉;

 

例如:Settings中有一个activity:CryptKeeper,它也会接收HOME intent,那么if判断就需要改为如下所示:

if(r.activityInfo.packageName.equals(this.getPackageName()) || r.activityInfo.name.equals("com.android.settings.CryptKeeper") ){

 

如果按照FAQ的写法,发现设置默认Launcher不成功,如何判断需要剔除哪些activity呢?

方法如下:在download完第一次开机时,用adb logcat -v time >main.log抓取main log,搜索DefaultActivity这个tag,因为在上面添加代码中,

 Log.d(TAG, resolveInfo.toString()); 这条语句会打印出resolveInfoList中每条记录的值,如果发现其中某一条记录不是Launcher程序,那么就在上面的if判断中,添加相应判断条件即可。

 

备注:上面所添加的全部代码,一定要放在pm.setComponentEnabledSetting这两行语句之前,如果放在这个语句后面,那所添加的代码就无法执行了,导致设置失效。这里的com.android.launcher2Google默认的Launcher2,可以根据自己的需要来定制,让系统进入指定的那个Launcher

转载地址:http://ixlli.baihongyu.com/

你可能感兴趣的文章
【Error】make LKM时 找不到符号
查看>>
【转载】【C语言】浅析C语言之uint8_t / uint16_t / uint32_t /uint64_t
查看>>
【转载】yum update 自动忽略内核更新
查看>>
【maven】打包jar上传到服务器运行
查看>>
关闭centos wayland
查看>>
【Error】chsh: PAM: Authentication failure
查看>>
【Error】zsh历史记录丢失
查看>>
解析漏洞总结
查看>>
有趣的二进制 读书笔记
查看>>
【Windows C++】调用powershell上传指定目录下所有文件
查看>>
kotlin-android-extensions 插件无效问题
查看>>
经典排序算法--Java实现
查看>>
Java中JRadioButton单选按钮分组方法
查看>>
Java图形界面中单选按钮JRadioButton和按钮Button事件处理
查看>>
小练习 - 排序:冒泡、选择、快排
查看>>
剑指Offer CalCarryBit 计算进位个数
查看>>
剑指Offer ReverseList 反转列表
查看>>
TCP/IP 三次握手建立连接和四次挥手释放连接
查看>>
操作系统 大端和小端(Big endian and Little endian)
查看>>
Mybatis 获取不到接口参数问题
查看>>