即使应用被终止,也可以推送通知

时间:2020-06-30 15:42:28

标签: java android service push-notification

我有一个服务,该服务发送通过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>

1 个答案:

答案 0 :(得分:-1)

Android上不再有后台服务。通过在前台启动通知来告诉设备保持服务运行。只需替换

notificationManager.notify(channelIndex, builder.build());

使用

startForeground(channelIndex, builder.build());

并保留onStartCommand返回START_STICKY

通过概述按钮关闭应用程序时,也不会调用我的onDestroy()方法。

official Android documentation称,onStop()上的

onDestroy()是可杀死的。