当系统存在多个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.ProcessRecordapp=getProcessRecordLocked(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类就是选择打开方式的弹出框

更多相关文章

  1. android 通过setContentView切换Activity的View,保存动态修改后
  2. 第一篇:小程序之语法篇
  3. android摄像头获取图像——第二弹
  4. Android框架学习笔记02AndroidAsycHttp框架
  5. Android开发之OkHttp3.4.x
  6. 初探Android中Window与DecorView
  7. Android(安卓)ART Hook 实现 - SandHook
  8. Android四大组件 - Activity的生命周期和启动模式
  9. Android(安卓)之 Fragment

随机推荐

  1. 面试篇--android下网络通讯机制(三种网络
  2. 获取手机系统
  3. Android(安卓)StateMachine和AsyncChanne
  4. Android中画图总结(1)
  5. android 自定义用相机拍照后的照片存储位
  6. android群发短信时判断短信是否发送成功
  7. Android触屏事件处理策略
  8. Android之百度地图开发,包含定位,覆盖物,经
  9. Android 图片加载总结帖
  10. Android: 用Instrumentation类发送鼠标或