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; 
} 

}

マニフェスト

<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

ただrecomendation、受信者+サービスの代わりに 'IntentService'を使用すると、はるかに簡単です。バックグラウンドスレッドで動作し、タスク終了後に自身を停止します –

+0

はスリープモードのデバイスですか、試しても画面が消えていますか?どのデバイスとOSバージョンでテストしましたか? – Opiatefuchs

+1

は 'BroadcastReceiver'の代わりに' WakefulBroadcastReceiver'から拡張し、 '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

てみチェンジアラームコード:

 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()でこれを使用し、これを使用してBackgroundServiceのスレッドでstopSelf()を置き換えると、同じ結果が生成されます。アプリケーションが終了すると(実行中のアプリケーションリストから削除されると)、通知はステータスバーから削除され、サービスは再開されません。 –

関連する問題