1

私の主な活動では、アプリが最初にロードされたときにアラームを設定するメソッド setRepeatingAlarm() があります。このメソッドは、列をループし、SQLite テーブルの各行から整数値を取得することで、アラームを正常に設定します。基本的な方法は次のとおりです。

 for (int i : AlarmDays) {


        Calendar cal = Calendar.getInstance();
        if (cal.get(Calendar.MINUTE) >= i)
            cal.add(Calendar.HOUR, 1);
        cal.set(Calendar.MINUTE, i);

        Intent intent = new Intent(ManageDebts.this, TimeAlarm.class);
        pendingIntent = PendingIntent.getBroadcast(this, i,
                intent, PendingIntent.FLAG_CANCEL_CURRENT);
        am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
                60 * 60 * 1000, pendingIntent);
    }

メソッドが完了すると、各行を再度ループし、それぞれを CustomAdapter (リスト) に入れてデータを表示します。これは、メイン クラスの onCreate のコンテキストです (これも基本的なものです)。

    datasource = new DebtDataSource(this);
    datasource.open();

    **am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    setRepeatingAlarm();**

    values = datasource.getAllDebt();
    adapter = new MyArrayAdapter(this, values);
    setListAdapter(adapter);

ユーザーが行を長押しするとアイテムが削除されるか、すべての行を削除するボタンがあります。すべてが機能しますが、アラームを消すことができません。

これを行う方法は理解していますが(同じ保留中のインテントを同じエクストラで設定してメソッドをキャンセルします)、私の試みは失敗しました!どこに置くべきかわかりませんか?上記はすべて同じクラスです。

ユーザーが 1 つの行を削除するかすべてを削除するかにかかわらず、簡単な方法は、すべてのアラームを削除し、そのメソッドを再度ループしてリセットすることだと思います。誰か助けて、このキャンセルコードをどこに置くべきか教えてもらえますか?

4

1 に答える 1

5

リストのロングクリックで

PendingIntent pi = PendingIntent.getBroadcast(context, unique_id, i, 0);
am.cancel(pi);

unique_id は保留中のインテントごとに分かれているため、listview id を取得し、+1 を追加して保留中のインテント ID にします。

その特定の PendingIntent が削除されるようにします。

すべてのアラームをキャンセルするには アラームを設定してキャンセルするのと同じように for ループを作成します。

于 2012-06-12T14:43:27.340 に答える