@cxm-2016
2016-08-09T09:27:11.000000Z
字数 3320
阅读 2174
android
作者:陈小默
IntentService是继承于Service并包涵异步任务处理的类。在其中有一个工作流来处理耗时操作。启动IntentService的方法和启动一个普通的Service一样,但是IntentService会在执行完任务后自动停止。多次启动IntentService时,每一个任务都会在onHandleIntent方法中以队列方式等待执行。
接下来我们使用一段代码打印IntentService的生命周期方法
class MyIntentService : IntentService(MyIntentService::class.java.name) {private val TAG = "--IntentService--"override fun onHandleIntent(intent: Intent?) {Log.e(TAG, "onHandleIntent")}override fun onCreate() {Log.e(TAG, "onCreate")super.onCreate()}override fun onBind(intent: Intent?): IBinder {Log.e(TAG, "onBind")return super.onBind(intent)}override fun onUnbind(intent: Intent?): Boolean {Log.e(TAG, "onUnbind")return super.onUnbind(intent)}override fun onStart(intent: Intent?, startId: Int) {Log.e(TAG, "onStart")super.onStart(intent, startId)}override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {Log.e(TAG, "onStartCommand")return super.onStartCommand(intent, flags, startId)}override fun onDestroy() {Log.e(TAG, "onDestroy")super.onDestroy()}override fun setIntentRedelivery(enabled: Boolean) {Log.e(TAG, "setIntentRedelivery")super.setIntentRedelivery(enabled)}}
注意配置清单文件
<service android:name=".MyIntentService"><intent-filter><action android:name="myIntentService" /></intent-filter></service>
现在我们使用startService方法多次启动该Service来查看生命周期方法的调用过程
override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)var startServiceIntent = Intent("myIntentService")startService(startServiceIntent)startService(startServiceIntent)}
这里我们主动启动了两次服务,没有主动关闭服务,那么结果会是什么样的呢?
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。
在一般的APP中,上传文件的操作都会被放置到后台或者新开辟线程去处理,因为这样能够给用户一个更流畅的体验。这里我们就使用IntentService去模拟后台文件上传的操作。
因为IntentService是在子线程中处理耗时操作,所以这里我们采用广播接收者来接收Service发送过来的完成信息。
class MainActivity : AppCompatActivity() {private var bt: Button? = nullprivate val ACTION = "UPLOAD_RESULT"private var receiver = object : BroadcastReceiver() {override fun onReceive(ctx: Context?, intent: Intent) {if (intent.action.equals(ACTION)) {val message = intent.getStringExtra("result")Toast.makeText(applicationContext, message, Toast.LENGTH_SHORT).show()}}}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)register()//注册广播接收者initView()//初始化控件listener()//给控件注册监听}private fun register() {val filter = IntentFilter()filter.addAction(ACTION)registerReceiver(receiver, filter)}private fun listener() {bt?.setOnClickListener {view->var startServiceIntent = Intent("myIntentService")startService(startServiceIntent)}}private fun initView() {bt = findViewById(R.id.button) as Button}}
这里我们修改IntentService的onHandleIntent方法
override fun onHandleIntent(intent: Intent?) {Log.e(TAG, "onHandleIntent")Thread.sleep(5000)var intent = Intent("UPLOAD_RESULT")intent.putExtra("result", "文件上传完成")sendBroadcast(intent)}