0

Я пытаюсь настроить диспетчер аварийных сигналов так, чтобы он выполнялся каждые 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> 

Я прочитал несколько постов, но не могу найти ответ о том, как решить эту проблему таким образом, что уведомление по-прежнему может быть показан/проверяется для того, когда приложение закрыто и закрыто. Я имею в виду, когда пользователь удаляет приложение из списка запущенных приложений.

+0

только рекомендация, используйте 'IntentService' вместо приемника + сервис, что намного проще. Он работает в фоновом потоке и останавливается после завершения задачи. –

+0

- это ваше устройство в спящем режиме или экран выключен, когда вы его попробуете? на каком устройстве и версии os вы его протестировали? – Opiatefuchs

+1

простирается от 'WakefulBroadcastReceiver' вместо' BroadcastReceiver' и использует 'IntentService' –

ответ

0

Удаленный доступ к этому решению с помощью onTaskRemoved() для перезапуска службы.

@Override 
public void onTaskRemoved(Intent rootIntent) { 
    Log.i(TAG, "onTaskRemoved()"); 

    Intent restartServiceIntent = new Intent(getApplicationContext(), this.getClass()); 
    restartServiceIntent.setPackage(getPackageName()); 

    PendingIntent restartServicePendingIntent = PendingIntent.getService(getApplicationContext(), 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT); 
    AlarmManager alarmService = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); 
    alarmService.set(
      AlarmManager.ELAPSED_REALTIME, 
      SystemClock.elapsedRealtime() + 1000, 
      restartServicePendingIntent); 

    super.onTaskRemoved(rootIntent); 
} 
0

Try код изменение сигнала тревоги:

 final int ALARM_ID = 1234; // your alarm id 
     startAlarm(600); // trigger after 10 minutes 

     public void startAlarm(int seconds) { // set alarm in seconds 
      Intent intent = new Intent(this, AlarmReceiver.class); 
      AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
      PendingIntent pendingIntent = PendingIntent.getBroadcast(this, ALARM_ID, intent, PendingIntent.FLAG_CANCEL_CURRENT); 

      alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (seconds * 1000), pendingIntent); 
     } 

     public void cancelAlarm() { // to cancel alarm before trigger 
      Log.d("lucas", "cancelAlarm"); 
      Intent intent = new Intent(this, AlarmReceiver.class); 
      AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
      PendingIntent pendingIntent = PendingIntent.getBroadcast(this, ALARM_ID, intent, PendingIntent.FLAG_CANCEL_CURRENT); 

      alarmManager.cancel(pendingIntent); 
      pendingIntent.cancel(); 
     } 

     public boolean hasAlarm() { // check alarm is running 
      Intent intent = new Intent(this, AlarmReceiver.class); 
      return (PendingIntent.getBroadcast(this, ALARM_ID, intent, PendingIntent.FLAG_NO_CREATE) != null); 
     } 

Не называтьstopSelf() метод, он может убить приложение. Это работающий сервис в фоновом режиме, который поддерживает процесс приложения. Без запуска службы система может убить ваше приложение, удалить уведомление и отменить ваши аварийные сигналы.

Совет: Вызов метода stopSelf() при нажатии или отмене уведомления.

+0

Используя это в главной операции onCreate(), а также используя это для замены stopSelf() в потоке BackgroundService, все равно получается тот же результат. Как только приложение будет закрыто (удалено из списка запущенных приложений), уведомление будет удалено из строки состояния, и служба не будет запущена снова. –

 Смежные вопросы

  • Нет связанных вопросов^_^