Я пытаюсь настроить диспетчер аварийных сигналов так, чтобы он выполнялся каждые 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;
}
}
Manifest
<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>
Я прочитал несколько постов, но не могу найти ответ о том, как решить эту проблему таким образом, что уведомление по-прежнему может быть показан/проверяется для того, когда приложение закрыто и закрыто. Я имею в виду, когда пользователь удаляет приложение из списка запущенных приложений.
только рекомендация, используйте 'IntentService' вместо приемника + сервис, что намного проще. Он работает в фоновом потоке и останавливается после завершения задачи. –
- это ваше устройство в спящем режиме или экран выключен, когда вы его попробуете? на каком устройстве и версии os вы его протестировали? – Opiatefuchs
простирается от 'WakefulBroadcastReceiver' вместо' BroadcastReceiver' и использует 'IntentService' –