我创建了一项服务,该服务的作用是在用户关闭该应用程序时清除通知。一切运行正常,但有时当应用程序在后台运行超过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));
答案 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()方法。