Android系统默认Home应用程序(Launcher)的启动过程源代码分析(5)

简介:

     Step 19. PackageManagerService.queryIntentActivities

       这个函数定义在frameworks/base/services/java/com/android/server/PackageManagerService.java文件中:


  
  
  1. class PackageManagerService extends IPackageManager.Stub {   
  2.     ......   
  3.    
  4.     public List<ResolveInfo> queryIntentActivities(Intent intent,   
  5.             String resolvedType, int flags) {   
  6.         ......   
  7.    
  8.         synchronized (mPackages) {   
  9.             String pkgName = intent.getPackage();   
  10.             if (pkgName == null) {   
  11.                 return (List<ResolveInfo>)mActivities.queryIntent(intent,   
  12.                         resolvedType, flags);   
  13.             }   
  14.    
  15.             ......   
  16.         }   
  17.    
  18.         ......   
  19.     }   
  20.    
  21.     ......   
  22. }   

     回忆前面一篇文章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文件中: 


  
  
  1. public final class Launcher extends Activity   
  2.         implements View.OnClickListener, OnLongClickListener, LauncherModel.Callbacks, AllAppsView.Watcher {   
  3.     ......   
  4.    
  5.     private AllAppsView mAllAppsGrid;   
  6.    
  7.     ......   
  8.    
  9.     public void bindAllApplications(ArrayList<ApplicationInfo> apps) {   
  10.         mAllAppsGrid.setApps(apps);   
  11.     }   
  12.    
  13.     ......   
  14. }   

这里的mAllAppsGrid是一个AllAppsView类型的变量,它的实际类型一般就是AllApps2D了。

 

        Step 21. AllApps2D.setApps

        这个函数定义在packages/apps/Launcher2/src/com/android/launcher2/AllApps2D.java文件中:


  
  
  1. public class AllApps2D   
  2.     extends RelativeLayout   
  3.     implements AllAppsView,   
  4.         AdapterView.OnItemClickListener,   
  5.         AdapterView.OnItemLongClickListener,   
  6.         View.OnKeyListener,   
  7.         DragSource {   
  8.    
  9.     ......   
  10.    
  11.     public void setApps(ArrayList<ApplicationInfo> list) {   
  12.         mAllAppsList.clear();   
  13.         addApps(list);   
  14.     }   
  15.    
  16.     public void addApps(ArrayList<ApplicationInfo> list) {   
  17.         final int N = list.size();   
  18.    
  19.         for (int i=0; i<N; i++) {   
  20.             final ApplicationInfo item = list.get(i);   
  21.             int index = Collections.binarySearch(mAllAppsList, item,   
  22.                 LauncherModel.APP_NAME_COMPARATOR);   
  23.             if (index < 0) {   
  24.                 index = -(index+1);   
  25.             }   
  26.             mAllAppsList.add(index, item);   
  27.         }   
  28.         mAppsAdapter.notifyDataSetChanged();   
  29.     }   
  30.    
  31.     ......   
  32. }   

    函数setApps首先清空mAllAppsList列表,然后调用addApps函数来为上一步得到的每一个应用程序创建一个ApplicationInfo实例了,有了这些ApplicationInfo实例之后,就可以在桌面上展示系统中所有的应用程序了。

 

        到了这里,系统默认的Home应用程序Launcher就把PackageManagerService中的应用程序加载进来了,当我们在屏幕上点击下面这个图标时,就会把刚才加载好的应用程序以图标的形式展示出来了:

   点击这个按钮时,便会响应Launcher.onClick函数:


  
  
  1. public final class Launcher extends Activity   
  2.         implements View.OnClickListener, OnLongClickListener, LauncherModel.Callbacks, AllAppsView.Watcher {   
  3.     ......   
  4.    
  5.     public void onClick(View v) {   
  6.         Object tag = v.getTag();   
  7.         if (tag instanceof ShortcutInfo) {   
  8.             ......   
  9.         } else if (tag instanceof FolderInfo) {   
  10.             ......   
  11.         } else if (v == mHandleView) {   
  12.             if (isAllAppsVisible()) {   
  13.                 ......   
  14.             } else {   
  15.                 showAllApps(true);   
  16.             }   
  17.         }   
  18.     }   
  19.    
  20.     ......   
  21. }   

   接着就会调用showAllApps函数显示应用程序图标:


  
  
  1. public final class Launcher extends Activity   
  2.         implements View.OnClickListener, OnLongClickListener, LauncherModel.Callbacks, AllAppsView.Watcher {   
  3.     ......   
  4.    
  5.     void showAllApps(boolean animated) {   
  6.         mAllAppsGrid.zoom(1.0f, animated);   
  7.    
  8.         ((View) mAllAppsGrid).setFocusable(true);   
  9.         ((View) mAllAppsGrid).requestFocus();   
  10.    
  11.         // TODO: fade these two too   
  12.         mDeleteZone.setVisibility(View.GONE);   
  13.     }   
  14.    
  15.     ......   
  16. }   

