Android AlarmManager 和 Service 问题
Posted
技术标签:
【中文标题】Android AlarmManager 和 Service 问题【英文标题】:Android AlarmManager and Service question 【发布时间】:2011-01-27 18:02:11 【问题描述】:我的应用中有一些文件,但现在只有 3 个是重要的。这是一个带有警报声音和通知的提醒应用程序。 我有一个包含复选框及其侦听器的 maincode.java 文件。如果用户在 chechbox 中签入,AlarmManager 会向 AlarmReceiver.java 发送一个意图,后者会启动 MyService.java。 MyService java 包含有关播放声音的代码。代码是部分的。 MyService.java:
public void onCreate()
Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
Log.d(TAG, "onCreate");
player = MediaPlayer.create(this, R.raw.sound);
player.setLooping(false); // Set looping
@Override
public void onDestroy()
Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
Log.d(TAG, "onDestroy");
player.stop();
@Override
public void onStart(Intent intent, int startid)
Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
Log.d(TAG, "onStart");
player.start();
AlarmReceiver.java:
public void onCreate()
Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
Log.d(TAG, "onCreate");
player = MediaPlayer.create(this, R.raw.sound);
player.setLooping(false); // Set looping
maincode.java 的重要部分:
cb1 = (CheckBox) findViewById(R.id.CheckBox01);
cb1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
if (cb1.isChecked())
if (GlobalVars.getHourOfDay() >= 0)
Toast.makeText(maincode.this, "ok", Toast.LENGTH_SHORT).show();
rem1.setText(GlobalVars.getReminder1name());
Intent intent = new Intent(maincode.this, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(bInsulinReminder.this, 0,
intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, GlobalVars.getHourOfDay());
cal.set(Calendar.MINUTE, GlobalVars.getMinute());
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis()+ 3000, 6000, pendingIntent);
Toast.makeText(maincode.this, "Checked", Toast.LENGTH_SHORT).show();
else
rem1.setText("No reminder set");
Toast.makeText(maincode.this, "Not checked", Toast.LENGTH_SHORT).show();
);
(rem1 是提醒按钮,其文本取决于用户想要的任何名称)
代码的问题是,如果我启动警报,我无法停止它。我知道 MyService.java 中有 player.stop() 命令,但是我如何从未选中复选框的 maincode.java 末尾调用它?
【问题讨论】:
【参考方案1】:不,您不能直接从侦听器中执行此操作。您可以通过这种方式禁用警报:
Intent intent = new Intent(maincode.this, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(bInsulinReminder.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
pendingItem.cancel();
alarmManager.cancel(pendingItem);
或者如果(我想)AlarmReceiver 是 BroadcastReceiver 的实现,你可以从 onReceive 方法启动 MyService,它是 Service 类的实现。
因此,如果您想从 maincode.java 监听器中停止此警报,您可以通过重新创建您在 AlarmReceiver 中使用的 PendingIntent 并执行 stopService 方法来停止 MyService。
希望对您有所帮助。
【讨论】:
以上是关于Android AlarmManager 和 Service 问题的主要内容,如果未能解决你的问题,请参考以下文章
Android AlarmManager 和 Service 问题
BroadcastReceiver和AlarmManager Android