Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Removing task kills background process when bound

Background

I have an app that uses two processes:

  • UI
  • Background

The background process hosts two services:

  • A long-running foreground service (started with startService and made foreground using startForeground), ImportantService. It uses START_STICKY to ensure it isn't killed if
  • A temporary one for inter-process communication, SettingsService.

The UI binds to the temporary service in the background process for inter-process communication using bindService(..., ..., Context.BIND_AUTO_CREATE).

Problem

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.

Symptoms

  • ImportantService is restarted after being killed, probably due to START_STICKY.
  • This doesn't happen if the services are moved into the UI process.
  • This doesn't happen if I start SettingsService via startService() but don't bind to it. The problem seems to be triggered by binding to the service.

What I've Tried

  • Starting SettingsService using startService() before binding to it using bindService().
  • Using each of the available flags for bindService().
  • Unbinding from SettingsService in onPause(). This prevents the problem from happening the first time, but it still happens on subsequent tests.
  • Making SettingsService bind to itself.

Environment

  • Device: Sony Xperia M
  • OS: Android 5.1.1
  • Customisation: Cyanogenmod 12.1
  • Also reproduced the problem in Genymotion emulator running Android 4.4.4

Logcat Main Buffer Logs

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

Logcat Event Buffer Logs

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]
like image 236
Sam Avatar asked Jan 02 '26 07:01

Sam


1 Answers

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:

  1. 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
  2. In the foreground service's onTaskRemoved(), send multiple broadcasts to a registered receiver in the application with the Intent.FLAG_RECEIVER_FOREGROUND flag.
    • Seems to nearly always work, depending on timing and the number of broadcasts you send
  3. Unbind from the background service before the task is removed
like image 169
Sam Avatar answered Jan 06 '26 00:01

Sam



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!