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 |
|