服务是android中实现程序后台运行的解决方案。
服务不是运行在一个独立的进程当中,而是依赖于服务创建时所在的应用程序进程,服务默认运行在主线程当中的,但是我们要在服务的内部手动创建子线程,并执行具体的任务,否则就有可能出现主线程被阻塞的情况。
Android的UI是线程不安全的额,所以必须在主线程更新UI元素,否则出现异常。
异步消息处理机制(完美解决了在子线程中更新UI)
Handler对象(用于发送和处理消息),Message对象,handleMessage()方法
异步消息处理主要4部分:Message,Handler,MessageQueue(每个线程只有一个MessageQueue对象),Looper(是每个线程中的MessageQueue的管家,每个线程也只有一个Looper对象)
生命周期
startService()是马上开启服务
bindService()是绑定服务
服务只存在一个实例
stopService(),stopSelf();
远程服务
使用AsyncTask
AsyncTask是一个抽象类,需要创建一个子类继承他,<Params,Progress,Result>分别表示参数,进度单位,返回值类型
class Download extends AsyncTask<Void,Integer,Boolean>{
}
1.onPreExecute():在后台任务开始之前 执行,用于进行一些界面上的初始化操作.
2.doInBackground(Params…):子线程中执行,在这里处理耗时任务,最后通过return语句返回结果,如果上面Result为Void则可以不返回结果,由于是子线程所以这个方法不能进行UI操作,若要更新UI可以调用publishProgress(Progress…)来完成
3.onProgressUpdate(Progress…):publishProgress(Progress…)调用后会被马上调用,参数是从后台任务传递过来的。
4.onPostExecute(Result):后台任务(doInBackground)执行完毕并通过return返回,则该方法会被调用。
最后想要启动这个任务,则:new DownloadTask()/execute();
活动和服务通信
service中继承Binder的子类DownloadBinder, Activity中创建ServiceConnection匿名类
IntentService
异步,会自动停止的服务
继承IntentService类
1.必须重写无参构造,并调用父类
2.重写onHandleIntent(Intent intent)方法