Android设置默认Launcher
当系统存在多个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
添加一个方法:
privatevoidsetDefaultLauncher(){//getdefaultcomponentStringpackageName="com.coship.factorytest";//默认launcher包名StringclassName="com.coship.factorytest.MainActivity";////默认launcher入口IPackageManagerpm=ActivityThread.getPackageManager();//判断指定的launcher是否存在if(hasApkInstalled(packageName)){Slog.i(TAG,"defautlpackageName="+packageName+",defaultclassName="+className);//清除当前默认launcherArrayList<IntentFilter>intentList=newArrayList<IntentFilter>();ArrayList<ComponentName>cnList=newArrayList<ComponentName>();mContext.getPackageManager().getPreferredActivities(intentList,cnList,null);IntentFilterdhIF=null;for(inti=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());}}//获取所有launcheractivityIntentintent=newIntent(Intent.ACTION_MAIN);intent.addCategory(Intent.CATEGORY_HOME);List<ResolveInfo>list=newArrayList<ResolveInfo>();try{list=pm.queryIntentActivities(intent,intent.resolveTypeIfNeeded(mContext.getContentResolver()),PackageManager.MATCH_DEFAULT_ONLY);}catch(RemoteExceptione){thrownewRuntimeException("Packagemanagerhasdied",e);}//getallcomponentsandthebestmatchIntentFilterfilter=newIntentFilter();filter.addAction(Intent.ACTION_MAIN);filter.addCategory(Intent.CATEGORY_HOME);filter.addCategory(Intent.CATEGORY_DEFAULT);finalintN=list.size();Slog.d(TAG,"N:::::hyhyhyhy::::="+N);//设置默认launcherComponentNamelauncher=newComponentName(packageName,className);ComponentName[]set=newComponentName[N];intdefaultMatch=0;for(inti=0;i<N;i++){ResolveInfor=list.get(i);set[i]=newComponentName(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(RemoteExceptione){thrownewRuntimeException("com.coship.factorytest.MainActivity:Packagemanagerhasdied",e);}}//endif}privatestaticbooleanhasApkInstalled(Stringpkgname){try{mSelf.mContext.getPackageManager().getPackageInfo(pkgname,0);}catch(Exceptione){Slog.d(TAG,"PackageManager.NameNotFoundException:="+e.getMessage());returnfalse;}returntrue;}
然后在ActivityManagerService类中的
booleanstartHomeActivityLocked()
方法第一行调用上面添加的
setDefaultLauncher()
booleanstartHomeActivityLocked(){if(mFactoryTest==SystemServer.FACTORY_TEST_LOW_LEVEL&&mTopAction==null){//Wearerunninginfactorytestmode,butunabletofind//thefactorytestapp,sojustsitarounddisplayingthe//errormessageanddon'ttrytostartanything.returnfalse;}///////////////////////////////////////////setDefaultLauncher();///////////////////////////////////////////Intentintent=newIntent(mTopAction,mTopData!=null?Uri.parse(mTopData):null);intent.setComponent(mTopComponent);if(mFactoryTest!=SystemServer.FACTORY_TEST_LOW_LEVEL){intent.addCategory(Intent.CATEGORY_HOME);}ActivityInfoaInfo=intent.resolveActivityInfo(mContext.getPackageManager(),STOCK_PM_FLAGS);if(aInfo!=null){intent.setComponent(newComponentName(aInfo.applicationInfo.packageName,aInfo.name));//Don'tdothisifthehomeappiscurrentlybeing//instrumented.Proce***ecordapp=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);}}returntrue;}
添加后的方法全部内容如上,重新编译android,烧录,开机就能够自动进入自定义的launcher
可以通过系统设置取消该launcher的默认设置,取消之后按home键会弹出launcher选择提示框
frameworks\base\core\java\com\android\internal\app\ResolverActivity.java
ResolverActivity类就是选择打开方式的弹出框
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。