[关闭]
@cxm-2016 2016-08-09T17:27:11.000000Z 字数 3320 阅读 1834

IntentService的简单介绍

android
作者:陈小默


1 介绍

IntentService是继承于Service并包涵异步任务处理的类。在其中有一个工作流来处理耗时操作。启动IntentService的方法和启动一个普通的Service一样,但是IntentService会在执行完任务后自动停止。多次启动IntentService时,每一个任务都会在onHandleIntent方法中以队列方式等待执行。

2 生命周期方法

接下来我们使用一段代码打印IntentService的生命周期方法

  1. class MyIntentService : IntentService(MyIntentService::class.java.name) {
  2. private val TAG = "--IntentService--"
  3. override fun onHandleIntent(intent: Intent?) {
  4. Log.e(TAG, "onHandleIntent")
  5. }
  6. override fun onCreate() {
  7. Log.e(TAG, "onCreate")
  8. super.onCreate()
  9. }
  10. override fun onBind(intent: Intent?): IBinder {
  11. Log.e(TAG, "onBind")
  12. return super.onBind(intent)
  13. }
  14. override fun onUnbind(intent: Intent?): Boolean {
  15. Log.e(TAG, "onUnbind")
  16. return super.onUnbind(intent)
  17. }
  18. override fun onStart(intent: Intent?, startId: Int) {
  19. Log.e(TAG, "onStart")
  20. super.onStart(intent, startId)
  21. }
  22. override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
  23. Log.e(TAG, "onStartCommand")
  24. return super.onStartCommand(intent, flags, startId)
  25. }
  26. override fun onDestroy() {
  27. Log.e(TAG, "onDestroy")
  28. super.onDestroy()
  29. }
  30. override fun setIntentRedelivery(enabled: Boolean) {
  31. Log.e(TAG, "setIntentRedelivery")
  32. super.setIntentRedelivery(enabled)
  33. }
  34. }

注意配置清单文件

  1. <service android:name=".MyIntentService">
  2. <intent-filter>
  3. <action android:name="myIntentService" />
  4. </intent-filter>
  5. </service>

现在我们使用startService方法多次启动该Service来查看生命周期方法的调用过程

  1. override fun onCreate(savedInstanceState: Bundle?) {
  2. super.onCreate(savedInstanceState)
  3. setContentView(R.layout.activity_main)
  4. var startServiceIntent = Intent("myIntentService")
  5. startService(startServiceIntent)
  6. startService(startServiceIntent)
  7. }

这里我们主动启动了两次服务,没有主动关闭服务,那么结果会是什么样的呢?

08-09 15:21:59.819 3193-3193/*.*.* E/--IntentService--: onCreate
08-09 15:21:59.819 3193-3193/*.*.* E/--IntentService--: onStartCommand
08-09 15:21:59.819 3193-3193/*.*.* E/--IntentService--: onStart
08-09 15:21:59.819 3193-3238/*.*.* E/--IntentService--: onHandleIntent
08-09 15:21:59.819 3193-3193/*.*.* E/--IntentService--: onStartCommand
08-09 15:21:59.819 3193-3193/*.*.* E/--IntentService--: onStart
08-09 15:21:59.819 3193-3238/*.*.* E/--IntentService--: onHandleIntent
08-09 15:21:59.909 3193-3193/*.*.* E/--IntentService--: onDestroy

onCreate方法只执行了一次,而onStartCommand和onStart方法执行了两次,最后在我们没有主动关闭服务的情况下onDestroy销毁了IntentService。

3 模拟使用场景

在一般的APP中,上传文件的操作都会被放置到后台或者新开辟线程去处理,因为这样能够给用户一个更流畅的体验。这里我们就使用IntentService去模拟后台文件上传的操作。

因为IntentService是在子线程中处理耗时操作,所以这里我们采用广播接收者来接收Service发送过来的完成信息。

  1. class MainActivity : AppCompatActivity() {
  2. private var bt: Button? = null
  3. private val ACTION = "UPLOAD_RESULT"
  4. private var receiver = object : BroadcastReceiver() {
  5. override fun onReceive(ctx: Context?, intent: Intent) {
  6. if (intent.action.equals(ACTION)) {
  7. val message = intent.getStringExtra("result")
  8. Toast.makeText(applicationContext, message, Toast.LENGTH_SHORT).show()
  9. }
  10. }
  11. }
  12. override fun onCreate(savedInstanceState: Bundle?) {
  13. super.onCreate(savedInstanceState)
  14. setContentView(R.layout.activity_main)
  15. register()//注册广播接收者
  16. initView()//初始化控件
  17. listener()//给控件注册监听
  18. }
  19. private fun register() {
  20. val filter = IntentFilter()
  21. filter.addAction(ACTION)
  22. registerReceiver(receiver, filter)
  23. }
  24. private fun listener() {
  25. bt?.setOnClickListener {
  26. view
  27. ->
  28. var startServiceIntent = Intent("myIntentService")
  29. startService(startServiceIntent)
  30. }
  31. }
  32. private fun initView() {
  33. bt = findViewById(R.id.button) as Button
  34. }
  35. }

这里我们修改IntentService的onHandleIntent方法

  1. override fun onHandleIntent(intent: Intent?) {
  2. Log.e(TAG, "onHandleIntent")
  3. Thread.sleep(5000)
  4. var intent = Intent("UPLOAD_RESULT")
  5. intent.putExtra("result", "文件上传完成")
  6. sendBroadcast(intent)
  7. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注