android 修改默认启动项launcher(一)

  • 需求:不去掉系统自带launcher的前提下,默认启动指定应用作为launcher
  • 现象:应用中带有属性"android.intent.category.HOME",开机会弹出选择界面
  • 思路:跳过选择界面,直接选中要启动的launcher并直接进入
1.选择界面流程分析

使用adb命令抓取到launcher选择提示框是一个activity,路径是frameworks/base/core/java/com/android/internal/app/ResolverActivity.java

此Activity会获取系统中所有的Home app,并根据系统的设置情况显示如上界面。此类中有一个内部类ResolveListAdapter该类继承自BaseAdapter,该类是Home app选择界面的数据适配器。
ResolveListAdapter会在ResolverActivity的onCreate方法中被初始化并会传入一个ResolveInfo类型的List,ResolveListAdapter根据会传入的List初始化一个List mList ,用户的点击事件都会在ResolveListAdapter获取数据。
用户点击”ALWAYS”的事件发生在ResolverActivity的onButtonClick 方法中,此方法会获取选中的Item的position、或者获取用户上一次启动的Home app的,mAlwaysUseOption代表用户选中的是否为历史选择,并调用startSelected。
onButtonClick()方法

public void onButtonClick(View v) {
	final int id = v.getId();
	startSelected(mAlwaysUseOption ?mListView.getCheckedItemPosition() : mAdapter.getFilteredPosition(),
    id == R.id.button_always,
    mAlwaysUseOption);
}

startSeletced中通过ResolveListAdapter获取选择的item代表的Home app。并且finish此activity,onTargetSelected()会根据传入的ResolveInfo设置默认的Home

void startSelected(int which, boolean always, boolean filtered) {
   if (isFinishing()) {
      return;
   }
   ...
   ResolveInfo ri = mAdapter.resolveInfoForPosition(which,filtered);
   TargetInfo target = mAdapter.targetInfoForPosition(which,filtered);
   if(onTargetSelected(target,always)){
   	  finish();
   }
}

而startSelected在ItemClickListener也被调用到,

public void onItemClick(AdapterView<?> parent,View view,int position,long id){
   ...
   startSelected(position,true,true);
}

可以看出第一个参数是启动的HomeActivity在adapter中的位置,好分析完了,现在开始修改。

2.获取指定HomeActivity在adapter中的位置

首先在adapter类中添加获取指定HomeActivity在list中位置的方法

public int getDefaultHomePosition(String packageName){
  for (int i = 0; i < mDisplayList.size(); i++) {
       ResolveInfo info = mDisplayList.get(i).getResolveInfo();
       if (info.activityInfo.packageName.equals(packageName)) {
           return i;
       }
  }
  return -1;
}
3.启动定制launcher

在ResolverActivity中添加设置默认app的方法setupDefaultLauncher(),代码如下:

private void setupDefaultLauncher() {
   int position = mAdapter.getDefaultHomePosition("home app包名");
   //如果不存在则return
   if (position == -1) {
      if (DEBUG)
         Log.w(TAG,"not find default Home");
         return;
      }
   }
   startSelected(position, true, true);
   finish();
}

为了保证mAdapter被初始化 setupDefaultLauncher()的调用添加到ResolverActivity的onCreate函数中,代码如下:

void configureContentview(...){
	mAdapter = creatAdapter(...);
	...
	setupDefaultLauncher();
	...
}
  • 注意:你需要做成launcher的应用的manifest.xml中需要添加
<intent-filter>
	<action android:name="android.intent.action.MAIN" />
	<category android:name="android.intent.category.HOME"/>
	<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
Android设备的默认launcher设置是指系统默认启动器(Launcher)应用程序。启动器是用户在设备上看到和操作的主屏幕,它提供了桌面、应用程序列表、小部件和壁纸等功能。 在Android设备上,不同的制造商可能会有不同的默认启动器设置,例如Samsung可能会有自己的启动器样式,而Google的Pixel设备则使用原生的Android启动器。 默认启动器有以下几个主要特点和功能: 1. 桌面:默认启动器会在设备主屏幕上显示桌面,用户可以在桌面上添加和管理应用程序、小部件和快捷方式等。 2. 应用程序列表:用户可以通过默认启动器访问设备上安装的所有应用程序的列表,并进行搜索和排序。 3. 小部件:默认启动器支持用户在桌面上添加各种小部件,例如天气、日历、音乐播放器等,以便用户更方便地获取相关信息。 4. 壁纸:默认启动器还允许用户更改桌面背景壁纸,可以选择自己喜欢的图片或者使用系统提供的预设壁纸。 对于用户来说,选择适合自己的默认启动器可以增加使用Android设备的个性化和便利性。用户可以根据自己的需求和偏好,选择不同功能和样式的启动器来进行设置。有些启动器还提供了更多的自定义选项,例如主题、图标包等,使用户能够将设备界面个性化到自己喜欢的样子。 总之,Android设备的默认启动器设置是一个重要的用户体验方面的设置选项,通过它可以实现设备主屏幕的个性化和功能拓展。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值