android 之AlarmManager 系统闹钟 (1)

转载 2016年08月31日 16:08:45

文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处http://blog.csdn.net/flowingflying以及作者@恺风Wei


Android利用告警管理器可是实现时间触发,这些事件可以在一个特定的时间或者以一定的时间间隔发生。首先学习一个最为基础的告警处理。

小例子

小例子的UI如下。通过菜单,点击Alarm One,将在15秒后发送一个告警,在Activity的TextView和LogCat中都给出log说明。在15秒后,接收器接收到告警,在LogCat中显示log,并在界面上以Toast进行提示。通过这个简单的例子,我们见过学习如何设置告警,已经如何接受告警。基础小例子将只使用一次告警的菜单项。

时间处理

告警管理器可以在指定时间发送告警,使用Calendar作为时间对象,因此我们需要一些基本的Calendar处理。

public class Utils { 
    public static Calendar getTimeAfterInSecs(int secs){ 
        Calendar cal = Calendar.getInstance(); 
        cal.add(Calendar.SECOND,secs); 
        return cal; 
    } 
    
    public static Calendar getCurrentTime(){ 
        return Calendar.getInstance(); 
    } 
    
    /** 获得本日某个时间*/ 
    public static Calendar getTodayAt(int hours,int minute){ 
        Calendar today = Calendar.getInstance(); 
        
        Calendar cal = Calendar.getInstance(); 
        cal.clear(); 
        
        int year = today.get(Calendar.YEAR); 
        int month = today.get(Calendar.MONDAY); 
        int date = today.get(Calendar.DATE); 
        cal.set(year, month,date,hours,0,minute);        
        
        return cal; 
    } 
    
    public static String getDateTimeString(Calendar cal){ 
        SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss"); 
        df.setLenient(false); 
        return df.format(cal.getTime()); 
    }    
}

设置接收器

告警管理器将在指定的时间发送告警(intent),通过指定的接收器进行接受。相关的接收器代码如下:

public class TestReceiver extends BroadcastReceiver{ 
    private static String tag = "TestReceiver"; 
    @Override 
    public void onReceive(Context context, Intent intent) { 
        Log.d(tag,"intent = " + intent); 
        String message = intent.getStringExtra("message"); 
        Log.d(tag,message); 
        Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
 
    } 
}

接收器和我们之前的广播接收器并没有什么差异,在收到告警后,将触发onReceive()进行处理。接收器同样也需要在AndroidManifest.xml中进行声明,但和广播接收器不同,我们不需要说明接收那条广播信息,而是在告警管理器中指明告警接收器。AndroidManifest.xml的相关代码如下:

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

设置alarm

//BaseTester的具体代码见后面,这个类主要用来传递IReportBack(在Activity中具体实现,在Activity的TextView上显示相关的log信息已经写LogCat),只涉及Log信息的呈现,对于alarm的实现无关重要。
public class SendAlarmOnceTester extends BaseTester{ 
    private static String tag = "SendAlarmOnceTester";
    private static int REQUEST_CODE = 1000; 
    
    public SendAlarmOnceTester(Context context, IReportBack report){ 
        super(context,report); 
    } 
    
    public void sendAlarmOnce(){ 
        //【2】:设置告警时间,本例将在15秒后发生 
        Calendar cal = Utils.getTimeAfterInSecs(15); 
        mReport.reportBack(tag, "计划时间:" + Utils.getDateTimeString(cal) + "当前为" 
                + Utils.getDateTimeString(Utils.getCurrentTime())); 

        //【3】由于告警是在未来的某个时间发生,需要PendingIntent,在PendingIntent中会带有intent。我们可以理解这个Intent就是告警信息,就如果之前我们学的广播消息,都是以Intent的方式。
       //【3.1】设置告警信息intent,在指定的类中进行接收,我们同时测试携带Extra参数的情况。
        Intent intent = new Intent(mContext,TestReceiver.class); 
        intent.putExtra("message", tag + " : Single Shot Alarm"); 
       //【3.2】对于延期处理,需要PendingIntent。我们通过getBroadcast()来构建这个pendingIntent,这也对应到到通过接收器进行告警接收处理。此外还可以通过getActivity()(用于开启一个activity)和getService()(用于开启一个服务)来构建。
        PendingIntent pi = PendingIntent.getBroadcast
                mContext,                  //context,activity或者service
                REQUEST_CODE,        //request id,
                intent,                        //需要传递的intent 
                PendingIntent.FLAG_ONE_SHOT);  //flag,用于控制pengding intent的生命周期,然而,在告警中,有生命周期由告警管理器维护,此处可以填0,即no flags。 

