@cxm-2016
2016-08-09T17:27:11.000000Z
字数 3320
阅读 1834
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? = null
private 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)
}