1

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

4

3 回答 3

1

PendingIntents代表相同Intent,因此您的警报是相同的,因此您的第二个警报取代了第一个警报。

从文档中,

如果您使用两个Intent根据 等价的对象Intent.filterEquals,那么您将获得相同PendingIntent的两个对象。

还,

requestCode 发件人的私人请求代码(当前未使用)。

(即您从 0 更改为 1 的值)

于 2013-10-09T10:12:11.760 回答
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.

于 2013-10-09T10:29:56.457 回答
0

警报 1 的意图被警报 2 的意图取代。这就是为什么只有第二个警报起作用的基本原因。

于 2013-10-09T10:12:40.693 回答