从点击桌面应用图标到应用显示的过程我们再熟悉不过了,下面我们来分析下这个过程都做了什么。
本文主要对以下问题分析:
如不了解 Android 是如何从开机到 Launcher 启动的过程,请先阅读 Android - 系统启动过程
我们知道 Android 系统启动后已经启动了 Zygote,ServiceManager,SystemServer 等系统进程;ServiceManager 进程中完成了 Binder 初始化;SystemServer 进程中 ActivityManagerService,WindowManagerService,PackageManagerService 等系统服务在 ServiceManager 中已经注册;最后启动了 Launcher 桌面应用。
其实 Launcher 本身就是一个应用程序,运行在自己的进程中,我们看到的桌面就是 Launcher 中的一个 Activity。
应用安装的时候,通过 PackageManagerService 解析 apk 的 AndroidManifest.xml 文件,提取出这个 apk 的信息写入到 packages.xml 文件中,这些信息包括:权限、应用包名、icon、apk 的安装位置、版本、userID 等等。packages.xml 文件位于系统目录下/data/system/packages.xml。
同时桌面 Launcher 会为安装过的应用生成不同的应用入口,对应桌面上的应用图标,下面分析点击应用图标的到应用启动的过程。
点击 Launcher 中应用图标将会执行以下方法
在 system_server 进程中的服务端 ActivityManagerService 收到 START_ACTIVITY_TRANSACTION 命令后进行处理,调用 startActivity() 方法。
从 Launcher 点击图标,如果应用没有启动过,则会 fork 一个新进程。创建新进程的时候,ActivityManagerService 会保存一个 ProcessRecord 信息,Activity 应用程序中的AndroidManifest.xml 配置文件中,我们没有指定 Application 标签的 process 属性,系统就会默认使用 package 的名称。每一个应用程序都有自己的 uid,因此,这里 uid + process 的组合就可以为每一个应用程序创建一个 ProcessRecord。每次在新建新进程前的时候会先判断这个 ProcessRecord 是否已存在,如果已经存在就不会新建进程了,这就属于应用内打开 Activity 的过程了。
进程创建成功切换至 App 进程,进入 app 进程后将 ActivityThread 类加载到新进程,并调用 ActivityThread.main() 方法
此时只创建了应用程序的 ActivityThread 和 ApplicationThread,和开启了 Handler 消息循环机制,其他的都还未创建, ActivityThread.attach(false) 又会最终到 ActivityMangerService 的 attachApplication,这个工程其实是将本地的 ApplicationThread 传递到 ActivityMangerService。然后 ActivityMangerService 就可以通过 ApplicationThread 的代理 ApplicationThreadProxy 来调用应用程序 ApplicationThread.bindApplication,通知应用程序的 ApplicationThread 已和 ActivityMangerService 绑定,可以不借助其他进程帮助直接通信了。此时 Launcher 的任务也算是完成了。
在 system_server 进程中的服务端 ActivityManagerService 收到 ATTACH_APPLICATION_TRANSACTION 命令后进行处理,调用 attachApplication()。
发送送完 SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION 命令,还会发送 BIND_APPLICATION_TRANSACTION 命令来创建 Application。
在 app 进程中,收到 BIND_APPLICATION_TRANSACTION 命令后调用 ActivityThread.bindApplication()。
ApplicationThreadProxy.bindApplication(…) 会传来这个应用的一些信息,如ApplicationInfo,Configuration 等,在 ApplicationThread.bindApplication 里会待信息封装成AppBindData,通过
将信息放到应用里的消息队列里,通过 Handler 消息机制,在 ActivityThread.handleMeaasge 里处理 H.BIND_APPLICATION 的信息,调用 AplicationThread.handleBindApplication。
Instrumentation:
这时 Application 就创建好了,这点很重要,很多资料里说 Application 是在performLaunchActivity() 里创建的,因为 performLaunchActivity() 也有mInstrumentation.newApplication 这个调用,newApplication() 函数中可看出会先判断是否以及创建了 Application,如果之前已经创建,就返回已创建的 Application 对象。
上面 fork 进程时会发送 SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION 命令,在 app 进程中,收到 SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION 命令后调用 ApplicationThread.scheduleLaunchActivity()。
与 Window 进行关联,具体过程详见: Activity,Window,View 之间的关系
Activity 的整体启动流程如图所示:
安卓应用程序可以通过访问安卓设置应用程序菜单来去除部分界面。你可以找到相应的应用程序,然后点击“应用程序信息”,以便查看它的安装路径以及可用的选项。如果你要完全卸载应用程序,可以点击“卸载”按钮,如果你只想删除部分界面,可以点击“编辑”按钮,以便选择你想要移除的界面。此外,你还可以使用第三方应用程序,如果你想更加细致地去除部分界面。现在的软件应用大致可以分为安卓系统和ios的系统。而iOS系统只适用于苹果软件,不适用于其他的软件。而现在大多数的电子产品,国产的基本上都是安卓系统.随着中国市场的迅速发展。安卓系统比越来越多的人使用,但是怎么样才能做好安卓应用的页面设计呢?
首先我们要想做好安卓应用的页面设计,我们必须对安卓系统进行更深入的了解。充分理解安卓应用所使用的范围和继续开发,研究安卓应用的一些拓展的功能。深入的剖析安卓系统,他的优点和缺点,以及有什么改进的地方。以及改进的方法。
其次我们下一步就是要寻找iOS系统的优点。只要知道自己的不足,和与别人的差距才能更好的提升自己。然后我们要招揽大量的技术人才。科学的研发团队,继续研发的安卓系统,将其变得更好。但是不能模仿,而是要创新。
要想做好安卓应用的页面设计,首先就必须设计出,让人舒服的和色彩分明的页面。能够吸引人们更好的去使用。要吸取别人优秀的经验,不能闭门造车。但是我们并不能丢掉我们原本的风格,不能丢掉我们的理念及观点。盲目模仿他人。从而丢掉自己的特色。
总体而言,就像我们现在的社会主义道路一样。虽然是借鉴恩格斯和马克思他们的先进思想,但是我们还必须结合我们的毛泽东思想和邓小平理论。走出一条属于我们中国的特色的社会主义道路。安卓应用的页面设计也是这样,要结合自己本身的实际情况。设计出独特的,吸引人的设计。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)