四大组件的工作过程

1、四大组件的运行状态                                          

Android的四大组件中除了BroadcastReceiver以外,其他三种组件都必须在AndroidManifest中注册,对于BroadcastReceiver来说,既可以在AndroidManifest中注册也可以通过代码来注册。

在调用方式上,Activity,Service和BroadcastReceiver需要借助Intent,而ContentProvider则无须借助Intent。

Activity组件的主要作用是展示一个界面并和用户交互,扮演的是一种前台界面的角色。

在实际开发中通过Activity的finish方法来结束一个Activity组件的运行。

Activity组件只有一种运行模式,即Activity处于启动状态。

Service是一种计算型组件,用于在后台执行一系列计算任务。

Service组件有两种状态:启动状态和绑定状态。

当Service处于启动状态时,这个时候Service内部可以做一些后台计算,并且不需要和外界有直接的交互。但是耗时的后台计算仍然需要在单独的线程中去完成。

当Service处于绑定状态时,这个时候Service内部同样可以进行后台计算,但是处于这种状态时外界可以很方便地和Service组件进行通信

BroadcastReceiver是一种消息型组件,用于在不同的组件乃至不同的应用之间传递消息。

静态广播:指在AndroidManifest中注册广播,这种广播在应用安装时会被系统解析,此种形式的广播不需要应用启动就可以收到相应的广播。

动态广播:需要通过Context.registerReceiver()来实现,并且不需要的时候要通过Context.unRegisterReceiver()来解除广播。广播不适合执行耗时操作。BroadcastReceiver组件一般来说不需要停止,也没有停止的概念。

ContentProvider是一种数据共享型组件,用于向其他组件乃至其他应用共享数据。

2、Activity的工作过程                                          

Activity的启动过程。

Activity的startActivity方法有好几种重载方式,但它们最终会调用startActivityForResult方法。

ApplicationThread是ActivityThread的一个内部类。

启动Activity真正的实现由ActivityManagerNative.getDefault()的startActivity方法来实现。

ActivityManagerService继承自ActivityManagerNative,而ActivityManagerNative继承自Binder并实现了IActivityManager这个Binder接口,因此AMS是一个Binder,它是IActivityManager的具体实现。

performLaunchActivity方法最终完成了Activity对象的创建和启动过程,并且ActivityThread通过handleResumeActivity方法来调用被启动Activity的onResume这一生命周期方法。

 

performLaunchActivity这个方法主要完成了以下5件事:

a、从ActivityClientRecord中获取待启动的Activity的组件信息;

b、通过Instrumentation的newActivity方法使用类加载器创建Activity对象;

c、通过LoadedApk的makeApplication方法来尝试创建Application对象。

d、创建ContextImpl对象并通过Activity的attach方法来完成一些重要数据的初始化;

e、调用Activity的onCreate方法。

3、Service的工作过程                                          

启动状态:主要用于执行后台计算;

绑定状态:主要用于其他组件和Service的交互。

这两种状态可以共存。

 

通过Context的startService方法可以启动一个Service:

Intent intentService = new Intent(this,MyService.class);

startService(intentService);

 

通过Context的bindService方法即可以绑定的方式启动一个Service:

Intent intentService = new Intent(this,MyService.class);

bindService(intentService,mServiceConnection,BIND_AUTO_CREATE);

Service的启动过程从ContextWrapper的startService开始。

Service的绑定过程从ContextWrapper的bindService开始。

4、BroadcastReceiver的工作过程                      

动态注册的广播需要在合适的时机进行解注册,采用unregisterReceiver方法。

广播的静态注册由PMS(packageManagerService)来完成整个注册过程。

动态注册过程是从ContextWrapper的registerReceiver方法开始的,和Activity和Service一样。

 

广播的发送有几种类型:普通广播、有序广播和粘性广播。

广播的发送开始于ContextWrapper的sendBroadcast方法,由ContextImpl去处理,ComtextImpl直接向AMS发起一个异步请求用于发送广播。

 

