1

MainActivityに入るスプラッシュ画面の2つのアクティビティしかないかなり基本的なアプリがあります。AlarmManagerを使用して起動する固定時間の通知を作成しました。現在、スプラッシュ画面中にAlarmManagerを実行しています。私には2つの問題があります。1つ:AlarmMangerはスプラッシュアクティビティに含まれているため、アプリが起動されるたびに実行されます。そのため、通知の時間が過ぎた場合、アプリはすぐに通知を送信します。:通知の時間がまだ発生していない場合、MainActivityで通知をクリアするための呼び出しがあり、通知がまだ発生していないため、通知をクリアするための呼び出しがMainActivityをクラッシュさせるため、アプリがクラッシュします。MainActivityをクラッシュさせるのは明確な通知呼び出しであることがわかっています。これは、呼び出しをコメントアウトすると、アプリが正常に実行されるためです。

質問:アプリが起動されるたびに通知が読み込まれないように通知をコーディングする方法はありますか?また、アプリが起動していなくてもアプリがクラッシュしないように、通知ビットをクリアに書き込むことはできますか?スプラッシュアクティビティにある通知は次のとおりです。

    private void launchAlarmManager() {
    //---- ALARM MANAGER ------
    //---use the AlarmManager to trigger an alarm---
    AlarmManager aMan = (AlarmManager) getSystemService(ALARM_SERVICE);

    //---get current date and time---
    Calendar alCal = Calendar.getInstance();
    //---sets the time for the alarm to trigger---                       
    alCal.set(Calendar.HOUR_OF_DAY, 12);            
    alCal.set(Calendar.MINUTE, 25);                
    alCal.set(Calendar.SECOND, 00);

    //---PendingIntent to launch activity when the alarm triggers---                    
    Intent iDN = new Intent("com.myapp.DISPLAYNOTIFICATIONS");

    PendingIntent pendA = PendingIntent.getActivity(this, 0, iDN, 0);
    //---sets the alarm to trigger--- 
    aMan.set(AlarmManager.RTC_WAKEUP, alCal.getTimeInMillis(), pendA);

    //---- END ALARM MANAGER ------

MainActivityのキャンセル通知ビットは次のとおりです。

NotificationManager nm;
//---cancel the notification by getting the Unique ID from the DisplayNotification class---
nm.cancel(getIntent().getExtras().getInt("uID"));
4

1 に答える 1

1

アラームが設定されているかどうかのステータスを保存する必要があると思います。擬似コードの場合:

load the alarm_has_been_set variable
if( !alarm_has_been_set ) {
    set alarm
    save alarm_has_been_set = true
}

次に、アラームがトリガーされたら、その変数の設定を解除します。保存と読み込みについては、Androidでデータを永続化するをご覧ください。

通知をキャンセルするときのクラッシュに関する2番目の質問については、try-catchブロックを使用してみてください。

try {
    nm.cancel(getIntent().getExtras().getInt("uID"));
} catch (Exception e) {
    System.out.println("Error when cancelling: "+e.toString());
}

また、NotificationManagerクラスをまったく初期化していないため、少なくともサンプルコードでNullPointerExceptionが生成されることに気付きました。

于 2012-04-24T21:53:42.483 に答える