【第22期】观点:IT 行业加班,到底有没有价值?

Android知识点总结--第四篇

原创 2016年08月31日 14:45:40

四大组件简单介绍

Activity:一种展示型组件。
Activity的启动由Intent触发,可以分为显示Intent和隐式Intent。
Service:一种计算型组件,用于执行一系列计算任务。
本身运行在主线程中,耗时操作仍然在单独的线程中完成。有启动服务和绑定服务两种。绑定服务可以进行数据交互操作。
BroadcastReceiver:是一种消息型组件,用于在不同组件乃至不同应用之间传递消息。
包括静态注册和动态注册两种。静态注册在安装时会被系统解析,不需要启动应用就可以接受到相关的广播。动态注册需要通过Context.registerReceiver()和Context.unRegisterReceiver()两种方法来注册和解除广播。
ContentProvider:一种数据共享型组件。内部需要实现增删改查操作,这些操作需要处理好线程同步操作。

Activity

Activity启动过程简单介绍:
第一步:
startActivity方法最终会调用startActivityForResult()方法。ApplicationThread是ActivityThread中的一个内部类。当mParent==null的时候,会调用Instrumentation的execStartActivity方法。在这个方法里面,会调用ActivityManagerNative.getDefault()的startActivity方法。ActivityManagerNative继承自Binder并实现了IActivityManager这个Binder接口,而ActivityManagerService继承自ActivityManagerNative,所以AMS也是一个Binder。现在分析到了Actiivty的启动是由AMS的startActivity方法来实现的。

第二步:
再来分析一下Instrumentation的execStartActivity方法的checkStartActivityResult(result,intent)方法。目的就是为了检查启动Activity的启动结果。

第三步:
接着分析AMS的startActivity方法。先调用StartActivityAsUser方法,然后转移到了ActivityStackSupervisor的startActivityMayWait方法中,在StartActivityMayWait方法中又调用了startActivityLocked方法,然后startActivityLocked方法又调用了startActivityUncheckedLocked方法,接着startActivityUncheckedLocked方法又调用了ActivityStack的resumeTopActivityLocked方法,这时候启动过程从ActivityStackSupervisor转移到了ActivityStack方法中。

第四步:
在ActivityStack的resumeTopActivityLocked方法中又调用了resumeTopActivityInnerLocked方法。resumeTopActivityInnerLocked方法又调用了ActivityStackSupervisor的startSpecificActivityLocked方法。在startSpecificActivityLocked方法中调用了realStartActivityLocked方法。

第五步:
在realStartActivityLocked方法中会调用app.thread.scheduleLaunchActivity()方法。其中app.thread是IApplicationThread类型。而IApplicationThread的实现者是ActivityThread中的内部类ApplicationThread。ApplicationThread继承自ApplicationThreadNative类,而ApplicationThreadNative类继承了Binder并实现了IApplicationThread接口。ApplicationThreadNative是IApplicationThread的实现者,由于ApplicationThreadNative被系统定义为抽象类,所有ApplicationThread就成了IApplicationThread的实现者。

第六步:
Activity的启动过程最终到了ApplicationThread中,ApplicationThread通过scheduleLaunchActivity方法来启动Activity。在scheduleLaunchActivity中实现很简单,就是通过发送一个启动Activity的消息来交给Handler(H)处理。在H中对LAUNCH_ACTIVITY这个消息进行处理,然后调用ActivityThread中的handleLaunchActivity来实现。在handleLaunchActivity中通过调用performLaunchActivity方法来最终完成Activity对象的创建和启动过程。通过handleResumeActivity方法来调用被启动Activity的onResume生命周期。

第七步:
在performLaunchActivity这个方法中主要做的事情是:

  1. 从ActivityClientRecord中获取待启动的Activity的组件信息。
  2. 通过Instrumentation的newActivity方法使用类加载器创建Activity对象。
  3. 通过LoadedApk的makeApplication方法来尝试创建Application对象。Application对象的创建也是通过Instrumentation来完成的,都是通过类加载器来完成的。Application创建完毕后,会通过Instrumentation的callApplicationOnCreate来调用Application的onCreate方法。
  4. 创建ContextImpl对象并通过Activity的attach方法来完成重要数据的初始化操作。ContextImpl是通过Activity的attach方法来和Activity建立关联的,在attch方法中Activity还完成Window的创建并建立自己和Window的关联。
  5. 调用Activity的onCreate方法。

下面是几个比较重要的类之间的关系图:
比较重要的几个类之间的调用

Service简单介绍

Service的启动过程:

