我有一个使用两个进程的应用程序:
后台进程托管两项服务:
startService
开头,并使用startForeground
创建前景),ImportantService
。它使用START_STICKY
来确保在SettingsService
。 UI使用bindService(..., ..., Context.BIND_AUTO_CREATE)
绑定到后台进程中的临时服务,以进行进程间通信。
如果我在手机上打开“最近”活动并在绑定到SettingsService
后滑动以杀死/删除我的活动,整个后台进程将被终止,ImportantService
因此被杀死。
ImportantService
在被杀后重新启动,可能是由于START_STICKY
。SettingsService
启动startService()
但不绑定它,则不会发生这种情况。这个问题似乎是通过绑定服务来触发的。SettingsService
在startService()
绑定之前使用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
绑定到自身。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]
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);
});
答案 0 :(得分:4)
这似乎是一个Android错误。我在以下网址提交了一个问题:
Issue 178057: Process killed when task removed while bound to service with BIND_AUTO_CREATE flag
以上是一些解决方法:
- 在前台服务的
onTaskRemoved()
中,启动有关任务删除的活动
- 大约75%的时间修复了问题。
- 这会关闭用户的“最近”活动,因此会改变用户的正常任务结束体验。
- 似乎依赖于时间,所以它可能不是一个完美的解决方法
- 在前台服务的
onTaskRemoved()
中,使用Intent.FLAG_RECEIVER_FOREGROUND
标志向应用程序中已注册的接收方发送多个广播。
- 似乎几乎总是有效,具体取决于您发送的时间和广播数量
- 在删除任务之前从后台服务取消绑定
醇>
答案 1 :(得分:0)
将两个服务合并为一个似乎可以解决问题,尽管它有点混乱。