I have an app that uses two processes:
The background process hosts two services:
startService and made foreground using startForeground), ImportantService. It uses START_STICKY to ensure it isn't killed ifSettingsService.The UI binds to the temporary service in the background process for inter-process communication using bindService(..., ..., Context.BIND_AUTO_CREATE).
If I open the Recents activity on my phone and swipe to kill/remove my activity after it has bound to SettingsService, the entire background process is killed, and ImportantService is consequently killed.
ImportantService is restarted after being killed, probably due to START_STICKY.SettingsService via startService() but don't bind to it. The problem seems to be triggered by binding to the service.SettingsService using startService() before binding to it using bindService().bindService().SettingsService in onPause(). This prevents the problem from happening the first time, but it still happens on subsequent tests.SettingsService bind to itself.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]
This seems to be an Android bug. I've filed an issue for it at:
Issue 178057: Process killed when task removed while bound to service with BIND_AUTO_CREATE flag.
Here are some workarounds taken from the above:
- In the foreground service's
onTaskRemoved(), launch an activity on task removal
- Fixes the problem about 75% of the time.
- This closes the "Recents" activity on the user, so it alters the normal task-closing experience for the user.
- Seems to depend on timing, so it mightn't be a perfect workaround
- In the foreground service's
onTaskRemoved(), send multiple broadcasts to a registered receiver in the application with theIntent.FLAG_RECEIVER_FOREGROUNDflag.
- Seems to nearly always work, depending on timing and the number of broadcasts you send
- Unbind from the background service before the task is removed
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With