短时间(1分钟)后,服务被终止

时间:2018-07-21 17:14:52

标签: android android-components

我创建了一项服务,该服务的作用是在用户关闭该应用程序时清除通知。一切运行正常,但有时当应用程序在后台运行超过1分钟时,服务被终止(这意味着通知不会取消)。 为什么会这样呢?我认为,停止服务的唯一方法是使用stopSelf()或stopService()。

public class OnClearFromRecentService extends Service {
    private static final String TAG = "onClearFromRecentServic";
    private NotificationManagerCompat mNotificationManagerCompat;

    @Override
    public void onCreate() {
        super.onCreate();
        mNotificationManagerCompat = NotificationManagerCompat.from(getApplicationContext());
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "Service Started");
        return START_NOT_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "Service Destroyed");
    }

    @Override
    public void onTaskRemoved(Intent rootIntent) {
        //Put code here which will be executed when app is closed from user.
        Log.d(TAG, "onTaskRemoved was executed ");
        if (mNotificationManagerCompat != null) {
            mNotificationManagerCompat.cancelAll();
        } else {
            Log.d(TAG, "onTaskRemoved: mNotifManager is null!");
        }

        stopSelf();
    }
}

我从启动屏幕活动启动服务,如下所示:startService(new Intent(this, OnClearFromRecentService.class));

这里还有一些日志消息: enter image description here

2 个答案:

答案 0 :(得分:1)

尝试在StartCommand上返回 START_STICKY 表单。
然后系统将尝试重新创建。
查看this官方文档。

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "Service Started");
        return START_NOT_STICKY;
    }

如果您还希望重新发送Intent,也可以尝试重播START_REDELIVER_INTENT。

START_REDELIVER_INTENT

  

恒定从onStartCommand(Intent,int,int)返回:如果此   服务的进程在启动时被杀死(从中返回后   onStartCommand(Intent,int,int)),然后将其安排为   重新启动,最后一次传递的意图通过重新传递给它   onStartCommand(Intent,int,int)。

来自文档。

答案 1 :(得分:1)

我在@emandt的帮助下找到了解决方案。

我刚刚在onStartCommand()中添加了以下代码行:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d(TAG, "Service Started");
    Notification notification = new NotificationCompat.Builder(this, CHANNELID)
            .setContentTitle("title")
            .setContentText("text")
            .setSmallIcon(R.drawable.baseline_pause_white_24)
            .build();
    startForeground(2001,notification);
    return START_NOT_STICKY;
}

根据文档startForeground方法:

  

如果您的服务已启动,则还应使该服务在前台运行,并在此状态下向用户显示正在进行的通知...默认情况下,已启动的服务是后台的,这意味着它们的过程不会给定前台CPU调度(除非该进程中的其他事情是前台)

也是

  

如果您的应用程序的目标是API级别26或更高级别,则除非应用程序本身位于前台,否则系统会限制使用或创建后台服务。如果应用程序需要创建前台服务,则该应用程序应调用 startForegroundService()。该方法创建了后台服务,但是该方法向系统发出信号,表明该服务会将自己提升到前台。创建服务后,该服务必须在五秒钟内调用其 startForeground()方法。