当前位置:   article > 正文

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

adb 查询默认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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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();
   }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

而startSelected在ItemClickListener也被调用到,

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

可以看出第一个参数是启动的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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
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();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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

void configureContentview(...){
	mAdapter = creatAdapter(...);
	...
	setupDefaultLauncher();
	...
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 注意:你需要做成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>
  • 1
  • 2
  • 3
  • 4
  • 5
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/787703
推荐阅读
相关标签
  

闽ICP备14008679号