8

私はSMSスケジュールアプリを作成しています。このアプリは、ユーザーからの時間、SMS、および番号を取得し、特定の時間にこのSMSを送信します。私はを使用してPendingIntentいます。これが私のサンプルコードです。

ユーザーがスケジュールを作成すると、このメソッドを呼び出すだけです。

private void SendMessages()
    {
        Intent intent = new Intent(this, SMSBroadcastReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(
                this.getApplicationContext(), 234324243, intent, 0);

        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP, Timemilli, pendingIntent);
    }

そしてここに「SMSBroadcastReceiver.java」ファイルがあります

public class SMSBroadcastReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Toast.makeText(context, "SMS Sent !!!!.", Toast.LENGTH_LONG)
                .show();
        // //Sms Sending

        try
        {
            SmsManager smsManager = SmsManager.getDefault();
            for (int i = 0; i < SMSScheduleContactsActivity.SelectedContacts.length; i++)
            {
                smsManager.sendTextMessage(
                        SMSScheduleContactsActivity.SelectedContacts[i], null,
                        AddNewSmsSchedule.Message, null, null);
            }

            Log.d("testllllllllllllllll", "Message Sent");
        }
        catch (Exception e)
        {   
            e.printStackTrace();
        }
    }

}

私の質問は、ユーザーがスケジュールを編集するときに、そのブロードキャストをキャンセルして新しいブロードキャストを送信するにはどうすればよいですか?複数のスケジュールが存在する可能性があるため、変更/中止する特定のスケジュールを見つけるにはどうすればよいですか?

4

4 に答える 4

10

ユーザーがスケジュールを編集した場合、そのブロードキャストをキャンセルして新しいブロードキャストを送信するにはどうすればよいですか?

スケジュールの設定に使用したものと同等のものを使用して電話cancel()をかけます。AlarmManagerPendingIntent

Intent intent = new Intent(this, SMSBroadcastReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 234324243, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

alarmManager.cancel(pendingIntent);

複数のスケジュールが存在する可能性があるため、変更/中止する特定のものを見つける方法は?

実装にはアラームが 1 つしかありません。

于 2013-01-07T15:43:58.257 に答える
6

保留中のインテントへの参照がある場合は、インテントをキャンセルできます。現在のブロードキャストを中止したい場合は、abortBroadcastを使用できます。

以下も参照してください。

1) PendingIntent を取得してキャンセルする方法は?

2)保留中のインテントを停止する

3)ブロードキャストの中止/キャンセル

于 2012-12-26T19:12:00.080 に答える
0
  • public final void abortBroadcast ()

API レベル 1 で追加 このレシーバーが現在のブロードキャストを中止する必要があることを示すフラグを設定します。Context.sendOrderedBroadcast を通じて送信されたブロードキャストでのみ機能します。これにより、他のブロードキャスト レシーバがブロードキャストを受信できなくなります。Context.sendOrderedBroadcast の呼び出し元が渡した BroadcastReceiver の onReceive(Context, Intent) を引き続き呼び出します。

このメソッドは、Context.sendBroadcast で送信されるような順序付けされていないブロードキャストでは機能しません。

于 2013-01-09T21:44:42.130 に答える
0

を変更するだけの場合は、関数を再度Timemilli呼び出すことができます。sendMessage()

alarmManager.set(AlarmManager.RTC_WAKEUP, Timemilli, pendingIntent);

AlarmManager.set() 関数は、 pendingIntent が同じである限り、以前のアラームを自動的にキャンセルします。同じインスタンスである必要はありませんが、Intent.filterEquals() に従って「一致」する必要があります。

この動作のため、PendingIntent を取得する目的で、2 つの Intent がいつ同じであると見なされるかを知ることが重要です。人々が犯すよくある間違いは、毎回異なる PendingIntent を取得することを期待して、「余分な」コンテンツのみが異なるインテントを持つ複数の PendingIntent オブジェクトを作成することです。これは起こりません。マッチングに使用される Intent の部分は、Intent.filterEquals で定義されたものと同じです。Intent.filterEquals に従って同等の 2 つの Intent オブジェクトを使用すると、両方に対して同じ PendingIntent が得られます。

http://developer.android.com/reference/android/app/AlarmManager.html#set(int , long, android.app.PendingIntent)

http://developer.android.com/reference/android/app/PendingIntent.html http://developer.android.com/reference/android/content/Intent.html#filterEquals(android.content.Intent)

于 2013-01-10T02:37:26.877 に答える