android 啓動指定launcher

MTK 6.0
高通 7.1

方法一

直接在AndroidMenifest.xml中添加 android:priority=1”
數字越大,執行等級越高

方法二
在網上找了一些其他的修改方法,均需在ActivityManagerService.java的startHomeActivityLocked添加默認啓動,但是發現添加後,若系統存在多個launcher apk,則仍然會彈出launcher選擇提示框
思路: 跳過選擇提示框,直接選中要啓動的launcher並直接進入。

使用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,false,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();
...
}

注意:

高通平臺的,需要修改SetupWelcomeActivity.java和DefaultActivity.java的中

private static final String ORIGINAL_LAUNCHER_PACKAGENAME = "com.android.launcher3";//設置爲定製的包名 
private static final String ORIGINAL_LAUNCHER_CLASSNAME = "com.android.launcher3.Launcher"//設置爲定製的類名

改了這兩個,多個launcher纔會彈出launcher選擇提示框。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章