Android后台服务保活:
本来单独使用startService启动的service,在“正在运行”的服务里面点击“停止”按钮之后,服务会调用onDestroy,然后在这个调用里面发送intent重启服务,
但是,我这里的使用场合是,在“正在运行”的服务里面点击“停止”按钮之后,需要触发onDestroy。
在同时用startService和bindservice的情况下修改bindservice的第三个参数。发现只要不是BIND_AUTO_CREATE,在“正在运行”的服务里面点击“停止”按钮之后,都会调用onDestroy。
本来单独使用startService启动的service,在“正在运行”的服务里面点击“停止”按钮之后,服务会调用onDestroy,然后在这个调用里面发送intent重启服务,
@Override public void onDestroy() { super.onDestroy(); Intent intent = new Intent(getApplicationContext(),xxx.class); startService(intent); }以上使用没有问题。但是,当加入bindService和startService混用以后,在“正在运行”的服务里面点击“停止”按钮之后,服务的onDestroy并没有被调用。造成,服务被杀死没有办法重启,而保活失败。
调用代码如下:
private void startService(int uid) { Intent intent = new Intent(this, Service.class); startService(intent); bindService(); } private void bindService() { Intent intent2 = new Intent(this, Service.class); bindService(intent2, mServiceConnection, Context.BIND_AUTO_CREATE); }查找了几片博客,只是说,startService和bindService会出现这个onDestroy不被调用的情况,博客说要调用unbindservice和stopservice服务结束的时候才会调用onDestroy
但是,我这里的使用场合是,在“正在运行”的服务里面点击“停止”按钮之后,需要触发onDestroy。
在同时用startService和bindservice的情况下修改bindservice的第三个参数。发现只要不是BIND_AUTO_CREATE,在“正在运行”的服务里面点击“停止”按钮之后,都会调用onDestroy。
找到了解决方案:但是除了BIND_AUTO_CREATE还有很多选项,具体该选择哪个呢:以下列出每个选项说明:
自动创建服务只要绑定纯在。 public static final int BIND_AUTO_CREATE = 0x0001; 包含对unbind调用不匹配的调试帮助 public static final int BIND_DEBUG_UNBIND = 0x0002; 不允许此绑定将目标服务的进程提升到前台调度优先级 public static final int BIND_NOT_FOREGROUND = 0x0004; 表示绑定到此服务的客户端应用程序认为该服务比应用程序本身更重要。 当设置时,平台将尝试使内存杀手杀死应用程序,然后杀死它绑定到的服务 ,尽管这不能保证是这种情况 public static final int BIND_ABOVE_CLIENT = 0x0008; 允许承载绑定服务的进程通过其正常的内存管理。 它将更像是一个正在运行的服务, 允许系统(暂时)清除过程,如果内存低或一些其他的想法可能有, 并更积极的使它成为候选人被杀死(并重新启动)如果 运行很长时间。 public static final int BIND_ALLOW_OOM_MANAGEMENT = 0x0010; 不影响目标服务的主机进程的调度或内存管理优先级。 允许在后台LRU列表上管理服务的进程,就像在后台的常规应用程序进程一样 public static final int BIND_WAIVE_PRIORITY = 0x0020; 这个服务比客户端重要,当客户端是前台进程的时候,服务会被提到前台进程的级别。 一般一个进程只能被提高到可见进程的级别,即便客户端是个前台进程。 public static final int BIND_IMPORTANT = 0x0040; 如果是通过Activity来绑定的服务,允许服务的重要级别随着Activity是否可见而改变 public static final int BIND_ADJUST_WITH_ACTIVITY = 0x0080;