中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android設置默認Launcher

發布時間:2020-05-31 16:28:22 來源:網絡 閱讀:16952 作者:年少的風 欄目:移動開發

當系統存在多個launcher時,若沒有設置默認launcher,開機啟動后會彈出提示框,羅列所有launcher,用戶選擇并設置了默認launcher后,按home鍵以及以后重啟都會進入默認的launcher。

現在,我希望系統能直接就進入我設定的launcher而不是彈出框后選擇然后設置


網上大部分的做法就是修改

packages/apps/Provision/src/com/android/DefaultActivity.java

frameworks/base/services/java/com/android/server/pm/PackageManagerService.java


兩個文件,給個相對比較好看一點的鏈接http://blog.csdn.net/z_guijin/article/details/8964890

我按照這個做不能達到預期的效果,


/////////////////////////////////////////添加內容////////////////////////////////////////

后期修改包名,發現開機自啟動出現問題,然后弄了兩天,終于差不多弄清楚了。果然,欠下的債遲早得還!

其實修改DefaultActivity.java就能夠完成開機自啟動,只是當時我的程序有問題,所以沒有達到預期效果


當然下面修改ActivityManagerService.java也能完成開機自啟動


這兩者的區別在于
DefaultActivity.java只是在第一次啟動時執行,如果修改了默認launcher后不可恢復

ActivityManagerService.java在每次啟動時執行,每次都默認啟動設定的launcher,當然,如果設定的launcher存在的話,設置其他的launcher為默認會無效,因為重新啟動時setDefaultLauncher()會將當前默認launcher清除。只有在卸載了設定默認啟動的launcher后才能設置其他launcher為默認啟動.

//////////////////////////////////////////////////////////////////////////////////////////////////////////


修改多次搜索關鍵字,得到另一篇文章,大致看了下,感覺不會有效,但是已經絕望了就試了試,竟然解決了問題http://blog.csdn.net/jia4525036/article/details/18036765

這篇文章有借鑒之處,直接使用時會發現有些字段是上下文中沒有的,故寫下此文記錄一下。


修改文件

frameworks\base\services\java\com\android\server\am\ActivityManagerService.java

添加一個方法:

	private void setDefaultLauncher() {  
        // get default component   
        String packageName = "com.coship.factorytest";//默認launcher包名
        String className = "com.coship.factorytest.MainActivity";////默認launcher入口
         
		IPackageManager pm = ActivityThread.getPackageManager();
		
		//判斷指定的launcher是否存在
		if(hasApkInstalled(packageName)) {
		
			Slog.i(TAG, "defautl packageName = " + packageName + ", default className = " + className); 
					  
			//清除當前默認launcher 
			ArrayList<IntentFilter> intentList = new ArrayList<IntentFilter>();  
			ArrayList<ComponentName> cnList = new ArrayList<ComponentName>();  
			mContext.getPackageManager().getPreferredActivities(intentList, cnList, null);  
			IntentFilter dhIF = null;  
			for(int i = 0; i < cnList.size(); i++) {  
				dhIF = intentList.get(i);  
				if(dhIF.hasAction(Intent.ACTION_MAIN) && dhIF.hasCategory(Intent.CATEGORY_HOME)) {  
					mContext.getPackageManager().clearPackagePreferredActivities(cnList.get(i).getPackageName());  
				}  
			}  
					  
			//獲取所有launcher activity 
			Intent intent = new Intent(Intent.ACTION_MAIN);  
			intent.addCategory(Intent.CATEGORY_HOME);  
			List<ResolveInfo> list = new ArrayList<ResolveInfo>();  
			try {  
				list = pm.queryIntentActivities(intent, intent.resolveTypeIfNeeded(mContext.getContentResolver()), PackageManager.MATCH_DEFAULT_ONLY);  
			}catch (RemoteException e) {  
				throw new RuntimeException("Package manager has died", e);  
			}   
			// get all components and the best match  
			IntentFilter filter = new IntentFilter();  
			filter.addAction(Intent.ACTION_MAIN);  
			filter.addCategory(Intent.CATEGORY_HOME);  
			filter.addCategory(Intent.CATEGORY_DEFAULT);  
			final int N = list.size();  
			Slog.d(TAG, "N:::::hyhyhyhy:::: = " + N);  
					
			//設置默認launcher 
			ComponentName launcher = new ComponentName(packageName, className);  

			ComponentName[] set = new ComponentName[N];  
			int defaultMatch = 0;  
			for (int i = 0; i < N; i++) {  
				ResolveInfo r = list.get(i);  
				set[i] = new ComponentName(r.activityInfo.packageName, r.activityInfo.name);  
				Slog.d(TAG, "r.activityInfo.packageName:::::hyhyhyhy:::: = " + r.activityInfo.packageName);
				Slog.d(TAG, "r.activityInfo.name:::::hyhyhyhy:::: = " + r.activityInfo.name);
				if(launcher.getClassName().equals(r.activityInfo.name)) {
					defaultMatch = r.match;
				}
			}  
					
			try {  
				pm.addPreferredActivity(filter, defaultMatch, set, launcher);
			} catch (RemoteException e) {  
				throw new RuntimeException("com.coship.factorytest.MainActivity : Package manager has died", e);  
			}   
			
			
		}//end if
		
    }  

	private static boolean hasApkInstalled(String pkgname) {

	    try {
	        mSelf.mContext.getPackageManager().getPackageInfo(pkgname,0);
	    } catch(Exception e) {
			Slog.d(TAG, "PackageManager.NameNotFoundException: = " + e.getMessage());
	        return false;
	    }
	    return true;
	}

