绑定

时间:2015-06-17 12:56:17

标签: android binding process

背景

我有一个使用两个进程的应用程序:

  • UI
  • 背景

后台进程托管两项服务:

  • 长期运行的前台服务(以startService开头,并使用startForeground创建前景),ImportantService。它使用START_STICKY来确保在
  • 时不会被杀死
  • 用于进程间通信的临时通信SettingsService

UI使用bindService(..., ..., Context.BIND_AUTO_CREATE)绑定到后台进程中的临时服务,以进行进程间通信。

问题

如果我在手机上打开“最近”活动并在绑定到SettingsService后滑动以杀死/删除我的活动,整个后台进程将被终止,ImportantService因此被杀死。

症状

  • ImportantService在被杀后重新启动,可能是由于START_STICKY
  • 如果将服务移入UI流程,则不会发生这种情况。
  • 如果我通过SettingsService启动startService()但不绑定它,则不会发生这种情况。这个问题似乎是通过绑定服务来触发的。

我尝试过什么

  • 使用SettingsServicestartService()绑定之前使用bindService()启动bindService()
  • 使用SettingsService
  • 的每个可用标记
  • onPause()中的SettingsService解除绑定。这可以防止第一次发生问题,但在后续测试中仍然会发生。
  • 使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 绑定到自身。

环境

  • 设备:Sony Xperia M
  • 操作系统:Android 5.1.1
  • 定制:Cyanogenmod 12.1
  • 还转载了运行Android 4.4.4的Genymotion模拟器中的问题

Logcat主缓冲区日志

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]

Logcat事件缓冲区日志

jQuery("document").ready(function($){
var pos = $('.inner-page-nav').offset().top;
var nav = $('.inner-page-nav');

$(window).scroll(function () {
if ($(this).scrollTop() > pos) {
	nav.addClass("f-nav");
	(".inner-page-nav").fadeIn(3000);
	('.inner-page-nav').addClass("f-nav");
} else {
	nav.removeClass("f-nav");
}
});
});
$(document).on('click','.scroll_to', function(event) {
    event.preventDefault();
    var target = "#" + this.getAttribute('data-more-info');
    $('html, body').animate({
        scrollTop: $(target).offset().top - 60 }, 2000);
});

2 个答案:

答案 0 :(得分:4)

这似乎是一个Android错误。我在以下网址提交了一个问题:

Issue 178057: Process killed when task removed while bound to service with BIND_AUTO_CREATE flag

以上是一些解决方法:

  
      
  1. 在前台服务的onTaskRemoved()中,启动有关任务删除的活动      
        
    • 大约75%的时间修复了问题。
    •   
    • 这会关闭用户的“最近”活动,因此会改变用户的正常任务结束体验。
    •   
    • 似乎依赖于时间,所以它可能不是一个完美的解决方法
    •   
  2.   
  3. 在前台服务的onTaskRemoved()中,使用Intent.FLAG_RECEIVER_FOREGROUND标志向应用程序中已注册的接收方发送多个广播。      
        
    • 似乎几乎总是有效,具体取决于您发送的时间和广播数量
    •   
  4.   
  5. 在删除任务之前从后台服务取消绑定
  6.   

答案 1 :(得分:0)

将两个服务合并为一个似乎可以解决问题,尽管它有点混乱。