Android学习_服务
一、 服务
1. Android多线程
每一个Android应用程序都会分别运行在一个独立的Dalvik(或ART?)虚拟机中,而每个虚拟机在启动时会运行一个UI主线程。UI主线程执行的任务花费时间越短越好,耗时的工作应该交给子线程,以免阻塞主线程。
Android不允许在子线程中进行UI操作。
1) 异步消息处理机制
a) 核心思想:Message经过辗转调用后,从子线程进入主线程。
b) 四个组成部分:
u Message:线程间传递消息,用字段携带信息。
u Handler:发送和处理消息(sendMessage()和handleMessage())。发送出去的消息经过辗转处理后最终会传递到handleMessage()。
u MessageQueue:消息队列,存放Handler发送的信息。每个线程只有一个MessageQueue。
u Looper:管理MessageQueue。调用其loop()方法会进入无限循环,每当发现MessageQueue中有消息就将它取出来交给Handler的handleMessage()。
c) 使用步骤:
Step1:主线程创建Handler。
Step2:子线程创建Message,并通过Handler发送消息。(消息会被添加到消息队列,经过Looper处理最终发给Handler的handleMessage()。)
Step3:主线程执行Handler的handleMessage()。
2) AsyncTask
泛型抽象类,基于异步消息处理机制的封装,方便在子线程进行UI操作。
a) 泛型参数:Params,Progerss,Result
b) 方法:
- onPreExecute():后台任务执行前调用,可进行UI操作。
doInBackground(Params…):执行具体耗时任务,在子线程中运行,不可进行UI操作。可通过return返回任务执行结果。如果需要进行UI操作,可以调用publishProgress(Progress…)方法。
- onProgressUpdate(Preogress…):当后台任务调用publishProgress(Progress…)方法后就很快调用该方法,可进行UI操作。
- onPostExecute(Result):任务的收尾工作。当后台任务执行完毕通过return返回时调用,可进行UI操作。
2. 服务
1) 定义服务
继承Service类,重写
- onCreate():服务第一次创建时调用。
- onStartCommand():每次启动服务时调用。
- onDestory():服务销毁时调用。
onBind():返回Binder()对象。
2) 启动和终止服务
借助Intent,使用Context类的startService()和stopService()。
3) 活动与服务进行通信
绑定活动和服务,在活动中调用服务的Binder提供的方法。
Step1:继承Binder类(可服务类中用内部类),创建专门的Binder对象,然后在服务的onBind()方法里返回这个实例。
Step2:继承ServiceConnection类并创建对象(可在活动中用内部类),重写onServiceConnected()和onServiceDisconnected()方法,它们分别在活动与服务绑定成功和连接断开时调用。在onServiceConnected()方法中加入对Binder对象的操作。
Step3:活动中构建Intent(显示,关联服务类),调用bindService(bindIntent, conncetion, BIND_AUTO_CREATE)方法。该方法第一个参数前面创建的Intent对象,第二个参数为Step2构建的ServiceConnection对象,第三个参数是一个标志位,BIND_AUTO_CREATE表示在活动和服务绑定后自动创建服务(执行onCreate(),不执行onStartCommand())。
二、 其他
查看类继承关系快捷键 Ctrl+H