作用:service实现程序后台运行的解决方案。适合执行不需要和用户交互并且需要长期运行的任务,即使程序被切换到后台,service仍能保持正常运行
注:服务不运行在一个独立的进程中,而是依赖于创建服务时所在的应用程序进程,当该应用程序被杀掉时,所有依赖于该进程的服务也会停止运行。
1 Android多线程编程
1.1 线程基本用法
常用Runnable接口定义线程
使用匿名类实现:
1.2 子线程中更新UI
1.3异步消息处理机
异步消息处理机制:Message ,Handler, MessageQueue, Looper
Message:线程之间传递消息,携带少量信息
Handler:用于发送和处理消息,发送消息使用Handler的sendMessage()方法。处理消息使用handleMessage()方法。Message使用完后系统会调用recycle回收。
MessageQueue(消息队列):用于存放通过Handler发送的消息,每个线程只有一个消息队列。
Looper:管理每个线程的消息队列,调用Looper的loop()方法后,会进入无限循环中。每当发现消息队列中存在一条消息,会将他取出,传递到Handler的handleMessage()中。每个线程只用一个looper
1.4使用AsyncTask
doInBackGround()方法执行具体的耗时工作
onProgressUpdate()方法执行UI操作
onPostExecute()方法执行任务收尾工作
启动任务:new DownloadTask().execute();
2 服务的基本用法
2.1定义服务
onCreate():服务在第一次创建时调用
onStartCommand():每次启动服务时调用
onDestory(): 销毁时
startService():启动服务
stopService():停止服务
2.2 活动和服务进行通信
使用onBind()方法实现活动与服务之间通信
创建一个ServiceConnection匿名类,在里面重写onServiceConnected()方法和onServiceDisconnected() 方法,这两个方法用于在活动与服务成功绑定与解除绑定时调用,
3 服务的生命周期
1)content的startService():启动服务,
2)回调onStartCommand(),若服务没创建,先onCreate(),再onStartCommand(),服务一直保持,直到stopService()或stopSelf()
3) 调用Context的bindService():获取服务持久连接,此时会回调服务中的onBind()方法。若服务没创建,先onCreate()再onBind()。调用方获得onBind()方法返回的IBinder对象的实例
4 自动停止服务技巧---《第一行代码》10.5部分
IntentService类实现简单创建一个异步、会自动停止的服务
步骤:1)要提供一个无参构造函数,且在其内部调用父类的有参构造函数
2)在子类中实现onHandleIntent()这个抽象方法,此方法可以处理一些具体的逻辑,且不担心ANR问题,因为该方法已经是在子线程中运行。