- 浏览: 21442862 次
- 性别:
- 来自: 杭州
最新评论
-
ZY199266:
配置文件还需要额外的配置ma
Android 客户端通过内置API(HttpClient) 访问 服务器(用Spring MVC 架构) 返回的json数据全过程 -
ZY199266:
我的一访问为什么是 /mavenwebdemo/WEB-I ...
Android 客户端通过内置API(HttpClient) 访问 服务器(用Spring MVC 架构) 返回的json数据全过程 -
lvgaga:
我又一个问题就是 如果像你的这种形式写。配置文件还需要额外的 ...
Android 客户端通过内置API(HttpClient) 访问 服务器(用Spring MVC 架构) 返回的json数据全过程 -
lvgaga:
我的一访问为什么是 /mavenwebdemo/WEB-I ...
Android 客户端通过内置API(HttpClient) 访问 服务器(用Spring MVC 架构) 返回的json数据全过程 -
y1210251848:
你的那个错误应该是项目所使用的目标框架不支持吧
log4net配置(web中使用log4net,把web.config放在单独的文件中)
Android系统默认Home应用程序(Launcher)的启动过程源代码分析
在前面一篇文章中,我们分析了Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还需要有一个Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home应用程序就是Launcher了,本文将详细分析Launcher应用程序的启动过程。
Android系统的Home应用程序Launcher是由ActivityManagerService启动的,而ActivityManagerService和PackageManagerService一样,都是在开机时由SystemServer组件启动的,SystemServer组件首先是启动ePackageManagerServic,由它来负责安装系统的应用程序,具体可以参考前面一篇文章Android应用程序安装过程源代码分析,系统中的应用程序安装好了以后,SystemServer组件接下来就要通过ActivityManagerService来启动Home应用程序Launcher了,Launcher在启动的时候便会通过PackageManagerServic把系统中已经安装好的应用程序以快捷图标的形式展示在桌面上,这样用户就可以使用这些应用程序了,整个过程如下图所示:
点击查看大图
下面详细分析每一个步骤。
Step 1. SystemServer.main
这个函数定义在frameworks/base/services/java/com/android/server/SystemServer.java文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 1。
Step 2.SystemServer.init1
这个函数是一个JNI方法,实现在frameworks/base/services/jni/com_android_server_SystemServer.cpp文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 2。
Step 3.libsystem_server.system_init
函数system_init实现在libsystem_server库中,源代码位于frameworks/base/cmds/system_server/library/system_init.cpp文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 3。
Step 4.AndroidRuntime.callStatic
这个函数定义在frameworks/base/core/jni/AndroidRuntime.cpp文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 4。
Step 5.SystemServer.init2
这个函数定义在frameworks/base/services/java/com/android/server/SystemServer.java文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 5。
Step 6.ServerThread.run
这个函数定义在frameworks/base/services/java/com/android/server/SystemServer.java文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 6。
Step 7. ActivityManagerService.main这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerServcie.java文件中:
- publicfinalclassActivityManagerServiceextendsActivityManagerNative
- implementsWatchdog.Monitor,BatteryStatsImpl.BatteryCallback{
- ......
- publicstaticfinalContextmain(intfactoryTest){
- AThreadthr=newAThread();
- thr.start();
- synchronized(thr){
- while(thr.mService==null){
- try{
- thr.wait();
- }catch(InterruptedExceptione){
- }
- }
- }
- ActivityManagerServicem=thr.mService;
- mSelf=m;
- ActivityThreadat=ActivityThread.systemMain();
- mSystemThread=at;
- Contextcontext=at.getSystemContext();
- m.mContext=context;
- m.mFactoryTest=factoryTest;
- m.mMainStack=newActivityStack(m,context,true);
- m.mBatteryStatsService.publish(context);
- m.mUsageStatsService.publish(context);
- synchronized(thr){
- thr.mReady=true;
- thr.notifyAll();
- }
- m.startRunning(null,null,null,null);
- returncontext;
- }
- ......
- }
Step 8.PackageManagerService.main
这个函数定义在frameworks/base/services/java/com/android/server/PackageManagerService.java文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 7。执行完这一步之后,系统中的应用程序的所有信息都保存在PackageManagerService中了,后面Home应用程序Launcher启动起来后,就会把PackageManagerService中的应用程序信息取出来,然后以快捷图标的形式展示在桌面上,后面我们将会看到这个过程。
Step 9.ActivityManagerService.setSystemProcess
这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerServcie.java文件中:
- publicfinalclassActivityManagerServiceextendsActivityManagerNative
- implementsWatchdog.Monitor,BatteryStatsImpl.BatteryCallback{
- ......
- publicstaticvoidsetSystemProcess(){
- try{
- ActivityManagerServicem=mSelf;
- ServiceManager.addService("activity",m);
- ServiceManager.addService("meminfo",newMemBinder(m));
- if(MONITOR_CPU_USAGE){
- ServiceManager.addService("cpuinfo",newCpuBinder(m));
- }
- ServiceManager.addService("permission",newPermissionController(m));
- ApplicationInfoinfo=
- mSelf.mContext.getPackageManager().getApplicationInfo(
- "android",STOCK_PM_FLAGS);
- mSystemThread.installSystemApplicationInfo(info);
- synchronized(mSelf){
- ProcessRecordapp=mSelf.newProcessRecordLocked(
- mSystemThread.getApplicationThread(),info,
- info.processName);
- app.persistent=true;
- app.pid=MY_PID;
- app.maxAdj=SYSTEM_ADJ;
- mSelf.mProcessNames.put(app.processName,app.info.uid,app);
- synchronized(mSelf.mPidsSelfLocked){
- mSelf.mPidsSelfLocked.put(app.pid,app);
- }
- mSelf.updateLruProcessLocked(app,true,true);
- }
- }catch(PackageManager.NameNotFoundExceptione){
- thrownewRuntimeException(
- "Unabletofindandroidsystempackage",e);
- }
- }
- ......
- }
Step 10. ActivityManagerService.systemReady
这个函数是在上面的Step 6中的ServerThread.run函数在将系统中的一系列服务都初始化完毕之后才调用的,它定义在frameworks/base/services/java/com/android/server/am/ActivityManagerServcie.java文件中:
- publicfinalclassActivityManagerServiceextendsActivityManagerNative
- implementsWatchdog.Monitor,BatteryStatsImpl.BatteryCallback{
- ......
- publicvoidsystemReady(finalRunnablegoingCallback){
- ......
- synchronized(this){
- ......
- mMainStack.resumeTopActivityLocked(null);
- }
- }
- ......
- }
Step 11. ActivityStack.resumeTopActivityLocked
这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityStack.java文件中:
- publicclassActivityStack{
- ......
- finalbooleanresumeTopActivityLocked(ActivityRecordprev){
- //Findthefirstactivitythatisnotfinishing.
- ActivityRecordnext=topRunningActivityLocked(null);
- ......
- if(next==null){
- //Therearenomoreactivities!Let'sjuststartupthe
- //Launcher...
- if(mMainStack){
- returnmService.startHomeActivityLocked();
- }
- }
- ......
- }
- ......
- }
Step 12.ActivityManagerService.startHomeActivityLocked
这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerServcie.java文件中:
- publicfinalclassActivityManagerServiceextendsActivityManagerNative
- implementsWatchdog.Monitor,BatteryStatsImpl.BatteryCallback{
- ......
- booleanstartHomeActivityLocked(){
- ......
- 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);
- }
- }
- returntrue;
- }
- ......
- }
- <manifest
- xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.launcher"
- android:sharedUserId="@string/sharedUserId"
- >
- ......
- <application
- android:name="com.android.launcher2.LauncherApplication"
- android:process="@string/process"
- android:label="@string/application_name"
- android:icon="@drawable/ic_launcher_home">
- <activity
- android:name="com.android.launcher2.Launcher"
- android:launchMode="singleTask"
- android:clearTaskOnLaunch="true"
- android:stateNotNeeded="true"
- android:theme="@style/Theme"
- android:screenOrientation="nosensor"
- android:windowSoftInputMode="stateUnspecified|adjustPan">
- <intent-filter>
- <actionandroid:name="android.intent.action.MAIN"/>
- <categoryandroid:name="android.intent.category.HOME"/>
- <categoryandroid:name="android.intent.category.DEFAULT"/>
- <categoryandroid:name="android.intent.category.MONKEY"/>
- </intent-filter>
- </activity>
- ......
- </application>
- </manifest>
因此,这里就返回com.android.launcher2.Launcher这个Activity了。由于是第一次启动这个Activity,接下来调用函数getProcessRecordLocked返回来的ProcessRecord值为null,于是,就调用mMainStack.startActivityLocked函数启动com.android.launcher2.Launcher这个Activity了,这里的mMainStack是一个ActivityStack类型的成员变量。
Step 13. ActivityStack.startActivityLocked
这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityStack.java文件中,具体可以参考Android应用程序启动过程源代码分析一文,这里就不详述了,在我们这个场景中,调用这个函数的最后结果就是把com.android.launcher2.Launcher启动起来,接着调用它的onCreate函数。
Step 14.Launcher.onCreate
这个函数定义在packages/apps/Launcher2/src/com/android/launcher2/Launcher.java文件中:
- publicfinalclassLauncherextendsActivity
- implementsView.OnClickListener,OnLongClickListener,LauncherModel.Callbacks,AllAppsView.Watcher{
- ......
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- ......
- if(!mRestoring){
- mModel.startLoader(this,true);
- }
- ......
- }
- ......
- }
Step 15.LauncherModel.startLoader
这个函数定义在packages/apps/Launcher2/src/com/android/launcher2/LauncherModel.java文件中:
- publicclassLauncherModelextendsBroadcastReceiver{
- ......
- publicvoidstartLoader(Contextcontext,booleanisLaunching){
- ......
- synchronized(mLock){
- ......
- //Don'tbothertostartthethreadifweknowit'snotgoingtodoanything
- if(mCallbacks!=null&&mCallbacks.get()!=null){
- //Ifthereisalreadyonerunning,tellittostop.
- LoaderTaskoldTask=mLoaderTask;
- if(oldTask!=null){
- if(oldTask.isLaunching()){
- //don'tdowngradeisLaunchingifwe'realreadyrunning
- isLaunching=true;
- }
- oldTask.stopLocked();
- }
- mLoaderTask=newLoaderTask(context,isLaunching);
- sWorker.post(mLoaderTask);
- }
- }
- }
- ......
- }
Step 16. LoaderTask.run
这个函数定义在packages/apps/Launcher2/src/com/android/launcher2/LauncherModel.java文件中:
- publicclassLauncherModelextendsBroadcastReceiver{
- ......
- privateclassLoaderTaskimplementsRunnable{
- ......
- publicvoidrun(){
- ......
- keep_running:{
- ......
- //secondstep
- if(loadWorkspaceFirst){
- ......
- loadAndBindAllApps();
- }else{
- ......
- }
- ......
- }
- ......
- }
- ......
- }
- ......
- }
Step 17.LoaderTask.loadAndBindAllApps
这个函数定义在packages/apps/Launcher2/src/com/android/launcher2/LauncherModel.java文件中:
- publicclassLauncherModelextendsBroadcastReceiver{
- ......
- privateclassLoaderTaskimplementsRunnable{
- ......
- privatevoidloadAndBindAllApps(){
- ......
- if(!mAllAppsLoaded){
- loadAllAppsByBatch();
- if(mStopped){
- return;
- }
- mAllAppsLoaded=true;
- }else{
- onlyBindAllApps();
- }
- }
- ......
- }
- ......
- }
Step 18.LoaderTask.loadAllAppsByBatch
这个函数定义在packages/apps/Launcher2/src/com/android/launcher2/LauncherModel.java文件中:
- publicclassLauncherModelextendsBroadcastReceiver{
- ......
- privateclassLoaderTaskimplementsRunnable{
- ......
- privatevoidloadAllAppsByBatch(){
- ......
- finalIntentmainIntent=newIntent(Intent.ACTION_MAIN,null);
- mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
- finalPackageManagerpackageManager=mContext.getPackageManager();
- List<ResolveInfo>apps=null;
- intN=Integer.MAX_VALUE;
- intstartIndex;
- inti=0;
- intbatchSize=-1;
- while(i<N&&!mStopped){
- if(i==0){
- mAllAppsList.clear();
- ......
- apps=packageManager.queryIntentActivities(mainIntent,0);
- ......
- N=apps.size();
- ......
- if(mBatchSize==0){
- batchSize=N;
- }else{
- batchSize=mBatchSize;
- }
- ......
- Collections.sort(apps,
- newResolveInfo.DisplayNameComparator(packageManager));
- }
- startIndex=i;
- for(intj=0;i<N&&j<batchSize;j++){
- //Thisbuildstheiconbitmaps.
- mAllAppsList.add(newApplicationInfo(apps.get(i),mIconCache));
- i++;
- }
- finalbooleanfirst=i<=batchSize;
- finalCallbackscallbacks=tryGetCallbacks(oldCallbacks);
- finalArrayList<ApplicationInfo>added=mAllAppsList.added;
- mAllAppsList.added=newArrayList<ApplicationInfo>();
- mHandler.post(newRunnable(){
- publicvoidrun(){
- finallongt=SystemClock.uptimeMillis();
- if(callbacks!=null){
- if(first){
- callbacks.bindAllApplications(added);
- }else{
- callbacks.bindAppsAdded(added);
- }
- ......
- }else{
- ......
- }
- }
- });
- ......
- }
- ......
- }
- ......
- }
- ......
- }
- finalIntentmainIntent=newIntent(Intent.ACTION_MAIN,null);
- mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
- finalPackageManagerpackageManager=mContext.getPackageManager();
下一步就是通过这个PackageManagerService.queryIntentActivities接口来取回所有Action类型为Intent.ACTION_MAIN,并且Category类型为Intent.CATEGORY_LAUNCHER的Activity了。
我们先进入到PackageManagerService.queryIntentActivities函数中看看是如何获得这些Activity的,然后再回到这个函数中来看其余操作。
Step 19.PackageManagerService.queryIntentActivities
这个函数定义在frameworks/base/services/java/com/android/server/PackageManagerService.java文件中:
- classPackageManagerServiceextendsIPackageManager.Stub{
- ......
- publicList<ResolveInfo>queryIntentActivities(Intentintent,
- StringresolvedType,intflags){
- ......
- synchronized(mPackages){
- StringpkgName=intent.getPackage();
- if(pkgName==null){
- return(List<ResolveInfo>)mActivities.queryIntent(intent,
- resolvedType,flags);
- }
- ......
- }
- ......
- }
- ......
- }
回忆前面一篇文章Android应用程序安装过程源代码分析,系统在前面的Step 8中启动PackageManagerService时,会把系统中的应用程序都解析一遍,然后把解析得到的Activity都保存在mActivities变量中,这里通过这个mActivities变量的queryIntent函数返回符合条件intent的Activity,这里要返回的便是Action类型为Intent.ACTION_MAIN,并且Category类型为Intent.CATEGORY_LAUNCHER的Activity了。
回到Step 18中的LoaderTask.loadAllAppsByBatch函数中,从queryIntentActivities函数调用处返回所要求的Activity后,便调用函数tryGetCallbacks(oldCallbacks)得到一个返CallBack接口,这个接口是由Launcher类实现的,接着调用这个接口的.bindAllApplications函数来进一步操作。注意,这里又是通过消息来处理加载应用程序的操作的。
Step 20.Launcher.bindAllApplications
这个函数定义在packages/apps/Launcher2/src/com/android/launcher2/Launcher.java文件中:
- publicfinalclassLauncherextendsActivity
- implementsView.OnClickListener,OnLongClickListener,LauncherModel.Callbacks,AllAppsView.Watcher{
- ......
- privateAllAppsViewmAllAppsGrid;
- ......
- publicvoidbindAllApplications(ArrayList<ApplicationInfo>apps){
- mAllAppsGrid.setApps(apps);
- }
- ......
- }
Step 21.AllApps2D.setApps
这个函数定义在packages/apps/Launcher2/src/com/android/launcher2/AllApps2D.java文件中:
- publicclassAllApps2D
- extendsRelativeLayout
- implementsAllAppsView,
- AdapterView.OnItemClickListener,
- AdapterView.OnItemLongClickListener,
- View.OnKeyListener,
- DragSource{
- ......
- publicvoidsetApps(ArrayList<ApplicationInfo>list){
- mAllAppsList.clear();
- addApps(list);
- }
- publicvoidaddApps(ArrayList<ApplicationInfo>list){
- finalintN=list.size();
- for(inti=0;i<N;i++){
- finalApplicationInfoitem=list.get(i);
- intindex=Collections.binarySearch(mAllAppsList,item,
- LauncherModel.APP_NAME_COMPARATOR);
- if(index<0){
- index=-(index+1);
- }
- mAllAppsList.add(index,item);
- }
- mAppsAdapter.notifyDataSetChanged();
- }
- ......
- }
到了这里,系统默认的Home应用程序Launcher就把PackageManagerService中的应用程序加载进来了,当我们在屏幕上点击下面这个图标时,就会把刚才加载好的应用程序以图标的形式展示出来了:
点击这个按钮时,便会响应Launcher.onClick函数:
- publicfinalclassLauncherextendsActivity
- implementsView.OnClickListener,OnLongClickListener,LauncherModel.Callbacks,AllAppsView.Watcher{
- ......
- publicvoidonClick(Viewv){
- Objecttag=v.getTag();
- if(taginstanceofShortcutInfo){
- ......
- }elseif(taginstanceofFolderInfo){
- ......
- }elseif(v==mHandleView){
- if(isAllAppsVisible()){
- ......
- }else{
- showAllApps(true);
- }
- }
- }
- ......
- }
- publicfinalclassLauncherextendsActivity
- implementsView.OnClickListener,OnLongClickListener,LauncherModel.Callbacks,AllAppsView.Watcher{
- ......
- voidshowAllApps(booleananimated){
- mAllAppsGrid.zoom(1.0f,animated);
- ((View)mAllAppsGrid).setFocusable(true);
- ((View)mAllAppsGrid).requestFocus();
- //TODO:fadethesetwotoo
- mDeleteZone.setVisibility(View.GONE);
- }
- ......
- }
当点击上面的这些应用程序图标时,便会响应AllApps2D.onItemClick函数:
- publicclassAllApps2D
- extendsRelativeLayout
- implementsAllAppsView,
- AdapterView.OnItemClickListener,
- AdapterView.OnItemLongClickListener,
- View.OnKeyListener,
- DragSource{
- ......
- publicvoidonItemClick(AdapterViewparent,Viewv,intposition,longid){
- ApplicationInfoapp=(ApplicationInfo)parent.getItemAtPosition(position);
- mLauncher.startActivitySafely(app.intent,app);
- }
- ......
- }<spanstyle="font-family:Arial,Verdana,sans-serif;"><spanstyle="white-space:normal;">
- </span></span>
这里的成员变量mLauncher的类型为Launcher,于是就调用Launcher.startActivitySafely函数来启动应用程序了,这个过程具体可以参考Android应用程序启动过程源代码分析一文。
相关推荐
(Android系统进程Zygote启动过程的源代码分析UML,Android系统默认Home应用程序(Launcher)的启动过程源代码分析uml,Android系统在新进程中启动自定义服务过程(startService)的原理分析UML,Android应用程序...
android系统从systemserver开始的launcher启动详细流程.doc
Android系统默认Home应用程序(Launcher)的启动过程源代码分析
Launcher-mango,基于Android8.0Launcher3源代码的Launcher应用程序.zip
Android 8.0 Launcher3 的源代码 ,修改了系统原有的Launcher3的自定义权限冲突。
android 4.4 Launcher3 源代码
7.1 8.1 9.0 10.0 两个launcher之间切换,设置默认launcher
android整个Launcher2模块的应用层源代码,供大家学习。
Android Launcher源码下载,PagedView,PagedViewIcon
介绍android系统启动第三阶段,即launcher的详细启动流程
更改官方的Launcher3使得可以在Android Studio编译 原始地址,从5892520提交开始 最小sdk版本为16 Android 5.0 版本及以上可能会出现因为相同权限声明而不能安装的问题 如果你想要可以在Eclipse编译的版本,可以看...
安卓Android源码——安卓Android Launcher 桌面分页滑动代码.rar
修改适配好的Launcher2源代码,亲测Android studio可以编译通过,可以调试运行,可以放心下载使用。
(系统级,不是app)android 4.4 Launcher3 源代码
android系统launcher
Android 取消系统默认 launcher3的home属性,保证第三方的launcher正常使用.patch
android4.0的launcher2源代码
基本Android 6.0源代码。将所有应用程序抽屉替换为桌面上的所有应用程序。
在开发锁屏时,如果利用launcher来实现屏蔽home键,那么程序就会被重复启动。 这个方法可以避免。
Android 源码中得Launcher源代码,很多东西值得学习