android核心系列--1,组件生命周期
一,进程模型及进程托管
http://www.cnblogs.com/smyhvae/p/4070518.html
1 ) Service默认是运行在主线程中的;Android中的后台指的是运行不依赖UI,即使APP关闭,只要进程还在,Service就可以继续运行。
2)服务一旦启动后,就一直处于运行状态,只有调用stopService 或者 stopSelf 方法才会让服务停止下来。
3)通过调用方式首次启动服务会执行 onCreate方法,然后执行 onStartCommand方法,如果服务没有停止,再次调用服务会直接执行 onStartCommand方法。
4)服务的onStartCommand方法的返回值:
a START_STICKY: 服务进程被kill后,后续如果资源运行系统会重新启动服务,并执行onStartCommand方法,但不会保留之前传送的Intent对象,除非有组件重新发送。
例如音乐应用,返回这种值的服务要在适当的时候手动调用代码关闭服务。
b START_REDELIVER_INTENT 系统会自动重启该服务,并会将Intent传入。重新发送后,flags参数的值会变成 Service.FLAG_START_REDELIVERY
c START_NOT_STICKY: 服务被终止后就不会再启动。
5)IntentServer 是一个异步的,会自动关闭的服务,它的 onHandleIntent方法是在单独的子线程中执行的,该服务每次只会启动一个线程来执行任务,多个任务会排成工作队列,顺序执行。 onHandleIntent执行完毕后服务会自动停止,即会调用 onDestroy方法。
6)Service必须在没有和其它组件关联(调用unbindService方法),并且已经停止(调用stopService)的情况下才会被销毁(执行onDestroy方法),单独解除关联或者停止服务并不会销毁服务。
7)绑定方式启动服务:bindService方法是异步的,被调用后会立即返回,并不会返回IBinder对象,要接收IBinder对象,必须要实现一个ServiceConnection实例,并将该实例传递给bindService方法,绑定成功后系统会先调用onBind方法,该方法的返回值就是一个IBinder对象,然后回调ServiceConnection的onServiceConnected方法,并将IBinder对象通过参数传递进来,然后我们就可以在该方法中调用IBinder的方法了。
通过这种方式启动的服务,我们一般会在服务内部建立一个继承Binder的内部类,该内部类里面提供一些公共方法,用来向外公开服务的功能,当其它组件和服务建立关联后,就会通过得到的IBinder实例来调用服务的功能了。
重复调用unbindService会引发异常,所以需要在程序里面做一些判断。
8)started服务和bind服务的区别:(摘自:http://www.cnblogs.com/smyhvae/p/4070518.html )
区别一:生命周期
通过started方式的服务会一直运行在后台,需要由组件本身或外部组件来停止服务才会以结束运行
bind方式的服务,生命周期就要依赖绑定的组件
区别二:参数传递
started服务可以给启动的服务对象传递参数,但无法获取服务中方法的返回值
bind服务可以给启动的服务对象传递参数,也可以通过绑定的业务对象获取返回结果
实际开发中的技巧;
第一次先使用started方式来启动一个服务
之后可以使用bind的方式绑定服务,从而可以直接调用业务方法获取返回值
9)Service生命周期图 :(摘自:http://www.cnblogs.com/smyhvae/p/4070518.html )

10)使用bindService进行IPC通信的步骤:
注意:触发器无法绑定服务。
10.1) 在Android进行进程间通信,需要通过 IBinder/Binder 框架来实现,IBinder/Binder 接口就是Android远程对象的基本接口,描述与远程对象进行通信的协议(即如何调用远程对象,远程对象都有哪些功能)。
AIDL 可以用于让某个Service与多个应用的组件进行跨进程通信,即实现了一个Service被多个应用共享的功能。一般用AIDL来描述需要被客户端调用的接口,它以.aidl 文件的形式存在,内部书写方式和普通java类的书写方式一样。注意:aidl文件只是起一个模板作用,真正起作用的是ADT根据aidl文件生成的那个.java文件。
这个java文件会按照 aidl的描述生成一个继承自android.os.IInterface的接口A,接口A内部有一个静态抽象类 Stub,Stub类会继承 android.os.Binder类并实现接口A,
Stub类内部还有一个内部静态类Proxy,Proxy也实现了接口A,Proxy内部有一个IBinder对象,这个Proxy就是实现真正的跨进程调用使用的。
10.2) 新建一个类 AImpl ,这个类实现 A.Stub接口,这个AImpl就是业务对象。
10.3)新建一个Service ,内部声明一个 AImpl类型的变量 mBinder,并且在 onBind方法中返回该变量。
11)如果将Service的配置改为: android:process=":remote",那么界面组件和服务组件就会运行在不同的进程中,此时就不能直接绑定服务了,而只能通过IPC调用服务了。
另外如果跨进程调用远程的Service,就需要使用隐式Intent了,无法使用显式Intent。并且如果A应用要调用B应用中的接口,需要将B应用中aidl文件原样拷贝到A应用中,包括包名。
12)通过Messenger来实现IPC通信,底层依然使用的是AIDL,具体来说就是在调用端建立一个Messenger,并在绑定Service的时候将Messenger和Binder绑定(messenger = new Messenger(binder); ); 在被调用端的Service中,也新建一个Messenger,同时新建一个Handler,并让它和Messenger绑定(当消息来时让Handler来处理),然后在onBind方法中直接 return messenger.getBinder(); 返回Binder,这样Messenger和Binder就绑定好了; 这样两个Messenger绑定到同一个Binder上了,就可以通信了,这种方式是线程安全的和同步方式执行的。
3,触发器组件生命周期
触发器组件的生命周期就是onReceive方法,该方法一执行完毕会立即被系统回收。
onReceive方法执行时,触发器所在进程为前台进程。
onReceive方法在主线程中执行,执行时长超过10秒会变为无响应进程,有被强制回收的风险。
4,数据源组件生命周期
数据源组件在被构造时,onCreate方法会被调用,而且一旦被构造就会一直存在,直到所在进程被回收。
5,应用环境对象的生命周期
与进程生命周期一样长,被构造时onCreate方法会被调用,被销毁时onTerminate方法会被调用(也可能不会调用)。
android核心系列--1,组件生命周期的更多相关文章
- Android组件生命周期(二)
引言 应用程序组件有一个生命周期——一开始Android实例化他们响应意图,直到结束实例被销毁.在这期间,他们有时候处于激活状态,有时候处于非激活状态:对于活动,对用户有时候可见,有时候不可见.组件生 ...
- Android组件生命周期(一)
引言 应用程序组件有一个生命周期——一开始Android实例化他们响应意图,直到结束实例被销毁.在这期间,他们有时候处于激活状态,有时候处于非激活状态:对于活动,对用户有时候可见,有时候不可见.组件生 ...
- 【转】Android总结篇系列:Activity生命周期
[转]Android总结篇系列:Activity生命周期 Android官方文档和其他不少资料都对Activity生命周期进行了详细介绍,在结合资料和项目开发过程中遇到的问题,本文将对Activity ...
- Android应用常规开发技巧——善用组件生命周期
数据管理 对于仅仅读数据.一种经常使用的管理模式是在onCreate函数中进行数据的载入,直到组件的onDestory函数被调用时在进行释放. // 缓存仅仅读的数据 private Object r ...
- angular2系列教程(五)Structural directives、再谈组件生命周期
今天,我们要讲的是structural directives和组件生命周期这两个知识点.structural directives顾名思义就是改变dom结构的指令.著名的内建结构指令有 ngIf, n ...
- DataSnap 2009 系列之三 (生命周期篇)
DataSnap 2009 系列之三 (生命周期篇) DataSnap 2009的服务器对象的生命周期依赖于DSServerClass组件的设置 当DSServer启动时从DSServerClass组 ...
- 【转】Tomcat组件生命周期管理
Tomcat组件生命周期管理 Tomcat中Server,Service,Connector,Engine,Host,Context,它们都实现了org.apache.catalina.Lifecyc ...
- React.js 小书 Lesson20 - 更新阶段的组件生命周期
作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson20 转载请注明出处,保留原文链接和作者信息. 从之前的章节我们了解到,组件的挂载指的是将组件 ...
- React组件生命周期小结
React组件生命周期小结 下面所写的,只适合前端的React.(React也支持后端渲染,而且和前端有点小区别,不过我没用过.) 相关函数 简单地说,React Component通过其定义的几个函 ...
随机推荐
- Dictionary(数据字典)
数据字典:Dictionary对象用于在结对的名称/值中存储信息(等同于键和项目),其可作为传参使用. C# Dictionary字典类的使用方法 //定义字典 Dictionary<strin ...
- Javascript 基准测试
http://bubkoo.com/2014/02/18/bulletproof-javascript-benchmarks/
- http_load测试入门
大致步骤: 1.在对应文件夹下边新建.TXT文件: 2.在该文件下填上待测试URL地址,建议100行以上: 3.管理员权限CMD,对应目录下运行命令即可,如: a) http_load -pa ...
- 2 DDD理论学习2 领域
一个领域本质上可以理解为就是一个问题域,只要是同一个领域,那问题域就相同. 所以,只要我们确定了系统所属的领域,那这个系统的核心业务,即要解决的关键问题.问题的范围边界就基本确定了. 领域首先要拆分成 ...
- 对XAML进行编辑的辅助类(XamlHelper)
原文:对XAML进行编辑的辅助类(XamlHelper) // XamlHelper.cs// --------------------------------------------// 对XAML ...
- WPF的消息机制(三)- WPF内部的5个窗口之处理激活和关闭的消息窗口以及系统资源通知窗口
原文:WPF的消息机制(三)- WPF内部的5个窗口之处理激活和关闭的消息窗口以及系统资源通知窗口 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/p ...
- 好用的Markdown 编辑器及工具
Markdown 是 2004 年由 John Gruberis 设计和开发的纯文本格式的语法,所以通过同一个名字它可以使用工具来转换成 HTML.readme 文件,在线论坛编写消息和快速创建富文本 ...
- C# WPF 中用代码模拟鼠标和键盘的操作
原文:C# WPF 中用代码模拟鼠标和键盘的操作 原文地址 C#开发者都知道,在Winform开发中,SendKeys类提供的方法是很实用的.但是可惜的是,在WPF中不能使用这个方法了. 我们知道,在 ...
- H3C交换机配置ACL禁止vlan间互访
1.先把基础工作做好,就是配置VLAN,配置Trunk,确定10个VLAN和相应的端口都正确.假设10个VLAN的地址分别是192.168.10.X,192.168.20.X......192.168 ...
- 【转载】centos7+tomcat部署JavaWeb项目超详细步骤
我们平时访问的网站大多都是发布在云服务器上的,比如阿里云.腾讯云等.对于新手,尤其是没有接触过linux系统的人而言是比较有困难的,而且至今使用云服务器也是有成本的,很多时候我们可以通过虚拟机自己搭建 ...