Service

10人阅读 评论(0) 收藏 举报
分类:

Service的生命周期

Service生命周期

Service的两种启动模式

startService()

  • onCreate():创建服务,如果服务已在运行,则不会调用此方法
  • onStratCommard():启动服务,需要调用stopService() 来停止服务
  • onDestroy():销毁服务

bindService()

  • onCreate():创建服务,如果服务已在运行,则不会调用此方法
  • onBind():绑定服务,通过返回 IBinder 提供一个接口,供客户端用来与服务进行通信
  • onUnbind():解绑服务
  • onDestroy():销毁服务

注意问题

  1. Service默认是运行在main线程的,因此Service中如果需要执行耗时操作(大文件的操作,数据库的拷贝,网络请求,文件下载等)的话应该在子线程中完成。

与IntentService的区别

Service:

  • 不是单独进程,和应用程序在同一个进程中
  • 如果直接把耗时操作放在 Service 的 onStartCommand() 中,很容易引起 ANR
  • 如果有耗时操作就必须开启一个单独的线程来处理。

IntentService:

  • 继承于Service,可以处理异步请求
  • 当任务执行完后,IntentService 会自动停止。
  • 耗时操作在onHandleIntent 回调方法中执行
  • 可以启动 IntentService 多次,每次只会执行一个工作线程,执行完第一个再执行第二个

如何保证Service不被杀掉

  1. onStartCommand方法,返回START_STICKY
    手动返回START_STICKY,亲测当service因内存不足被kill,当内存又有的时候,service又被重新创建,但是不能保证任何情况下都被重建,比如进程被干掉。

  2. 提升service优先级
    在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = “1000”这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时适用于广播

  3. 提升service进程优先级
    使用startForeground 将service放到前台状态

  4. onDestroy方法里重启service
    service +broadcast 方式,就是当service走ondestory的时候,发送一个自定义的广播,当收到广播的时候,重新启动service

  5. Application加上Persistent属性

  6. 监听系统广播判断Service状态
    通过系统的一些广播,比如:手机重启、界面唤醒、应用状态改变等等监听并捕获到,然后判断我们的Service是否还存活

查看评论
    个人资料
    等级:
    访问量: 230
    积分: 250
    排名: 30万+
    文章分类
    文章存档