アラームマネージャを設定して15分ごとに実行し、データベースに何かが追加されていることを確認してから通知を表示するようにしています。しかし、私はこれをテストしていますが、60秒後に通知を表示しようとしています。アプリが終了したときに通知が発生しない
以下のコードは、アプリが開いているときや最小化されているときは完全に機能しますが、アプリが終了しても呼び出されることはありません。
主な活動(のonCreate())
Intent alarm = new Intent(this.context, AlarmReceiver.class);
boolean alarmRunning = (PendingIntent.getBroadcast(this.context, 0, alarm, PendingIntent.FLAG_NO_CREATE) != null);
if (!alarmRunning) {
PendingIntent pendingIntent = PendingIntent.getBroadcast(this.context, 0, alarm, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 60000, pendingIntent);
}
警報受信機
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent background = new Intent(context, BackgroundService.class);
context.startService(background);
}
}
バックグラウンドサービス
public class BackgroundService extends Service {
private final String TAG = getClass().getName();
private Boolean isRunning;
private Context context;
private Thread backgroundThread;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
this.context = this;
this.isRunning = false;
this.backgroundThread = new Thread(myTask);
}
private Runnable myTask = new Runnable() {
@Override
public void run() {
Log.d(TAG, "THE BACKGROUND SERVICE IS RUNNING");
//Run actions
showNotification(context);
//
stopSelf();
}
};
private void showNotification(Context context) {
Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)
.setSmallIcon(R.drawable.icon)
.setContentTitle("Notification!") // title for notification
.setContentText("Alarm Received")
.setSound(soundUri)// message for notification
.setAutoCancel(true); // clear notification after click
NotificationManager mNotificationManager =
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(0, mBuilder.build());
}
@Override
public void onDestroy() {
this.isRunning = false;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (!this.isRunning) {
this.isRunning = true;
this.backgroundThread.start();
}
return START_STICKY;
}
}
マニフェスト
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<service android:name=".notification.BackgroundService" />
<receiver android:name=".notification.AlarmReceiver"
android:process=":remote"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
私はいくつかの記事を読んだことがあるが、通知がまだときにチェック/示すことができるように、これを解決する方法についての答えを見つけるように見えることはできませんアプリが閉じていて、閉じているとは、ユーザーが実行中のアプリリストからアプリを削除した場所を意味します。
ただrecomendation、受信者+サービスの代わりに 'IntentService'を使用すると、はるかに簡単です。バックグラウンドスレッドで動作し、タスク終了後に自身を停止します –
はスリープモードのデバイスですか、試しても画面が消えていますか?どのデバイスとOSバージョンでテストしましたか? – Opiatefuchs
は 'BroadcastReceiver'の代わりに' WakefulBroadcastReceiver'から拡張し、 'IntentService'を使用します –