我的活动中有两个AlarmManager,如下所示,
public class MainActivity extends Activity
{
private AlarmManager alarm1,alarm2;
private Intent intent1,intent2;
private PendingIntent pi1,pi2;
private int HOUR=15,MINUTE=46,SECOND=10;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Calendar calendar = new GregorianCalendar();
calendar.setTimeZone(TimeZone.getDefault());
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, HOUR );
calendar.set(Calendar.MINUTE, MINUTE );
calendar.set(Calendar.SECOND, SECOND );
intent1 = new Intent ( MainActivity.this, BroadCastAlarm.class );
pi1 = PendingIntent.getService( MainActivity.this, 0, intent1, PendingIntent.FLAG_CANCEL_CURRENT );
alarm1 = (AlarmManager) getSystemService( ALARM_SERVICE );
alarm1.set( AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pi1 );
Calendar calendar1 = new GregorianCalendar();
calendar1.setTimeZone(TimeZone.getDefault());
calendar1.setTimeInMillis(System.currentTimeMillis());
calendar1.set(Calendar.HOUR_OF_DAY, HOUR );
calendar1.set(Calendar.MINUTE, MINUTE );
calendar1.set(Calendar.SECOND, SECOND+30 );
intent2 = new Intent ( MainActivity.this, BroadCastAlarm.class );
pi2 = PendingIntent.getService( MainActivity.this, 1, intent2, PendingIntent.FLAG_CANCEL_CURRENT );
alarm2 = (AlarmManager) getSystemService( ALARM_SERVICE );
alarm2.set( AlarmManager.RTC_WAKEUP, calendar1.getTimeInMillis(), pi2 );
}
}
BroadCastAlarm.java只是一个显示Toast消息的服务。每当我执行上面的代码时,只有第二个警报正在执行。为什么第一个警报没有被执行?
答案 0 :(得分:1)
PendingIntents
表示相同的Intent
,因此您的闹钟是相同的,因此您的第二个闹钟会替换第一个闹钟。
从文档中
如果您使用两个
Intent
个Intent.filterEquals
个对象,那么对于这两个PendingIntent
,您将得到相同的requestCode
。
此外,
{{1}}发件人的私人请求代码(当前未使用)。
(您将值从0更改为1)
答案 1 :(得分:1)
正如其他答案所示,第二个警报覆盖了第一个警报,因为它们共享相同的操作。如果要区分警报,而不是仅覆盖以前的警报,则必须设置操作。
首先,您需要在应用程序的清单标记中添加它:
<receiver android:name="com.yourcompany.yourpackage.AlarmReceiver" android:process=":remote" >
<intent-filter>
<data android:scheme="timer:" />
</intent-filter>
</receiver>
在定义意图时,只需添加以下内容:
intent1.setData(Uri.parse("timer:intent1"));
...
intent2.setData(Uri.parse("timer:intent2"));
然后你只需要定义一个BroadcastReceiver类来做东西。如果你想要祝酒:
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "I'm an alarm toast!!", Toast.LENGTH_LONG).show();
}
}
我还建议您将待处理意图标记更改为:PendingIntent.FLAG_UPDATE_CURRENT
。
答案 2 :(得分:0)
alarm1的意图被alarm2的意图所取代。这是为什么只有第二个警报正常工作的基本原因。