然后在ActivityManagerService類中的

boolean startHomeActivityLocked()

方法第一行調用上面添加的

setDefaultLauncher()
  boolean startHomeActivityLocked() {
	
        if (mFactoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL
                && mTopAction == null) {
            // We are running in factory test mode, but unable to find
            // the factory test app, so just sit around displaying the
            // error message and don't try to start anything.
            return false;
        }

///////////////////////////////////////////
		setDefaultLauncher();
///////////////////////////////////////////
		
        Intent intent = new Intent(
            mTopAction,
            mTopData != null ? Uri.parse(mTopData) : null);
        intent.setComponent(mTopComponent);
        if (mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {
            intent.addCategory(Intent.CATEGORY_HOME);
        }
        ActivityInfo aInfo =
            intent.resolveActivityInfo(mContext.getPackageManager(),
                    STOCK_PM_FLAGS);
        if (aInfo != null) {
            intent.setComponent(new ComponentName(
                    aInfo.applicationInfo.packageName, aInfo.name));
            // Don't do this if the home app is currently being
            // instrumented.
            Proce***ecord app = getProce***ecordLocked(aInfo.processName,
                    aInfo.applicationInfo.uid);
            if (app == null || app.instrumentationClass == null) {
                intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK);
                mMainStack.startActivityLocked(null, intent, null, null, 0, aInfo,
                        null, null, 0, 0, 0, false, false, null);
            }
        }
        
        
        return true;
    }

添加后的方法全部內容如上,重新編譯android,燒錄,開機就能夠自動進入自定義的launcher

可以通過系統設置取消該launcher的默認設置,取消之后按home鍵會彈出launcher選擇提示框

frameworks\base\core\java\com\android\internal\app\ResolverActivity.java

ResolverActivity類就是選擇打開方式的彈出框

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

吉安市| 萨迦县| 科尔| 阳东县| 庆城县| 翁源县| 确山县| 黄骅市| 灵台县| 常山县| 巴林左旗| 阿勒泰市| 洪湖市| 耒阳市| 陵川县| 南召县| 双牌县| 长顺县| 温泉县| 奇台县| 勃利县| 休宁县| 北海市| 云安县| 武冈市| 肇源县| 鄂托克前旗| 靖远县| 科技| 平罗县| 成都市| 高唐县| 涡阳县| 崇明县| 铜川市| 资兴市| 呼和浩特市| 子洲县| 抚州市| 突泉县| 阿坝县|