从ContextWrapper的startService开始,在ContextImpl中,startService方法会调用startServiceCommon方法,而startServiceCommon方法会通过ActivityManagerNative.getDefault()方法来启动一个服务。AMS启动服务的行为是一个远程过程调用。在AMS中会通过mService这个对象来完成Service的后续启动过程。
其中mServices对象的类型是ActiveServices,ActiveServices是一个辅助AMS进行Service管理的类。在ActiveServices的startServiceLocked方法的尾部会调用startServiceInnerLocked方法。ServiceRecord描述的是一个Service记录。在startServiceInnerLocked方法并没有完成具体的启动工作,而是交给bringUpServiceLocked方法,而bringUpServiceLocked方法又调用了realStartServiceLocked方法。
在realStartServiceLocked方法中通过app.thread的scheduleCreateService方法来创建Service对象并调用其onCreate方法,接着再通过sendServiceArgsLocked方法来调用Service的其他方法比如onStartCommand方法。这两个进程均是进程间通信。在scheduleCreateService方法中通过发送消息给Handler H,H接收到消息以后通过ActivityThread的handleCreateService方法来完成Service的最终启动。

Service的绑定过程

Service的绑定构成也是从ContextWrapper开始的。ContextImpl的bindService方法最终会调用自己的bindServiceCommon方法。
bindServiceCommon方法主要完成两件事:
1.先将客户端的ServiceConnection对象转化为ServiceDispatcher.InnerConnection对象。不能直接使用ServiceConnection对象,因为服务的绑定可能是跨进程的。ServiceConnection对象必须用Binder才能让远程服务端回调自己的方法,这就是ServiceDispatcher的内部类InnerConnection的作用。ServiceDispatcher连接ServiceConnection和InnerConnection。这个过程是LoadedApk的getServiceDispatcher方法来完成的。在getServiceDispatcher方法中定义的mServices变量是一个ArrayMap,key值是ServiceConnection,value值是ServiceDispatcher,在ServiceDispatcher内部也保存了ServiceConnection和InnerConnection对象。当Service和客户端建立连接以后,系统会通过InnerConnection来调用ServiceConnection中的onServiceConnected方法,这个过程可能是跨进程的。当ServiceDispatcher创建好以后,getServiceDispatcher会返回其保存的InnerConnection对象。
2.接着bindServiceCommon方法会通过AMS来完成Service的具体绑定过程。对应AMS的bindService方法。AMS会调用ActiveServices的bindServiceLocked,再调用bringUpServiceLocked,再调用realStartServiceLocked方法。最终会通过ApplicationThread来完成Service实例的创建并执行onCreate方法。绑定过程通过调用app.thread的scheduleBindService来完成。
对于ApplicationThread的一系列以schedule开头的方法,内部都是通过Handler H来完成的。H内部,接收到BIND_SERVICE消息以后,会交给ActivityThread的handleBindService方法来处理。在handleBindService方法中,首先根据Service的token取出Service对象,然后调用Service的onBind方法,在onBind方法中会返回一个Binder对象给客户端使用。通过调用客户端的onServiceConnected方法来通知客户端已经绑定服务成功了。这个过程是通过AMS的publishService方法来完成的。当多次绑定一个Service时,Service的onBind方法只会执行一次,除非Service终止了。
ServiceDispatcher.InnerConnection的connected()方法又调用了ServiceDispatcher的connected方法。对于Service的绑定,ServiceDispatcher的mActivityThread是一个Handler,在connected()方法中会调用mActivityThread.post(new RunConnection())方法。通过post方法runConnection就运行在主线程中了,在runConnection的run方法中调用了ServiceDispatcher的doConnected方法,由于ServiceDispatcher内部保存了客户端的ServiceConnection对象,所以它会很方便地调用ServiceConnection对象的onServiceConnected方法。

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

Android小知识点总结-持续更新

1.Android 计算透明度  255 * 透明度百分比 ,再转换成16进制。

Android 学习 之 一些应该注意的知识点总结(二)

1.何谓UI线程:主要负责界面的响应以及绘制界面元素。   通过SWT编程的一个小例子说明一下: 以下代码,编过SWT应用程序的读者会非常熟悉。它一般出现在main函数的结尾。下面来仔细分析一下它的详细情况。 //当窗口未释放时 while (!shell.isDisposed(...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

Android Webview知识点和遇到过的坑全总结

WebView 用来显示网页的一个View,它使用WebKit渲染引擎显示web页面,可以加载在线的或者本地的html页面,WebView可以对页面进行一系列操作,如历史页面的向前、向后,放大和缩小,...

android 小知识点

1.让组件获得焦点: 2.设置全屏或无标题栏:a.AndroidManifest.xml文件中,android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:theme="@android:st...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)