对比下几种后台操作
2017-07-15 本文已影响200人
黑狗狗哥
对比下几种后台操作
1.Service
专门创建用来处理长生命周期的操作的应用组件,不需要用户界面的功能。特别的它用来执行一些持续性的,可能耗时的操作(例如Internet查找,处理数据,更新Content Provider,激活Intent,触发Notification),它的运行优先级默认是处于Active Activiey之下(排第二,但是也可以通过startForeground方式来是使Service运行到前台),并且默认是运行在应用程序的GUI线程(既主线程)中的,所有我们最好把耗时操作放在一个新的线程中。
使用方式
- 创建Service
创建一个类集成Service,重写,onCreate(),onBind(),onStartCommond(),然后在Manifest.xml中注册这个Service- 启动和停止Service
通过Context.startService()来启动一个Service,然后可以通过stop来终止Service(无论调用多少次startService,调用一次stopService就会停止Service).当然我们也可以通过在Service中通过stopSelf()来终止Service.- (可选)绑定Service
可以在Service类中创建IBinder的子类从而在onBind()中放回这个子类,然后在Activity通过bingService来绑定这个服务
2.AysncTask
适用于生命周期较短且需要在UI上显示进度和结果的后台操作
使用方式
- 创建一个新的异步任务
创建一个类继承AsyncTask类,然后重写doInBackground()方法(这个方法是在后台线程执行的),可以通过重写onProgressUpdate()方法来更新UI的进度(在GUI线程中执行的),重写onPostExecute()方法在doInBackground()方法结束后执行返回的结果(在GUI线程中执行)- 调用AsyncTask的execute方法执行
*注意:每个AsyncTask实例只能执行一次,如果试图调用第二次execute,则会抛出一个异常
3.Thread + Activity.runOnUiThread
如果这个Thread是在Activity中创建运行的,就可以通过这个方法来切换到GUI线程
4.IntentService
在后台处理队列中的每个人物,等全部都处理完成后就会自动终止自己对于按需或者固定时间间隔执行一组任务,这就是一组最好的选择
使用方式
- 创建一个类继承IntentService,然后重写onHandleIntent(),这个方法是放在后台线程的,耗时任务应该在这个方法中实现,传入的每个Intent都会在这里逐个被处理,当所有的Intent都被处理后,该Service就会终止自己
5.Alarm
在预先确定的时间或者时间间隔内激活Intent的方式,当它们和Broadcast Receiver一起使用更加强大,允许设置激活广播Intent,启动Service,甚至可以启动Activity
Handler , Timer , Thread:这三种方式都是在生命周期内使用的,一旦退出了应用就不存在了
Alarm:这种方式就是在生命周期外使用的,意味这即使关闭了程序或者锁屏情况下也可以激活Intent,但重启后这些Alarm就不生效了使用方式
- 通过context.getSystemService(Context.ALARM_SERVICE)获取AlarmManger的实例(cotnext指的是context的子类,比如说Activity,Service等)
- 通AlarmManger实例的set方式来设置Alarm,也可以通过AlarmManger实例的cancel方式来取消一个Alarm
- 重复的Alram
setRepeating:可以精确到毫秒,但是却增加了功耗。
setInexactRepeating:这种方式更加省电,因为在它制定的时间,系统会把这些范围内的Alram结合起来一起调用