欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android闹钟的一些注意事项

程序员文章站 2022-07-03 08:28:52
Android闹钟的一些注意事项,关于Android系统的闹钟,接触过的各位肯定都是一把辛酸泪,这玩意坑的一逼,各种隐藏的问题,用起来需要格外注意。但是在一些业务中(比如后台定时心...

Android闹钟的一些注意事项,关于Android系统的闹钟,接触过的各位肯定都是一把辛酸泪,这玩意坑的一逼,各种隐藏的问题,用起来需要格外注意。但是在一些业务中(比如后台定时心跳等),闹钟往往又是最好的方案,因此不得不去搞清楚闹钟的一些注意事项。鉴于笔者被闹钟坑的不轻,特此作文以记之。
Android系统的闹钟服务AlarmManager有两种用法,第一种是每隔一段时间响应一次,第二种是在固定的时间响应。其实这两种方式本质都是一样的,因为你把第一种的间隔时间设置成24h的话,他就是第二种闹钟了。下面看代码:

//设置闹钟
    private void setAlarmEveryday(int hour, int minute, int second, int milliSecond, String action) {
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+08"));
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.HOUR_OF_DAY, hour);
        calendar.set(Calendar.MINUTE, minute);
        calendar.set(Calendar.SECOND, second);
        calendar.set(Calendar.MILLISECOND, milliSecond);

        Intent intent = new Intent();
        intent.setAction(action);
        //intent.putExtra("test_alarm", "test 20s");
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
    }

这个闹钟就是在每天指定的时间点去响应一次。这里对这个指定的时间有一个要注意的地方,即:如果闹钟设置的时间比设备当前时间晚,那么设备的闹钟是正常的,它会等到设置的时间再响应;如果设置的时间比当前时间早,那么他会在设置完成后立刻响应(我有句mmp!)。响应的代码如下:

package com.xxx.receiver;

import android.app.Application;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

/**
 *
 * Created by jxl on 2017/8/24.
 */

public class StepReceiver extends BroadcastReceiver {

    private static final String TAG = "Step_Receiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        Log.i(TAG, "action = " + action);
        //业务实现,注意此处的context生命周期很短
    }
}

注册一个广播接收器,针对上面设置的action进行监听。一旦闹钟响应,就会触发广播接收器,此时可以执行相关的操作。
为什么要设置action呢?其实是为了防止一个坑,就是如果前后两次设置相同时间的闹钟,后面一个会覆盖前一个闹钟,而这两个闹钟往往是实现不一样的功能。为了防止这种情况,我们需要保证两个闹钟的PendingIntent 值不相同。怎样保证不相同呢?网络上有很多种说法,在此不去赘述,只说一下,设置不同的action即可。
如果是需要某段时间之后响应,那更简单:

    Intent intent =new Intent(this, AlarmReceiver.class);  
    PendingIntent sender= PendingIntent.getBroadcast(this, 0, intent, 0);  
    long firstime = SystemClock.elapsedRealtime();  
    AlarmManager am=(AlarmManager)getSystemService(ALARM_SERVICE);  
    //5秒一个周期,不停的发送广播  
    am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstime, 5 * 1000, sender);  

    //这个是设置一次性的闹钟
    //am.set(AlarmManager.RTC_WAKEUP,c.getTimeInMillis(),pendingIntent);

好了,关于闹钟就是这些,希望对刚接触闹钟的你有所帮助。