當(dāng)系統(tǒng)存在多個(gè)launcher時(shí),若沒有設(shè)置默認(rèn)launcher,開機(jī)啟動(dòng)后會(huì)彈出提示框,羅列所有l(wèi)auncher,用戶選擇并設(shè)置了默認(rèn)launcher后,按home鍵以及以后重啟都會(huì)進(jìn)入默認(rèn)的launcher。
作為一家“創(chuàng)意+整合+營銷”的成都網(wǎng)站建設(shè)機(jī)構(gòu),我們在業(yè)內(nèi)良好的客戶口碑。創(chuàng)新互聯(lián)提供從前期的網(wǎng)站品牌分析策劃、網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、成都做網(wǎng)站、創(chuàng)意表現(xiàn)、網(wǎng)頁制作、系統(tǒng)開發(fā)以及后續(xù)網(wǎng)站營銷運(yùn)營等一系列服務(wù),幫助企業(yè)打造創(chuàng)新的互聯(lián)網(wǎng)品牌經(jīng)營模式與有效的網(wǎng)絡(luò)營銷方法,創(chuàng)造更大的價(jià)值。
現(xiàn)在,我希望系統(tǒng)能直接就進(jìn)入我設(shè)定的launcher而不是彈出框后選擇然后設(shè)置
網(wǎng)上大部分的做法就是修改
packages/apps/Provision/src/com/android/DefaultActivity.java
和
frameworks/base/services/java/com/android/server/pm/PackageManagerService.java
兩個(gè)文件,給個(gè)相對比較好看一點(diǎn)的鏈接http://blog.csdn.net/z_guijin/article/details/8964890
我按照這個(gè)做不能達(dá)到預(yù)期的效果,
/////////////////////////////////////////添加內(nèi)容////////////////////////////////////////
后期修改包名,發(fā)現(xiàn)開機(jī)自啟動(dòng)出現(xiàn)問題,然后弄了兩天,終于差不多弄清楚了。果然,欠下的債遲早得還!
其實(shí)修改DefaultActivity.java就能夠完成開機(jī)自啟動(dòng),只是當(dāng)時(shí)我的程序有問題,所以沒有達(dá)到預(yù)期效果
當(dāng)然下面修改ActivityManagerService.java也能完成開機(jī)自啟動(dòng)
這兩者的區(qū)別在于
DefaultActivity.java只是在第一次啟動(dòng)時(shí)執(zhí)行,如果修改了默認(rèn)launcher后不可恢復(fù)
ActivityManagerService.java在每次啟動(dòng)時(shí)執(zhí)行,每次都默認(rèn)啟動(dòng)設(shè)定的launcher,當(dāng)然,如果設(shè)定的launcher存在的話,設(shè)置其他的launcher為默認(rèn)會(huì)無效,因?yàn)橹匦聠?dòng)時(shí)setDefaultLauncher()會(huì)將當(dāng)前默認(rèn)launcher清除。只有在卸載了設(shè)定默認(rèn)啟動(dòng)的launcher后才能設(shè)置其他launcher為默認(rèn)啟動(dòng).
//////////////////////////////////////////////////////////////////////////////////////////////////////////
修改多次搜索關(guān)鍵字,得到另一篇文章,大致看了下,感覺不會(huì)有效,但是已經(jīng)絕望了就試了試,竟然解決了問題http://blog.csdn.net/jia4525036/article/details/18036765
這篇文章有借鑒之處,直接使用時(shí)會(huì)發(fā)現(xiàn)有些字段是上下文中沒有的,故寫下此文記錄一下。
修改文件
frameworks\base\services\java\com\android\server\am\ActivityManagerService.java
添加一個(gè)方法:
private void setDefaultLauncher() { // get default component String packageName = "com.coship.factorytest";//默認(rèn)launcher包名 String className = "com.coship.factorytest.MainActivity";////默認(rèn)launcher入口 IPackageManager pm = ActivityThread.getPackageManager(); //判斷指定的launcher是否存在 if(hasApkInstalled(packageName)) { Slog.i(TAG, "defautl packageName = " + packageName + ", default className = " + className); //清除當(dāng)前默認(rèn)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()); } } //獲取所有l(wèi)auncher 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); //設(shè)置默認(rè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()
方法第一行調(diào)用上面添加的
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; }
添加后的方法全部內(nèi)容如上,重新編譯android,燒錄,開機(jī)就能夠自動(dòng)進(jìn)入自定義的launcher
可以通過系統(tǒng)設(shè)置取消該launcher的默認(rèn)設(shè)置,取消之后按home鍵會(huì)彈出launcher選擇提示框
frameworks\base\core\java\com\android\internal\app\ResolverActivity.java
ResolverActivity類就是選擇打開方式的彈出框
分享題目:Android設(shè)置默認(rèn)Launcher
當(dāng)前地址:http://jinyejixie.com/article2/iicjic.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、微信公眾號、企業(yè)網(wǎng)站制作、Google、網(wǎng)站設(shè)計(jì)公司、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)