2012-04-01 35 views
1

私のアプリでは、データベースに行を追加し、データベースの列の1つに指定された時刻に毎日繰り返すようにアラームイベントを設定する必要があります。私はすでにいくつかのコードを持っていますが、指定された時刻にアラームイベントを引き起こします。ここに私のコードです:Android:AlarmManagerで定期アラームを設定する

public class Add_reminder extends Activity { 
    AlarmManager am; 
    int hours, minutes; 
    REMIND_DB db; 
    Calendar calendar; 
    Cursor cursor; 
    Button button; 

    public void onCreate(Bundle savedInstanceState) { 
     //The usual code in the beginning of onCreate 

     //I load db from extended Application class as global since i use it in more 
     //Activities. Ints hours and minutes is set by user interaction 

     calendar = Calendar.getInstance(); 
     am = (AlarmManager) getSystemService(ALARM_SERVICE); 

     button.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       db.open(); 
       db.insertReminder(-- parameters for database --); 
       cursor = db.getAllReminders(); 
       cursor.moveToLast(); 
       calendar.set(Calendar.HOUR, hours); 
       calendar.set(Calendar.MINUTE, minutes); 
       Intent intent = new Intent(Add_reminder.this, ReminderAlarm.class); 
       intent.putExtra("id_of_db_row", cursor.getInt(0)); 
       PendingIntent pi = PendingIntent.getActivity(Add_reminder.this, 
        cursor.getInt(0), intent, PendingIntent.FLAG_CANCEL_CURRENT); 
       am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 
        24*3600*1000, pi); 
       db.close() 
      } 
     }); 
    } 
} 

データベースは正しく更新されますが、ReminderActivityは指定された時間に決して開始しません。何が間違っているのか分かりません。 PendingIntentでアクティビティを開始するのではなく、BroadcastReceiverを使っていくつかのサンプルコードを見ましたが、これも正しく動作するはずです。誰が何が間違っているかも知っていますか?

2番目の質問は、別のアクティビティからいくつかのアラームを追加または削除するときに、同じインスタンスのAlarmManagerが必要な場合ですか、必要なすべてのアクティビティで別のAlarmManagerを宣言するだけですか?

ありがとうございました!

答えて

1

アラームを受信するためにブロードキャストレシーバを使用し、実際の作業を行うサービスを開始する必要があります。ブロードキャスト受信者は、(DBへの書き込みなどの)長い操作でUIスレッドをブロックすべきではありません。さらに、「1日1回」のアラームが問題になることがあります。ユーザーが電話を再起動すると、登録されたアラームが失われます。以下を行う必要があります。

  • は、携帯電話のブーツ(BOOT_COMPLETED放送を受信)
  • setRepeating()を使用しないときSharedPreferecnes
  • があなたのアラームを再登録し、たとえば、アラームがに実行することになっている時間を節約します各アラームを次の日に登録させてください

テストに短時間(1または2分)を使用すると役立ちます。

AlarmManagerインスタンスは、システムサービスであるため、使用しているインスタンスを気にする必要はありません。ちょうどそれを得るgetSystemService()

+0

私は今朝私の電話を見て、私は希望の活動が開始されたことに気づいた!問題は24時間形式のHOUR_OF_DAYではなく、12時間形式のHOURを使用したため、12時間後にリマインダーが思い出されたためです。主なアクティビティには、アクティビティが開始された後に1回だけ実行されるコードブロックがあります。データベースのデータを使用してアラームを再登録できますか?ユーザーがアプリを再起動しただけで、電話機自体を再起動しない場合は、アラームを置き換えますか?それとも、それはちょうど重複しますか?ありがとうございました。 –

+0

進捗状況:まだ、活動がどこにも現れないようにすることは、一般的には悪い考えです。私が言ったように、放送受信機とサービスを使用してください。ユーザーとの対話が必要な場合は、通知を送信して、ユーザーにアクティビティーを開始させます。同等の 'PendingIntent'アラームを使用すると、重複しないで上書きされます。 –

+0

大きな助けをしてくれてありがとう:私はあなたが言ったように私はBroadcastReceiverを使用しています、このタイミングの問題はただちにでした:) –

関連する問題