这样我们就可以看到系统中的应用程序了:

    当点击上面的这些应用程序图标时,便会响应AllApps2D.onItemClick函数:


  
  
  1. public class AllApps2D   
  2.     extends RelativeLayout   
  3.     implements AllAppsView,   
  4.         AdapterView.OnItemClickListener,   
  5.         AdapterView.OnItemLongClickListener,   
  6.         View.OnKeyListener,   
  7.         DragSource {   
  8.    
  9.     ......   
  10.    
  11.     public void onItemClick(AdapterView parent, View v, int position, long id) {   
  12.         ApplicationInfo app = (ApplicationInfo) parent.getItemAtPosition(position);   
  13.         mLauncher.startActivitySafely(app.intent, app);   
  14.     }   
  15.    
  16.    
  17.     ......   
  18. }<span style="font-family:Arial, Verdana, sans-serif;"><span style="white-space: normal;">   
  19. </span></span>   

 这里的成员变量mLauncher的类型为Launcher,于是就调用Launcher.startActivitySafely函数来启动应用程序了,这个过程具体可以参考Android应用程序启动过程源代码分析一文。





本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/966536,如需转载请自行联系原作者

目录
相关文章
|
9月前
|
存储 Android开发
如何查看Flutter应用在Android设备上已被撤销的权限?
如何查看Flutter应用在Android设备上已被撤销的权限?
408 64
|
11月前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
784 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
11月前
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
371 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
345 14
|
Java Linux 数据库
探索安卓开发:打造你的第一款应用
在数字时代的浪潮中,每个人都有机会成为创意的实现者。本文将带你走进安卓开发的奇妙世界,通过浅显易懂的语言和实际代码示例,引导你从零开始构建自己的第一款安卓应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇门,让你的创意和技术一起飞扬。
247 13
|
搜索推荐 前端开发 测试技术
打造个性化安卓应用:从设计到开发的全面指南
在这个数字时代,拥有一个定制的移动应用不仅是一种趋势,更是个人或企业品牌的重要延伸。本文将引导你通过一系列简单易懂的步骤,从构思你的应用理念开始,直至实现一个功能齐全的安卓应用。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你提供必要的工具和知识,帮助你将创意转化为现实。
|
Java Android开发 开发者
探索安卓开发:构建你的第一个“Hello World”应用
在安卓开发的浩瀚海洋中,每个新手都渴望扬帆起航。本文将作为你的指南针,引领你通过创建一个简单的“Hello World”应用,迈出安卓开发的第一步。我们将一起搭建开发环境、了解基本概念,并编写第一行代码。就像印度圣雄甘地所说:“你必须成为你希望在世界上看到的改变。”让我们一起开始这段旅程,成为我们想要见到的开发者吧!
251 0
|
3月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
371 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
3月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
378 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
3月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
831 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡

热门文章

最新文章