Android 删除任务会在绑定时终止后台进程 出身背景
我有一个应用程序使用两个过程:Android 删除任务会在绑定时终止后台进程 出身背景,android,binding,process,Android,Binding,Process,我有一个应用程序使用两个过程: 用户界面 背景 后台进程承载两个服务: 一个长期运行的前台服务(从startService开始,并使用startForeground制作前台),重要服务。它使用START\u STICKY确保在以下情况下不会被杀死 用于进程间通信的临时设备,设置服务 UI使用bindService(…,…,Context.BIND\u AUTO\u CREATE)绑定到后台进程中的临时服务以进行进程间通信 问题 如果我在手机上打开Recents活动,并在活动绑定到设置服务
- 用户界面
- 背景
- 一个长期运行的前台服务(从
开始,并使用startService
制作前台),startForeground
。它使用重要服务
确保在以下情况下不会被杀死START\u STICKY
- 用于进程间通信的临时设备,
设置服务
bindService(…,…,Context.BIND\u AUTO\u CREATE)
绑定到后台进程中的临时服务以进行进程间通信
问题
如果我在手机上打开Recents活动,并在活动绑定到设置服务
后滑动以终止/删除我的活动,则整个后台进程将终止,重要服务
将因此终止
症状
在被终止后重新启动,可能是由于ImportantService
START\u STICKY
- 如果将服务移动到UI进程中,则不会发生这种情况
- 如果我通过
启动startService()
但不绑定它,则不会发生这种情况。这个问题似乎是由绑定到服务触发的SettingsService
- 在使用
绑定到服务之前,先使用bindService()
启动startService()
SettingsService
- 使用
的每个可用标志bindService()
- 从
中的onPause()
设置服务解除绑定。这可以防止问题在第一次发生,但在后续测试中仍然会发生
- 使
绑定到自身设置服务
- 设备:索尼Xperia M
- 操作系统:安卓5.1.1
- 定制:Cyanogenmod 12.1
- 在运行Android 4.4.4的Genymotion emulator中也重现了这个问题
将两个服务合并为一个似乎可以解决问题,尽管这有点混乱。这似乎是Android的一个bug。我已在以下地址提交了一份文件: 以下是从上面采取的一些变通方法:
onTaskRemoved()
- 大约75%的时间修复了此问题李>
- 这将关闭用户的“最近”活动,因此它会改变用户的正常任务关闭体验
- 似乎取决于时间,所以这可能不是一个完美的解决办法
onTaskRemoved()。
- 似乎几乎总是有效的,这取决于时间和你发送的广播数量
这不是一个bug。您应该使用startservice()启动一个您希望保持活动状态的服务,而不与之绑定任何内容。如果一个服务是用bindservice()启动的,那么android会在它没有绑定的时候删除它。@RocketRandom,这个长期运行的服务实际上是用
startService()
启动的,但是看起来我在问题中没有提到,所以我刚刚更新了这个问题。另外,请注意,问题不是绑定服务在解除绑定时被删除,而是整个进程在任务被删除时被终止。
06-17 07:27:22.633 678-897/? I/ActivityManager﹕ Killing 7666:com.example.myapp/u0a151 (adj 9): remove task
06-17 07:27:22.650 678-1327/? I/WindowState﹕ WIN DEATH: Window{3e26d1c9 u0 com.example.myapp/.SettingsActivity}
06-17 07:27:22.769 678-1211/? I/ActivityManager﹕ Killing 32110:com.example.myapp:backgroundprocess/u0a151 (adj 0): remove task
06-17 07:27:22.898 678-1149/? W/ActivityManager﹕ Scheduling restart of crashed service com.example.myapp/.ImportantService in 1000ms
06-17 07:27:23.979 678-696/? I/ActivityManager﹕ Start proc 7809:com.example.myapp:backgroundprocess/u0a151 for service com.example.myapp/.ImportantService
06-17 20:33:08.482 I/am_finish_activity( 678): [0,395523242,1024,com.example.myapp/.SettingsActivity,clear]
06-17 20:33:08.484 I/am_destroy_activity( 678): [0,395523242,1024,com.example.myapp/.SettingsActivity,finish-imm]
06-17 20:33:08.488 I/am_kill ( 678): [0,5636,com.example.myapp,9,remove task]
06-17 20:33:08.640 I/dvm_lock_sample( 678): [system_server,1,ActivityManager,142,ActivityManagerService.java,3410,-,8682,28]
06-17 20:33:08.644 I/am_proc_died( 678): [0,5636,com.example.myapp]
06-17 20:33:08.645 I/am_kill ( 678): [0,3960,com.example.myapp:backgroundprocess,0,remove task]
06-17 20:33:08.811 I/wm_task_removed( 678): [1024,removeAppToken: last token]
06-17 20:33:08.812 I/wm_task_removed( 678): [1024,removeTask]
06-17 20:33:08.816 I/dvm_lock_sample( 678): [system_server,1,Binder_F,136,ActivityManagerService.java,1230,-,1230,27]
06-17 20:33:08.819 I/am_proc_died( 678): [0,3960,com.example.myapp:backgroundprocess]