赞
踩
分了两种启动方式的生命流程:
第一次startService:
MyService: onCreate()...
MyService: onStartCommand()...
不杀死或暂停服务然后直接第二次startService:
MyService: onStartCommand()...
去点击stopService:
MyService: onDestroy()...
bindService,多次点击bindService,只会出现一次:
MyService: onCreate()...
MyService: onBind()...
unBindService,点击unBindService,会执行:
MyService: onUnbind()...
MyService: onDestroy()...
两种service启动方式对比:
startservice这种只能用onDestroy来终止,若不用onDestroy销毁,Activity一退出,service将会一直运行下去;bindservice只能用unbindservice解除绑定,用onDestroy来终止,如果不解除绑定的话也不用onDestroy销毁的话,Activity一退出,service也将结束。用bindservice的话,Activity调用ServiceConnection的时机是在绑定成功后;其中重写倆方法:连接成功和断开连接(不是没连上,所以前提是绑定成功)
1.在onStartCommand中返回START_STICKY, 或让onStartCommand方法参数中的flag为START_STICKY,service被杀之后会被重新创建;
2.提高service的优先级:在配置清单中指定android:priority = 1000,值越高代表优先级越高,广播优先级也是这样来指定的;
3.提高Service进程优先级:
Android进程分为了以下六个重要等级的进程高到低:
1.前台进程( FOREGROUND_APP) 2.可视进程(VISIBLE_APP ) 3.次要服务进程(SECONDARY_SERVER )
4.后台进程 (HIDDEN_APP) 5.内容供应节点(CONTENT_PROVIDER) 6.空进程(EMPTY_APP)
举例:可以在onStartCommand中调用一个startForeground方法来创建一个前台Notification,这样就能大大提高Service进程优先级;。
4.在onDestroy方法中startservice或者用广播+startservice结合来启动service;
5.在一些常用到的状态如手机锁屏解锁,开机等监听service是否存活
Service通过守护进程来保证Service一直保活(A,Bservice在两个进程中,所以要用到AIDL来跨进程)
如下:在主服务StepService中的Disconnect方法(被杀会调用)中start和bindservice GuardService;在GuardService的onStartCommand中再去重新start StepService,达到保活StepService进程效果;
需要注意的是,如果采用 adb shell force-stop packageName或者其他手段强制杀死进程,则监听不到service断开,将无法达到唤醒守护进程的效果;
1.Thread 的运行是独立于 Activity 的,也就是说当一个 Activity 被 finish 之后,如果你没有主动停止 Thread 或者 Thread 里的 run 方法没有执行完毕的话,Thread 也会一直执行。因此会出现一个问题:你没有办法在不同的 Activity 中对同一 Thread 进行控制。
2.根据进程优先级,Thread在后台运行的优先级低于后台运行的Service,如果执行系统资源紧张,会优先杀死前一种,后台运行的Service一般情况下不会被杀死,如果被杀死,系统空闲时会重新启动service.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。