我正在尝试使用警报管理器在不同时间触发3个警报。这是我的代码(请注意,alarm1,alarm2,alarm3是我代码中前面设置的三个日历对象):
AlarmNum=1;
new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
// TODO Auto-generated method stub
Intent myIntent = new Intent(MainActivity.this,
MyAlarmService.class);
pendingIntent = PendingIntent.getService(MainActivity.this, 0,
myIntent, 0);
if (AlarmNum == 1)
alarmManager.set(AlarmManager.RTC_WAKEUP,
alarm1.getTimeInMillis(), pendingIntent);
else if (AlarmNum == 2)
alarmManager.set(AlarmManager.RTC_WAKEUP,
alarm2.getTimeInMillis(), pendingIntent);
else
alarmManager.set(AlarmManager.RTC_WAKEUP,
alarm3.getTimeInMillis(), pendingIntent);
Toast.makeText(MainActivity.this, "Start Alarm",
Toast.LENGTH_LONG).show();
}
};
在上面的代码中,我启动了一个intent,它引发了下面给出的MyAlarmService类:
public class MyAlarmService extends Service {
MainActivity instance;
MediaPlayer mp;
@Override
public void onCreate() {
// TODO Auto-generated method stub
Toast.makeText(this, "MyAlarmService.onCreate()", Toast.LENGTH_LONG)
.show();
mp = MediaPlayer.create(this, R.raw.alarmtone);
instance = new MainActivity();
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
Toast.makeText(this, "MyAlarmService.onBind()", Toast.LENGTH_LONG)
.show();
return null;
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Toast.makeText(this, "MyAlarmService.onDestroy()", Toast.LENGTH_LONG)
.show();
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
Toast.makeText(this, "MyAlarmService.onStart()", Toast.LENGTH_LONG)
.show();
mp.start();
instance.setAlarmNum(instance.getAlarmNum() + 1);
}
@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
mp.release();
mp.reset();
Toast.makeText(this, "MyAlarmService.onUnbind()", Toast.LENGTH_LONG)
.show();
return super.onUnbind(intent);
}
} 我认为这里有一个问题,因为祝酒词从不出现,也没有报警。
答案 0 :(得分:0)
我从您的代码和评论中理解的是,您希望第一个警报触发第二个和第二个警报触发第三个等等。
我注意到你的代码有几个问题。
1)这是一种错误的启动活动的方法,它不起作用:
instance = new MainActivity();
相反,你应该这样做:
Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse(url));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
无论上述问题如何,每次触发警报时都不必启动MainActivity。您可以在服务中触发新警报。 在这里,我假设第二个警报触发时间晚于第一个,第三个晚于第二个等等。否则,您的算法将无效。
将在您的活动中设置第一个警报:
Intent myIntent = new Intent(MainActivity.this, MyAlarmService.class);
myIntent.addExtra("AlarmNum",1);
PendingIntent pendingIntent = PendingIntent.getService(MainActivity.this, 0,
myIntent, 0);
alarmManager.set(AlarmManager.RTC_WAKEUP,alarm1.getTimeInMillis(), pendingIntent);
请注意,我为您的意图添加了一个额外的整数,以便您的服务能够了解之前设置的警报。
回到你的服务onBind函数,你应该从你的意图中读取这个额外的东西。
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
...
int AlarmNum = intent.getIntExtra("AlarmNum",0);
...
return null;
}
然后,检查AlarmNum的值并按照我们的方式设置下一个警报,具体取决于值(如果AlarmNum == 1,设置第二个警报,将意图的额外值加1,等等)。由于您要设置3个警报,如果它设置为3,那么除了完成您的服务之外,您什么都不做。
作为附带通知,最好使用处理程序在服务中显示Toast消息。