如果删除了服务启动的活动,则不会调用onTaskRemoved

roy*_*rek 10 java service android

我正在使用oreo 8.1.0.我正面临一个奇怪的问题,我在stackoverflow上找不到解决方案,因此我正在写这个问题.我知道一个解决方案,通过前台服务,我可以实现它,但我没有在我的应用程序上下文中找到用户友好的通知.

我将用两种情况描述我的问题.

案例1:当用户通过单击图标打开我的应用程序并将其从最近的应用程序中删除时,服务会自动重新启动.这可以.

案例2:我的应用程序已关闭,不在最近的应用程序中.当用户复制文本时,我的服务会启动我的应用程序的某个活动,但是当他从最近的应用程序中删除它时,我的服务将永久停止.

所以我的问题在于第二种情况,我不希望我的服务被杀死.即使它被杀死我想让它重新启动.

我尝试了stackoverflow上提到的所有方法,比如使用START_STICKY和onTaskRemoved,但我无法使其工作.

甚至我试图在用户点击最近的应用程序按钮并以编程方式从最近的应用程序中删除它时杀死我的活动,但这也无效.虽然这会在第二种情况下重新启动服务,当用户使用后退按钮杀死我的应用程序时.

这部分代码来自用户复制某些文本时打开的活动.

@Override
public void finish() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        super.finishAndRemoveTask();
    } else {
        super.finish();
    }

}
Run Code Online (Sandbox Code Playgroud)

这部分代码来自启动活动的服务.

@Override
public void onTaskRemoved(Intent rootIntent){
    Log.d("testing 12","onTaskRemoved");
    Intent restartServiceTask = new Intent(getApplicationContext(),CBWatcherService.class);
    restartServiceTask.setPackage(getPackageName());
    PendingIntent restartPendingIntent =PendingIntent.getService(getApplicationContext(), 1,restartServiceTask, PendingIntent.FLAG_ONE_SHOT);
    AlarmManager myAlarmService = (AlarmManager) getApplicationContext().getSystemService(this.ALARM_SERVICE);
    myAlarmService.set(
            AlarmManager.ELAPSED_REALTIME,
            SystemClock.elapsedRealtime() + 1000,
            restartPendingIntent);

    super.onTaskRemoved(rootIntent);
}

@Override
public int onStartCommand(Intent intent,int flag,int startId){
    super.onStartCommand(intent, flag, startId);
    return START_STICKY;

}
Run Code Online (Sandbox Code Playgroud)

编辑1
我只是需要服务才能保持活力.这些事情不会妨碍我的应用案例中的用户体验
1.当调用onPause以便服务不被杀时,可以自行杀死活动是可以接受的它发生
2.显示几秒钟的通知是可以接受的
3.重新启动服务是可以接受的

roy*_*rek 0

这就是问题 所在 每当我的服务用于启动活动时,我的服务都会在活动启动后被销毁。

为什么 onTaskRemoved 不起作用?
我所做的事情不起作用,因为我的服务曾经被破坏,因此监听 onTaskRemoved 并不活跃。

我是怎么解决的?
这个问题的解决方案是在活动(由服务启动)中进行检查,以检查服务是否处于活动状态。就像我的例子一样,服务被破坏了。因此,如果服务不活动,我需要再次启动该服务。
它甚至符合 OREO 设计模式,因为我们可以在应用程序位于前台时启动后台服务,并且即使 Activity 被破坏,服务也将保持活动状态。

在奥利奥上,虽然一段时间后服务被破坏,但这是一个不同的问题。

更多信息