赞
踩
使用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中的位置,好分析完了,现在开始修改。
首先在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;
}
在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();
...
}
<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>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。