关于AlarmManager的疑问 - Android

时间:2014-09-12 23:52:11

标签: java android

我有一些疑问,我想澄清Android中的AlarmManager类 我有一个需要的应用程序:

  1. 允许用户设置时间。
  2. 发出警报。
  3. 然后,即使应用程序已关闭,它也应该在预设时间启动,并在主要活动中执行某项功能(如button.performClick())。
  4. 因此,我已成功创建了一个名为alarm.java的活动,在res\layout中创建了布局并将其添加到AndroidManifest.xml。另外,我已在alarm.java课程中成功设置了警报:

    onCreate(){
         alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
         intent = new Intent(context, MyActivity.class);
         pi = PendingIntent.getBroadcast(this.getApplicationContext(), ALARM_ID, intent, 0);
     }
    

    onClick(){
         cal.setTimeInMillis(System.currentTimeMillis());
         cal.set(Calendar.HOUR_OF_DAY, hour);
         cal.set(Calendar.MINUTE, minute);
         alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pi);
         Toast.makeText(getApplicationContext(), "Alarm Set For " + hour + ":" + minute + " " + ampm, Toast.LENGTH_LONG).show();
    }
    

    现在,在我的MyActivity.java课程中,这是主要活动,我添加了BroadcastReceiver

     public BroadcastReceiver AlarmReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            /*This is the part I got from SO for starting an activity from `BroadcastReceiver`
            Intent i = new Intent();
            i.setClassName("com.kanishka.nightstalker.homeautomation", "com.kanishka.nightstalker.homeautomation.MainActivity");
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(i);*/
            Toast.makeText(getApplicationContext(), "APP STARTED", Toast.LENGTH_LONG).show();
            button.performClick();
        }
    };
    

    显然,这种方法不起作用,因为我看到在经过的时间后没有弹出Toast。我有点明白这个问题是什么,我应该使用Service来解决这个问题。但据我所知,AlarmManager本身在后台运行,并且应该在经过的时间内触发BroadcastReceiver MyActivity.java。我哪里错了?

1 个答案:

答案 0 :(得分:2)

  

我哪里错了?

  1. 您正在使用setInexactRepeating()。在这里,"不精确"表示"不准确",因此警报将在您请求的时间INTERVAL_DAY内的某个时间发生。

  2. 您需要花费当前时间,然后设置小时和分钟,这可能会导致过去一段时间。

  3. 您正在为Intent创建MyActivity,这可能不是BroadcastReceiver(或者,如果是,MyActivity是一个非常奇怪的名字选择)。

  4. 如果您希望闹钟响起"即使应用已关闭",您还需要使用在清单中注册的BroadcastReceiver

  5. 在主要活动"中执行某项功能(如button.performClick())是不可能的,因为没有活动"如果应用是闭合"