Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 删除任务会在绑定时终止后台进程 出身背景_Android_Binding_Process - Fatal编程技术网

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
    确保在以下情况下不会被杀死
  • 用于进程间通信的临时设备,
    设置服务
UI使用
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中也重现了这个问题
Logcat主缓冲区日志 Logcat事件缓冲区日志
将两个服务合并为一个似乎可以解决问题,尽管这有点混乱。

这似乎是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]