0

我正在尝试使用警报管理器在不同时间触发 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();
        }
    };

在上面的代码中,我启动了一个意图,它引发了下面给出的 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);
}

我认为这里有问题,因为祝酒词永远不会出现,警报也不会出现。

4

1 回答 1

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 函数,你应该从你的 Intent 中额外阅读这个。

@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,那么您将只完成您的服务。

作为附带说明,使用 Handler 在您的服务中显示 toast 消息是一种更好的做法。

于 2012-07-21T21:21:40.167 回答