我有一个服务,该服务发送通过onStartCommand()
方法安排的通知。我希望它从后台发送通知,即使关闭了应用程序也是如此。我设法做到的是在应用程序打开时以及在后台运行时发送通知。但是,当我单击android的overview button并在应用上滑动以将其关闭时,通知将不再发送。
这是Service
的代码:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
Log.d("NotificationService", "onStartCommand");
setupNotificationTimers();
return START_STICKY;
}
setupNotificationTimers()
在以下代码下运行,该代码确保在所需日期运行postNotification()
。
Timer timer = new Timer();
long delay = notificationDate.getTime() - currentTime.getTime(); // how much time until notification should be sent
TimerTask timerTask = new TimerTask() {
public void run() {
handler.post(() -> postNotification(channel, "title", "content"));
}
};
timer.schedule(timerTask, delay);
最后是我的postNotification
方法:
private void postNotification(int channelIndex, String title, String content) {
Log.d("NotificationService", "Posting notification...");
Intent notificationIntent = new Intent(this, MainActivity.class);
PendingIntent intent = PendingIntent.getActivity(this, 0,
notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, notificationChannelId)
.setSmallIcon(R.drawable.ic_note)
.setContentTitle(title)
.setContentText(content)
.setAutoCancel(true)
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setContentIntent(intent);
notificationManager.notify(channelIndex, builder.build());
}
我发现的大多数解决方案都不适用于我-例如return START_STICKY;
中的onStartCommand()
。
通过概述按钮关闭应用程序时,也不会调用我的onDestroy()
方法。我不知道为什么,但是这使我无法在服务被破坏时重新启动
@Override
public void onDestroy() {
Log.d("NotificationService", "Notification service destroyed"); // doesn't get logged
stoptimers();
super.onDestroy();
}
即使应用被终止,如何使服务运行?
编辑:
以下是AndroidManifest.xml
中定义的服务和活动:
<service
android:name=".NotificationService"
android:label="@string/app_name">
<intent-filter>
<action android:name="your.app.domain.NotificationService" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</service>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
答案 0 :(得分:-1)
Android上不再有后台服务。通过在前台启动通知来告诉设备保持服务运行。只需替换
notificationManager.notify(channelIndex, builder.build());
使用
startForeground(channelIndex, builder.build());
并保留onStartCommand
返回START_STICKY
official Android documentation称,通过概述按钮关闭应用程序时,也不会调用我的onDestroy()方法。
onStop()
上的 onDestroy()
是可杀死的。