5、ContentProvider的工作过程                           

ContentProvider的onCreate方法要先于Application的onCreate方法执行。

当一个应用启动时,入口方法是ActivityThread的main方法,main方法是一个静态方法,在main方法中创建ActivityThread的实例并创建主线程的消息队列,然后再ActivityThread的attach方法中远程调用AMS的attachApplication方法并将ActivityThread对象提供给AMS。

ActivityThread是一个Binder对象,它的Binder接口是IApplicationThread,主要用于ActivityThread和AMS之间的通信。

转载于:https://www.cnblogs.com/fankongkong/p/7484835.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/399904.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

联系表单 1_copy

你的名字 &#xff08;必填&#xff09; [text* your-name] 你的邮箱 &#xff08;必填&#xff09; [email* your-email] 主题 [text your-subject] 你的留言 [textarea your-message] [submit "发送"] [your-subject] [your-name] < [your-email]> 发件人…

Windows下使用VisualSVN Server搭建SVN服务器

2019独角兽企业重金招聘Python工程师标准>>> 使用 VisualSVN Server来实现主要的 SVN功能则要比使用原始的 SVN和Apache相配合来实现源代码的 SVN管理简单的多&#xff0c;下面就看看详细的说明。 VisualSVN Server的下载地址如下&#xff0c;是免费的&#xff0c;随…

新装的linux系统,用SSH连接出现乱码怎么办?附改名虚拟机文件方法

原因&#xff1a;SSH不支持中文&#xff0c;需要系统语言设置 1、查看当前操作系统的语言 echo $LANG 2、临时更改默认语言(关闭当前会话失效) export LANGen_US.UTF-8 3、永久生效,编辑文件保存并退出 vi /etc/sysconfig/i18n LANG"en_US.UTF-8" 4、使其…

hdu 6183 线段树的空间优化

题意&#xff1a; 一个空的坐标系&#xff0c;有④种操作&#xff1a;①1 x y c表示在(x, y)点染上颜色c&#xff1b;②2 X y1 y2表示查询在(1, y1)到(X, y2)范围内有多少种不同的颜色&#xff1a; ③0表示清屏&#xff1b;④3表示程序退出&#xff08;0<x, y<1000000, 0…

js 判断数据是否为空

// var a ""; // var a " "; // var a null; // var a undefined; // var a []; // var a {}; // var a NaN;if(a undefined) { // 只能用 运算来测试某个值是否是未定义的console.log("为undefined");}if(a nul…

Aspx 页面生命周期

ASP.NET 页运行时&#xff0c;此页将经历一个生命周期&#xff0c;在生命周期中将执行一系列处理步骤。这些步骤包括初始化、实例化控件、还原和维护状态、运行事件处理程序代码以及进行呈现。了解页的生命周期非常重要&#xff0c;这样就能在合适的生命周期阶段编写代码&#…

Python 练习册,每天一个小程序

Python 练习册&#xff0c;每天一个小程序说明&#xff1a;Python 练习册&#xff0c;每天一个小程序。注&#xff1a;将 Python 换成其他语言&#xff0c;大多数题目也适用不会出现诸如「打印九九乘法表」、「打印水仙花」之类的题目点此链接&#xff0c;会看到每个题目的代码…

添加永久路由的方法

配置文件配置路由的方法&#xff1a; 直接编辑/etc/sysconfig/static-routes&#xff1a; vim /etc/sysconfig/static-routes 根据需要配置&#xff0c;比如&#xff1a; 192.168.90.52增加一条路由 172.0.0.0\8 指向 192.168.91.12 默认网关不变&#xff0c;增加的路由&am…

CentOS/Linux 解决 SSH 连接慢

现在连接linux服务器一般都是使用SSH远程连接的方式。最近新装了一台服务器&#xff0c;发现telnet时速度很快&#xff0c;ping时一切也正常&#xff0c;但SSH连接的时候却很慢。经过网上资料查询&#xff0c;大致是有以下几种原因&#xff1a; 1、SERVER的SSHD会去DNS查找访问…

