定时器AlarmManager使用

系统定时器能否做到连续一个月甚至永远定时工作。公司代码中使用AlarmManager未验证。所以自己写一个demo记录下。在我们手机中如果app退出了。我们这个alarm肯定失效了。
MainActivity

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        AlarmSettings.getInstance(this).userAlarms("09:58#10:10");
    }

AlarmSettings

public class AlarmSettings {
    public final static String ACTION_DTGG_ALARM_WORKING = "com.eostek.dtgg.alarm.working";
    public final static String ACTION_DTGG_ALARM_REST = "com.eostek.dtgg.alarm.rest";
    private AlarmManager am = null;
    private Context mContext = null;
    private int[] working_time = null;
    private int[] rest_time = null;
    private final int REQUEST_CODE_WORKING = 1001;
    private final int REQUEST_CODE_REST = 2001;
    private int requestCode;
    private static AlarmSettings instance;

    public static AlarmSettings getInstance(Context context) {
        if (instance == null) {
            synchronized (AlarmSettings.class) {
                if (instance == null) {
                    instance = new AlarmSettings(context);
                }
            }
        }
        return instance;
    }

    public AlarmSettings(Context cxt) {
        mContext = cxt;
        am = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
    }

    public void userAlarms(String time) {
        Log.e("manley", "userAlarms time = " + time);
        cancelAlarm(false);
        initTime(time);
        startAlarm();
    }

    private void startAlarm() {
        setAlarm(ACTION_DTGG_ALARM_WORKING);
        setAlarm(ACTION_DTGG_ALARM_REST);
    }

    public void setAlarm(String action) {
        int[] times = null;
        if (action.equals(ACTION_DTGG_ALARM_WORKING)) {
            times = working_time;
            requestCode = REQUEST_CODE_WORKING;
        } else if (action.equals(ACTION_DTGG_ALARM_REST)) {
            times = rest_time;
            requestCode = REQUEST_CODE_REST;
        }

        Intent intent = new Intent(action);
        intent.setAction(action);
        PendingIntent pi = PendingIntent.getBroadcast(mContext, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        long systemTime = System.currentTimeMillis();

        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(systemTime);
        calendar.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
        if(times!=null){
            calendar.set(Calendar.HOUR_OF_DAY, times[0]);
            calendar.set(Calendar.MINUTE, times[1]);
        }else{
            calendar.set(Calendar.HOUR_OF_DAY, 0);
            calendar.set(Calendar.MINUTE, 0);
        }
        calendar.set(Calendar.SECOND, 0);//times[2]
        calendar.set(Calendar.MILLISECOND, 0);
        long selectTime = calendar.getTimeInMillis();

        Log.d("xiangy", "systemTime = " + systemTime);
        Log.d("xiangy", "selectTime = " + selectTime);

        if (systemTime > selectTime) {
            Log.e("AlarmSettings", "---------------------明天此时执行-------------------"+action);
            calendar.add(Calendar.DAY_OF_MONTH, 1);
            selectTime = calendar.getTimeInMillis();
        }

        am.setExact(AlarmManager.RTC_WAKEUP, selectTime, pi);
    }

    public void cancelAlarm(boolean noAlarms) {
        if (am != null) {
            Log.e("zzp", "取消定时闹钟");
            Intent intent_working = new Intent(ACTION_DTGG_ALARM_WORKING);
            am.cancel(PendingIntent.getBroadcast(mContext, REQUEST_CODE_WORKING, intent_working,
                    PendingIntent.FLAG_UPDATE_CURRENT));//
            Intent intent_rest = new Intent(ACTION_DTGG_ALARM_REST);
            am.cancel(PendingIntent.getBroadcast(mContext, REQUEST_CODE_REST, intent_rest,
                    PendingIntent.FLAG_UPDATE_CURRENT));//
        }
        if (noAlarms) {
            //这里发广播导致取消无效
            Log.e("zzp", "取消定时闹钟--------ALL_DAY");
        }
    }

    private void initTime(String time) {
        // "12:00:00#12:00:00"
        Log.e("manley", "------------initTime: "+time);
        String[] times = time.split("#");
        String work = times[0];
        String rest = times[1];
        Log.d("xiangy", "work = " + work);
        Log.d("xiangy", "rest = " + rest);
        this.working_time = splitTime1(work);
        this.rest_time = splitTime1(rest);
    }
    
    private static int[] splitTime1(String time) {
        int[] times = new int[2];
        String[] temp = time.split(":");
        String str = "";
        for (int i = 0; i < 2; i++) {
            times[i] = Integer.parseInt(temp[i]);
            str += times[i] + ((i == 1) ? "" : ":");
        }
        Log.d("xiangy", "str = " + str);
        return times;
    }
}

和投影仪不同是,手机上无法保持app一直运行。需要避免被系统回收才行。
写了三种保活方式,试验下哪个能支撑到24后的明天。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • // com.adobe.flash.listen settings.gradle 定义项目包含那些模块app.i...
    zeromemcpy阅读 1,817评论 0 1
  • 本文主要介绍App定时提醒的实现方式及原理。篇幅较长,先提供demo地址。 项目Demo地址 AlarmSampl...
    Typist夫少阅读 3,422评论 2 10
  • 1 概述 进程在内存中时活动主要有五种状态,即前台进程、可见进程、服务进程、后台进程、空进程,这几种状态的进程优先...
    Kevin_Junbaozi阅读 3,255评论 0 3
  • 1.我要新娘子 我儿子一岁半左右,有一次有人结婚,我抱着他去看热闹。"新娘子来了。"有人喊道。此时我们看到有十几辆...
    紫藤树下阅读 300评论 1 2
  • 日子 装在床头的玻璃杯 没我在 别忘记喝 长夜漫漫 就别再宿醉不归 一个人 就别再,为了谁 整夜不眠,算了 何必 ...
    小安冬阅读 233评论 17 22

友情链接更多精彩内容