0

私はAndroidが初めてで、ユーザーが日付、時刻、メッセージを入力して、入力した日付と時刻に通知される日付リマインダーアプリを作成しています。これまで、アラームの作成、通知の表示、通知のクリック時、その通知の詳細を含むアプリを開き、必要に応じて更新し、すべてのアラームを一覧表示することを達成しました (データを保存するために SqlLite を使用しました)。

アラーム一覧ページで、アイテムをクリックすると、AlertDialog ボックスに削除オプションが表示されます。削除をクリックすると、データベースからアラームの詳細が削除されますが、アラームをキャンセルできません。

これは、アラームを作成しているクラスとアラームをキャンセルしているクラスの2つのクラスのコードです。何が欠けているのかわかりません!!!!

Class CreateActivity extends Activity
methode setAlarm{
.....
        Intent myIntent = new Intent(this.getApplicationContext(), AlarmReciever.class);
        myIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

        db = new DatabaseHandler(this);
        if(!isNotified) //create new alarm
        {
            Random random = new Random();
            alarmId  = random.nextInt(10000);
            pojo = new DateBookPojo(alarmId, inDate, inTime, inMsg);
            db.addReminder(pojo);
            System.out.println("Adding Reminder.");
        }else{ // Its from notification
            pojo = new DateBookPojo(alarmId, inDate, inTime, inMsg);
            db.updateReminder(pojo);
            System.out.println("Updating Reminder.");
        }

        myIntent.putExtra("alarmId", alarmId);

        pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), alarmId, myIntent,0);

        AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent);
....
}

Here AlarmId is unique passed to PendingIntent

AlertDialogをクリックすると、データベースからアラームを削除し、アラームマネージャーをキャンセルしようとする別のリストアクティビティがあります。ここでは、PendingIntent の作成に使用されたものと同じ AlarmId を使用しました

Class MyListActivity extends ListActivity
....
private void deleteReminder(int alarmId) {
    System.out.println("alarmId= "+ alarmId);
    DatabaseHandler db = new DatabaseHandler(this);
    DateBookPojo pojo = new DateBookPojo();
    pojo.setReminderId(alarmId);
    db.deleteReminder(pojo); // delete alarm details from database
    System.out.println("Deleted Entry. = > " + alarmId);

    Intent myIntent = new Intent(this.getApplicationContext(), AlarmReciever.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), alarmId, myIntent,0);

    AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
    alarmManager.cancel(pendingIntent);
    System.out.println("Cancelled Alarm. = > " + alarmId);

    showList(); // Again show the new list.
}

私はグーグルとスタックオーバーフローをたくさんしましたが、どこでもこのソリューションがうまく機能しているのを見ましたが、私にとってはうまくいきませんでした。

ここで注意したことの1つは、通知のOnlickです。CreateActivityクラスを使用して詳細を表示し、更新時に通知されたアラームを更新しています。Intent&に関連する Context の周りで何かをいじっていると思いPendingIntentます。

私を助けてください。

4

2 に答える 2

3

これを追加:

myIntent.putExtra("alarmId", alarmId);

メソッドに追加しますdeleteReminder()(またはから削除しますsetAlarm)。

a を削除するPendingIntentには、正確に一致する必要があります。

于 2013-10-22T06:27:52.667 に答える
0

これを参照してください。 cancel() を使用して AlarmManager からアラームを削除する - Android

そこに提供された回答によるとpendingIntent、削除メソッドは次のように宣言する必要があります

PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), alarmId, myIntent,PendingIntent.FLAG_UPDATE_CURRENT);
于 2013-10-22T06:32:26.763 に答える