我正在制作一个短信计划应用程序,它只需要用户的时间,短信和号码,并在给定时间发送短信。我正在使用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();
}
}
}
我的问题是:当用户编辑时间表时,如何取消该广播并发送新广播?由于可以有多个时间表,如何找到更改/中止的特殊情况?
答案 0 :(得分:10)
当用户编辑时间表时,如何取消该广播并发送新广播?
在cancel()
上使用与您用于设置时间表的AlarmManager
相同的PendingIntent
来呼叫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}}
由于可以有多个时间表,如何找到更改/中止的特定时间?
您的实施中只有一个警报。
答案 1 :(得分:6)
如果你有对待处理意图的引用,那么你可以cancel意图。如果要中止当前广播,可以使用abortBroadcast。
另见:
答案 2 :(得分:0)
在API级别1中添加 设置指示此接收器应中止当前广播的标志;仅适用于通过Context.sendOrderedBroadcast发送的广播。这将阻止任何其他广播接收器接收广播。它仍将调用Context.sendOrderedBroadcast的调用者传入的BroadcastReceiver的onReceive(Context,Intent)。
此方法不适用于非有序广播,例如使用Context.sendBroadcast发送的广播
答案 3 :(得分:0)
如果您只是更改Timemilli
,则可以再次致电sendMessage()
功能。
alarmManager.set(AlarmManager.RTC_WAKEUP, Timemilli, pendingIntent);
只要pendingIntent相同,AlarmManager.set()函数就会自动取消上一个警报;它不必是同一个实例,但需要根据Intent.filterEquals()进行“匹配”:
由于这种行为,为了检索PendingIntent,重要的是要知道两个Intent何时被认为是相同的。人们常犯的一个错误是使用Intents创建多个PendingIntent对象,这些对象只在其“额外”内容中有所不同,期望每次都获得不同的PendingIntent。这不会发生。用于匹配的Intent部分与Intent.filterEquals定义的部分相同。如果你使用两个与Intent.filterEquals相同的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)