10. 服务
Service
是Android
中实现程序后台运行的解决方案,适合不需要和用户交互且要求长期运行的任务;但是服务并不是运行在独立的进程中,依赖于创建服务时所在的应用程序进程;服务默认运行在主线程中不会自动开启线程,需要在服务内部手动创建子线程。
10.1 Android 多线程
基本使用
线程的基本使用就是java
的方式:
1 | class MyThread extends Thread{ |
1 | class MyThread implements Runnable{ |
继承Thread
类的方式对应自定义线程,实现Runnable
接口强调将任务进行抽象。
子线程中更新UI
Android
不允许在子线程更新UI,已测试证实。提供了异步消息处理机制处理需要根据任务执行结果更新UI的场景。也就是将消息从子线程传递给主线程,主线程进行UI更新。runOnUiThread
方法实际是以上流程的封装实现。
1 | private Handler handler = new Handler(){ |
AsyncTask
AsyncTask
也是对异步机制的封装。这是一个抽象类,需要定义子类去继承,继承时三个参数分别是:
- Params: 执行
AsyncTask
时需要传入的参数,这个类型和下面doInBackground
的参数类型一致 - Progress: 后台执行任务时更新UI的进度,此类型和
onProgressUpdate
和publishProgress
的参数类型一致; - Result: 任务执行完成返回结果的类型,与
doInBackground
的返回值,onPostExecute
和onCancelled
的参数类型一致1
2
3
4
5
6
7
8
9
10public class DownloadTask extends AsyncTask<String, Integer, Integer> {
/* 后台任务开始之前,进行一些界面初始化,主线程执行 */
protected void onPreExecute(){}
/* 子线程执行耗时操作,不可操作UI,可通过publishProgress更新进度 */
protected Integer doInBackground(String... params){}
/* 主线程处理信息,对应handleMessage */
protected void onProgressUpdate(Integer... values){}
/* 主线程接收子线程执行结果 */
protected void onPostExecute(Integer status) {}
}
10.2 服务基本用法
继承Service
,并通过intent
和context
的startService
和stopService
控制,也可以在service
内部通过stopSelf
停止自己。
1 | public class DownloadService extends Service{ |
在主线程中,通过在conncetion
中获取bindService
和unBindService
的回调可在此获取到服务提供的binder
,进而调用binder
提供的方法。
1 | private MyService.DownloadBinder downloadBinder; |

10.3 技巧
前台服务
内存不足时可能会回收后台运行的服务,前台服务则不会,前台服务会在状态栏显示。使用notification
载入intent
然后startForeground
这个notification
即可,注意事项与notification
一致。
1 | public class DownloadService extends Service{ |
IntentService
使得开发者不用手动开启线程和停止服务,自动创建异步自动停止的服务。从API30
弃用,受Android 8
添加的后台限制,官网推荐workManager
和jobIntentManager
1 | public class MyIntentService extends IntentService { |
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏
扫描二维码,分享此文章