2017-08-04 16 views
0

私はかなり長い間これで戦ってきました。私はアラームマネージャを使ってアラームをスケジュールしています。私はマニフェストファイルで受信者を宣言しています。アプリが実行中またはバックグラウンドでアラームとレシーバーが意図どおりに動作するため、ユーザーがアプリを終了した後にアラームを発することができません。私は本質的にはアプリケーションにローカル通知を加えようとしています。ここでの他の「答え」はどれも大いに役立っていません。アプリケーションが終了したときにローカル通知を発することは可能ですか?ここでAndroidスタジオアラームマネージャアプリが閉鎖

public static void writtenGoalsNotification(Context context) { 

    final int _id = 15; 

    pref = context.getSharedPreferences("userpref", 0); 

    Notification notification = getNotification("Don't forget to write your daily goals!", context, "none", "Goals"); 
    Intent notificationIntent = new Intent(context, NotificationReceiver.class); 

    notificationIntent.putExtra(NotificationReceiver.NOTIFICATION_ID, "written goals notification"); 
    notificationIntent.putExtra(NotificationReceiver.NOTIFICATION, notification); 
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_INCLUDE_STOPPED_PACKAGES); 
    notification.flags |= Notification.FLAG_AUTO_CANCEL; 

    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, _id, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

    Integer hour = pref.getInt(NotificationKeys.Goals.ReminderTime.hour, 10); 
    Integer minute = pref.getInt(NotificationKeys.Goals.ReminderTime.minute, 0); 
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 

    Calendar cal = Calendar.getInstance(); 
    cal.set(Calendar.HOUR_OF_DAY, hour); 
    cal.set(Calendar.MINUTE, minute); 
    cal.set(Calendar.MILLISECOND, 0); 

    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 1000 * 60 * 60 * 24, pendingIntent); 

} 

は、これは私のマニフェストにある

public class NotificationReceiver extends WakefulBroadcastReceiver { 

public static String NOTIFICATION_ID = "notification-id"; 
public static String NOTIFICATION = "notification"; 

@Override 
public void onReceive(Context context, Intent intent) { 

    NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); 

    Notification notification = intent.getParcelableExtra(NOTIFICATION); 
    int id = intent.getIntExtra(NOTIFICATION_ID, 0); 
    notificationManager.notify(id, notification); 

    startWakefulService(context, intent); 

    WakeLocker.acquire(context); 
    WakeLocker.release(); 

} 
} 

<receiver 
     android:name=".Controllers.NotificationReceiver" 
    </receiver> 
+0

ショーのエラーログ – DroiDev

+0

は、私はより説明的な何かを得ることができるのですか?コードがエラーを生成していない、アプリが実行中またはバックグラウンドで通知が正しく発生します。問題は、アプリケーションが閉じられると、アラームまたは受信者のいずれかが破壊されることです。 –

+0

私はこの問題を誤解しました。私の謝罪を受け入れる。私はあなたがボードキャスト受信機を拡張する必要があると思う.... iveは覚醒している放送受信機で働いたことはない。うまくいけば、他の誰かがあなたを助けるためにチャイムすることができます。 – DroiDev

答えて

0

放送受信機は、APIレベルであなたがalramを得ることはありません26 主な理由廃止されて、私の受信機であります受信したのは、使用しているAppのプロセスが終了し、デバイスにメモリが足りない場合にクリアされるためです。代わりに、優先度が高くなるようにサービスを使用する必要があります。 このため、WakeupBroadcastReceiverの代わりにBroadcastReceiverクラスを使用することをお勧めします。なぜなら、Androidのdocsはthis- と言っているからです(ブロードキャストの受信からサービスを開始するのは一般的に安全ではありません。この時点でフォアグラウンドで実行することが許可されています)。

したがって、alramを設定するプロセスが壊れる可能性があります。したがって、BroadcastReceiverを使用してください。 はマニフェストでは、この

<receiver 
     android:name=".NotificationReceiver" 
    </receiver>