只有第二次报警正在执行?

时间:2013-10-09 10:08:49

标签: android alarmmanager

我的活动中有两个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消息的服务。每当我执行上面的代码时,只有第二个警报正在执行。为什么第一个警报没有被执行?

3 个答案:

答案 0 :(得分:1)

PendingIntents表示相同的Intent,因此您的闹钟是相同的,因此您的第二个闹钟会替换第一个闹钟。

从文档中

  

如果您使用两个IntentIntent.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的意图所取代。这是为什么只有第二个警报正常工作的基本原因。