代码之家  ›  专栏  ›  技术社区  ›  Tom

Android:如何使用AlarmManager

  •  84
  • Tom  · 技术社区  · 15 年前

    我需要在20分钟后触发一个代码块 AlarmManager 被设定。

    有人能给我演示一下如何使用 全局定时器 在Android中?

    我已经玩了几天代码了,但它不起作用。

    5 回复  |  直到 8 年前
        1
  •  104
  •   CommonsWare    11 年前

    “一些示例代码”不是那么简单 AlarmManager .

    下面是一个显示 全局定时器 :

    AlarmManager mgr=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    Intent i=new Intent(context, OnAlarmReceiver.class);
    PendingIntent pi=PendingIntent.getBroadcast(context, 0, i, 0);
    
    mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), PERIOD, pi);
    

    在这个例子中,我使用 setRepeating() . 如果你想要一声警报,你只需要使用 set() . 确保在初始参数中使用的时间基础上为报警提供时间。 集() . 在上面的示例中,我使用 AlarmManager.ELAPSED_REALTIME_WAKEUP ,所以我的时间基数是 SystemClock.elapsedRealtime() .

    Here is a larger sample project 展示这种技巧。

        2
  •  62
  •   default    13 年前

    Android示例代码中有一些很好的例子

    .\android sdk\samples\android-10\apidemos\src\com\example\android\apis\app

    要签出的是:

    • 报警控制器.java
    • 一个Shotalarm.java

    首先,你需要一个接收器,当它被触发时,它可以监听你的警报。将以下内容添加到androidmanifest.xml文件中

    <receiver android:name=".MyAlarmReceiver" />
    

    然后,创建以下类

    public class MyAlarmReceiver extends BroadcastReceiver { 
         @Override
         public void onReceive(Context context, Intent intent) {
             Toast.makeText(context, "Alarm went off", Toast.LENGTH_SHORT).show();
         }
    }
    

    然后,要触发警报,请使用以下方法(例如在主活动中):

    AlarmManager alarmMgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(this, MyAlarmReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
    Calendar time = Calendar.getInstance();
    time.setTimeInMillis(System.currentTimeMillis());
    time.add(Calendar.SECOND, 30);
    alarmMgr.set(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(), pendingIntent);
    

    .


    或者,更好的是,创建一个处理所有事务的类,并像这样使用它

    Bundle bundle = new Bundle();
    // add extras here..
    MyAlarm alarm = new MyAlarm(this, bundle, 30);
    

    这样,您就可以在一个地方完成所有操作(不要忘记编辑 AndroidManifest.xml )

    public class MyAlarm extends BroadcastReceiver {
        private final String REMINDER_BUNDLE = "MyReminderBundle"; 
    
        // this constructor is called by the alarm manager.
        public MyAlarm(){ }
    
        // you can use this constructor to create the alarm. 
        //  Just pass in the main activity as the context, 
        //  any extras you'd like to get later when triggered 
        //  and the timeout
         public MyAlarm(Context context, Bundle extras, int timeoutInSeconds){
             AlarmManager alarmMgr = 
                 (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
             Intent intent = new Intent(context, MyAlarm.class);
             intent.putExtra(REMINDER_BUNDLE, extras);
             PendingIntent pendingIntent =
                 PendingIntent.getBroadcast(context, 0, intent, 
                 PendingIntent.FLAG_UPDATE_CURRENT);
             Calendar time = Calendar.getInstance();
             time.setTimeInMillis(System.currentTimeMillis());
             time.add(Calendar.SECOND, timeoutInSeconds);
             alarmMgr.set(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(),
                          pendingIntent);
         }
    
          @Override
         public void onReceive(Context context, Intent intent) {
             // here you can get the extras you passed in when creating the alarm
             //intent.getBundleExtra(REMINDER_BUNDLE));
    
             Toast.makeText(context, "Alarm went off", Toast.LENGTH_SHORT).show();
         }
    }
    
        3
  •  8
  •   SohailAziz    10 年前

    您需要做的是首先创建您需要计划的意图。然后获得这个意图的悬而未决的内容。您可以安排活动、服务和广播。 要安排活动,例如MyActivity:

      Intent i = new Intent(getApplicationContext(), MyActivity.class);
      PendingIntent pi = PendingIntent.getActivity(getApplicationContext(),3333,i,
      PendingIntent.FLAG_CANCEL_CURRENT);
    

    向AlarmManager提供此暂挂内容:

      //getting current time and add 5 seconds in it
      Calendar cal = Calendar.getInstance();
      cal.add(Calendar.SECOND, 5);
      //registering our pending intent with alarmmanager
      AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
      am.set(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), pi);
    

    现在我的活动将是 在应用程序启动5秒后启动,无论您停止应用程序或设备处于休眠状态 (由于RTC U唤醒选项)。 您可以阅读完整的示例代码 Scheduling activities, services and broadcasts #Android

        4
  •  4
  •   kurt    9 年前

    我想发表评论,但代表50人,下面是。友好提示:如果您在5.1或更高版本上运行,并且使用的间隔小于一分钟,则会发生以下情况:

    Suspiciously short interval 5000 millis; expanding to 60 seconds
    

    here .

        5
  •  3
  •   sll    13 年前

    当您想从AlarmManager调用服务时,需要一些示例代码:

    PendingIntent pi;
    AlarmManager mgr;
    mgr = (AlarmManager)ctx.getSystemService(Context.ALARM_SERVICE);
    Intent i = new Intent(DataCollectionActivity.this, HUJIDataCollectionService.class);    
    pi = PendingIntent.getService(DataCollectionActivity.this, 0, i, 0);
    mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() , 1000, pi);
    

    您不必询问用户权限。