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选择框。

时间: 2024-10-09 18:06:56

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

Android 当系统存在多个Launcher时,如何设置开机自动进入默认的Launcher?

以设置Google Launcher2作为默认启动的Launcher为例, 其package name 为 com.android.launcher launcher activity name 为 com.android.launcher2.Launcher 1.请在PackageManagerService.java中的systemReady函数的最后中增加以下代码. if(isFirstBoot()) { //MTK ADD BEGIN String examplePackageName

redhat设置开机自动连接网络

一.设置开机自动连接网络1.用root账号登录2.打开etcsysconfignetwork-scrpts目录3.vi ifcfg-eth04.将ONBOOT改为yes 二.没有图形界面如何连接网络1.ifconfig -a 查看网络配置2.ifup eth0(上述命令查看的网卡设备)

linux (debian) 设置开机自动挂载

1. 临时挂载: # mount /dev/sda10  /data     //将  /dev/sda10 挂载到   /data 目录下 2. 设置开机自动挂载硬盘! # vi /etc/fstab 添加 /dev/sda10      /data     ext4    defaults   0    2 3. 开机验证!

Win10如何设置开机自动登录

原文:Win10如何设置开机自动登录 第一步: 小娜搜索"netplwiz",进入用户账户设置. 第二步: 先勾选选中一次,要使用本计算机,用户必须输入用户名和密码. 第三步: 取消勾选,要使用本计算机,用户必须输入用户名和密码,然后点击"应用". 第四步: 在弹出的自动登录框里面,输入登录账号对应的密码,点击确定退出即可. 原文地址:https://www.cnblogs.com/lonelyxmas/p/8566103.html

《Linux学习并不难》文件系统管理(8):设置开机自动挂载Linux文件系统

18.8  <Linux学习并不难>文件系统管理(8):设置开机自动挂载Linux文件系统 只有将某个分区或是设备进行挂载以后才能使用,但是当计算机重新启动以后,又需要重新挂载,这个时候可以通过修改/etc/fstab文件实现开机自动挂载Linux文件系统.要实现开机自动挂载文件系统,需要在/etc/fstab文件中添加该磁盘分区的相关信息,可以通过提供设备名和UUID实现. 1.使用设备名 编辑/etc/fstab文件,在该文件末尾添加下列内容. /dev/sda5             

ubuntu16.04对硬盘进行分区格式化并设置开机自动挂载

格式化: sudo mkfs.ntfs /dev/sdb1 格式化成ntfs格式的 sudo mkfs.ext3 /dev/sdb1 格式化成ext3格式的 挂载: mount /dev/sdb1 /mnt/sdb/  将/dev/sdb1挂载到/mnt/sdb/下 mount 查看挂载情况 设置开机自动挂载:(在/etc/fstab 文件中加入下面这行) 硬盘路径 文件路径(挂载点) 文件系统类型 设备的自定义选项 是否转存 fsck的顺序 /dev/sdb1     /mnt/sdb   

设置开机自动挂载

继上次为重新磁盘分配空间后,过段时间开机却发现空间依然是满的,这就很让人疑惑了,之前不是设置的好好的么? 1.发现问题 df一下,并未发现之前设置好的/dev/sda2和/dev/sda3 [email protected]:~# df 文件系统 1K-块 已用 可用 已用% 挂载点 udev 736936 0 736936 0% /dev tmpfs 152212 1432 150780 1% /run /dev/sda1 10253588 9253136 459884 96% / tmpfs

[转]android系统各种音量的获取与设置

获取系统音量 通过程序获取android系统手机的铃声和音量.同样,设置铃声和音量的方法也很简单! 设置音量的方法也很简单,AudioManager提供了方法:publicvoidsetStreamVolume(intstreamType,intindex,intflags)其中streamType有内置的常量,去文档里面就可以看到. JAVA代码:AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO

/etc/fstab 参数详解及如何设置开机自动挂载

转自:http://blog.csdn.net/duyiwuer2009/article/details/8644753 某些时候当Linux系统下划分了新的分区后,需要将这些分区设置为开机自动挂载,否则,Linux是无法使用新建的分区的. /etc/fstab 文件负责配置Linux开机时自动挂载的分区. Windows的文件结构是多个并列的树状结构,最顶部的是不同的磁盘(分区),如:C,D,E,F等.Linux的文件结构是单个的树状结构.最顶部的为根目录,即/.在根目录下,分为多个子目录,包