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

Android AlarmManager 和 Service 问题

BroadcastReceiver和AlarmManager Android

android 使用timertask和alarmmanager哪个好点

Android闹钟 AlarmManager的使用

android中的日历事件和alarmManager服务