        //【1】获取Alarm Manager 
        AlarmManager am = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE);

       //【4】通过set()来设置告警 
        am.set(AlarmManager.RTC_WAKEUP,   //RTC_WAKEUP:告警会唤醒设备;RTC:当设备唤醒时传递intent 
                cal.getTimeInMillis(), 
                pi);        
    } 


public class BaseTester { 
    protected IReportBack mReport; 
    protected Context mContext; 
    
    public BaseTester(Context context, IReportBack report){ 
        this.mContext = context; 
        this.mReport = report; 
    } 


public interface IReportBack { 
    public void reportBack(String tag, String info); 
}

Alarmmanager制作简单闹钟功能

代码: activity_main.xml
  • linhaiyun_ytdx
  • linhaiyun_ytdx
  • 2016年09月12日 12:25
  • 1015

Android,AlarmManager设置多个闹钟相关问题

Android利用AlarmManager来实现多个闹钟功能,其实很简单,网上有很多关于AlarmManager类的介绍,写的很详细,我这里不做过多描述了,下面来说下我工作中遇到的问题吧。 可能大家...
  • yangge00123
  • yangge00123
  • 2015年06月15日 22:47
  • 2111

Android AlarmManager加入与取消闹钟提醒, Notification不显示的问题

关于日程提醒,用Android系统的AlarmManager,将提醒时间加入系统闹钟并同广播关联,在闹钟到点提醒时,触发广播,然后弹出通知栏通知日程,以下为设置闹钟的代码 private void ...
  • androidforwell
  • androidforwell
  • 2016年12月16日 18:47
  • 4691

AlarmManager闹钟 延迟响应

项目做一个闹钟,需要闹钟可以在时间点准时响应。当闹钟设立数量较少的时候,还算比较可靠,基本都能准时响应。但如果app设立的闹钟的过多,就会有一些闹钟发生延时响应的bug,有时会晚几秒,有时会晚几分钟。...
  • pashanhuxp
  • pashanhuxp
  • 2015年07月30日 18:41
  • 2417

Android基础入门教程——10.5 AlarmManager(闹钟服务)

本节带来的Android中的AlarmManager(闹钟服务),听名字我们知道可以通过它开发手机闹钟类的APP, 而在文档中的解释是:在特定的时刻为我们广播一个指定的Intent,简单说就是我们自...
  • zpj779878443
  • zpj779878443
  • 2015年10月26日 14:22
  • 15164

关于AlarmManager设置重复闹钟延迟的问题

AlarmManager,闹钟
  • clzh2013
  • clzh2013
  • 2016年12月26日 09:55
  • 638

Android闹钟AlarmManager-通知NotificationManager-自定义通知栏

一:闹钟AlarmManager和通知NotificationManager
  • luz682328zul
  • luz682328zul
  • 2017年02月15日 20:47
  • 895

Android中AlarmManager详解以及利用PendingIntent设置闹钟

AlarmManager是提供一种访问系统闹钟服务的方式,允许你去设置在将来的某个时间点去执行你的应用程序。当你的闹钟响起(时间到)时,在它上面注册的一个意图(Intent)将会被系统以广播发出,然后...
  • qq_28330221
  • qq_28330221
  • 2017年03月12日 12:27
  • 3664

android AlarmManager详解,Alarm的设定和取消。

设定alarm的话,大概需要用到如下几步: 1.创建一个Intent 2.创建一个PendingIntent 3.得到ALARM_SERVICE的AlarmManager 4....
  • lisineng
  • lisineng
  • 2015年03月27日 10:43
  • 7453

Android提供的系统服务之--AlarmManager(闹钟服务)

本节引言: 本节主要介绍的是Android系统服务中的---AlarmManager(闹钟服务), 除了开发手机闹钟外,更多的时候是作为一个全局的定时器,通常与Service 结合,在特定时间启...
  • syf6568362
  • syf6568362
  • 2015年12月25日 09:41
  • 2724
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android 之AlarmManager 系统闹钟 (1)
举报原因:
原因补充:

(最多只允许输入30个字)