Android第一行代码--服务
服务
- 服务(Service)用于
Android实现程序后台运行。适合不需要与用户交互且长期运行的任务。 - 服务并不是运行在独立进程中,而是依赖于创建服务所在的进程中,若该进程被杀死,服务也会停止。
Android多线程编程
线程基本用法
通过类继承
1 | |
通过实现接口
1 | |
匿名类
1 | |
子线程中更新UI
1 | |
运行会出现以下报错,这是由于Android系统不允许子线程修改UI界面

使用Android提供的异步消息处理机制,就可以实现子线程中进行UI操作。在子线程中只实现了发送消息,而消息处理的过程是在主线程中完成的。
1 | |
异步消息处理机制
Android中的异步消息处理由4部分组成:Message、Handler、MessageQueue、Looper。
Message:是线程之间传递的消息,用于在不同线程之间交换数据。Handler:是用于发送和处理消息的MessageQueue:消息队列,主要用于存放通过Handle发送的消息。这部分消息会一直存在于消息队列中,等待被处理。每个线程都有一个MessageQueue对象Looper:管理消息队列,每当发现队列中存在消息就会将消息取出,传递给Handler进行处理,每个线程都有一个Looper对象

AsyncTask
1 | |
AsyncTask是一个抽象类,因此想要使用需要创建一个子类去继承它。AsyncTask类指定3个泛型参数
- 参数一:
Params,在执行AsyncTask时需要传入的参数,用于在后台任务中使用。 - 参数二:
Progress,后台任务执行时,在界面显示当前的进度 - 参数三:
Result,任务执行完毕后,如果需要对结果进行返回,则是要该泛型值进行返回。
AsyncTask需要重写的方法
onPreExecute():该方法在后台任务开始执行前调用,用于界面上的初始化。doInBackground(Params...):需要在线程运行的代码需要放在这个方法中,但是不能进行UI处理onProgressUpdate(Progress...):这个方法可以对UI进行操作,参数通过publishProgress(Progress...)传递过来onPostExecute(Result):后台任务执行完毕并通过return语句返回时会执行该方法
服务的基本用法
启动服务
1 | |
关闭服务
1 | |
活动和服务进行通信
1 | |
1 | |
bindService()方法用于服务与活动建立连接- 参数一:
intent对象 - 参数二:
Serviceconnect实例 - 参数三:
BIND_AUTO_CREATE表示在活动和服务进行绑定后自动创建服务
- 参数一:
服务的生命周期
服务生命周期内可能回调的方法有
onCreate()、onStartCommand()、onBind()、onDestory()。当调用了
startService()方法,相应的服务就会被启动且会回调onStartCommand()方法,若服务此前没有被调用则会调用onCreate()方法。stopService()和stopSelf()方法可以停止服务。bindService()方法用来获取服务的持久性连接,这时会回调onBind()方法,onBind()方法会返回IBinder对象的实例,使用unbindService()方法用于销毁服务。当服务销毁时会回调
onDestory()
服务的更多技巧
前台服务
1 | |
PendingIntent是Intent的封装,满足某些条件或触发某些事件后执行指定的行为- 参数一:
Context上下文 - 参数二:
requestCode请求码 - 参数三:
Intent意图 - 参数四:
flags
- 参数一:
Notification是状态通知栏
IntentService
由于服务中的代码都是默认在主线程当中运行,因此需要将处理耗时的逻辑放在子线程中处理。
1 | |
服务一旦启动就会处于运行状态,因此需要在子线程中加上停止服务的操作
1 | |
防止程序员忘记启动线程或者在子线程中写停止服务的操作,Android提供了IntentService类
1 | |
服务的实践
DownloadListener
DownloadListener接口用于下载操作
1 | |
DownloadService
下载的服务,主要实现了接口的方法,以及活动与服务绑定时返回的Binder对象,以及消息通知栏的实现。
1 | |
DownloadTask
这里利用okhttp对文件进行下载操作,并且由于下载的操作需要耗时,因此放在子线程中运行,但是这里注意修改UI的操作不能再子线程中,因此需要使用publishProgress()方法传递参数实时修改UI效果。采用AsyncTask实现多线程。
AsyncTask执行顺序doInBackground()->onProgressUpdate()->onPostExecute()
1 | |