在浏览器控制台输出内容 console.log(string);

在浏览器控制台中写如数据 1添加 <script type"text/javascript">djConfig { isDebug: true };</script> 在<script>写入需要输出的内容 <script> 如&#xff1a; 1 2 3 4 5 6 7 8 dojo.require("esri.map"); fu…

php支付宝开发

1.下载对应的接口demo&#xff0c;注意退款有无密和有密 2.根据接口代码编写&#xff0c;要注意notify_url和return_url不能带有额外参数&#xff0c;并且notify_url中途不能含有跳转&#xff0c;否则post数据会丢失 3.密钥的配置&#xff0c;根据openssl生成密钥和私钥&#x…

不同网段虚拟机,互相访问时的路由配置,附路由知识学习

事情实例&#xff1a; 虚拟主机&#xff1a;192.168.90.247需要访问192.168.91.XX网段的数据库&#xff0c;无法访问。 1、这里要考虑一下添加一个路由&#xff0c;目的地址为192.168.91.XX,掩码为255.255.255.0&#xff0c;网关为如图所示 2、这里添加一个路由为&#xff1a;…

iOS使用自定义字体(添加字体包)

转载请注明出处&#xff01;&#xff01;&#xff01; 首先是最简单也普遍的做法&#xff0c;打包内置字符库文件&#xff1a; 步骤如下&#xff1a; 1.第一步找到你想用的字体的 ttf 格式。加入到你的工程的resouce目录下。 2.在工程的plist中AddRow&#xff0c;“Fonts provi…

zookeeper 应用开发

由于zookeeper的client只有zookeeper一个对象&#xff0c;使用也比较简单&#xff0c;所以就不许要文字说明了&#xff0c;在代码中注释下就ok 了。 1、测试用的main方法 package ClientExample; public class TestMain { public static void main(String[] args) { /* * …

CentOS 下安装xdebug

在CentOS 6.x 的系统中&#xff0c;是集成xdebug 的&#xff0c; yum install php-pecl-xdebug 如果是CentOS.5 也可能通过安装安装 epel 来安装 rpm -ivh http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm 然后 yum install php-pecl-xdebug 再在p…

TP5:框架下载与安装——1

哪里下载&#xff1f; 一、百度搜索&#xff1a;ThinkPHP5.0完全开发手册 可以在找到安装TP5的介绍&#xff0c;分别有官网下载安装、Composer安装、Git安装三种方式下载 二、下载好文件 这里我们选择了GIT方式安装&#xff0c;要注意的是&#xff0c;要同时下载应用项目和核…

python 判断字符串是否为空用什么方法?

s if s.strip():print s is null #或者 if not s.strip():print s is null

游戏密保卡图片识别

识别主要步骤 1.图像预处理。包括确认图片有效区域&#xff0c;灰度化&#xff0c;二值化。 2.字符分割。即将识别信息最小化。由于密保卡图片文字宽度固定且无粘连&#xff0c;只需要使用固定宽度切割。 3.对分割后的信息提取特征,建立特征库 4.提取特征和特征库样本进行匹配&…

基于visual Studio2013解决C语言竞赛题之0505选数

&#xfeff;&#xfeff;题目解决代码及点评/************************************************************************/ /* 5&#xff0e; 输入N个数到数组中&#xff0c;选出其中最大的数和最小的数&#xff0c;并分别将它们与最前面和最后面的数互换 */ /*************…

java PKCS7Padding 加密Cannot find any provider supporting AES/CBC/PKCS7Padding 解决办法

在java中用aes256进行加密&#xff0c;但是发现java里面不能使用PKCS7Padding&#xff0c;而java中自带的是PKCS5Padding填充&#xff0c;那解决办法是&#xff0c;通过BouncyCastle组件来让java里面支持PKCS7Padding填充。 説辣么多不如上代码&#xff1a; public class AESUt…