Android闹钟的一些注意事项
程序员文章站
2022-04-22 10:46:41
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);
好了,关于闹钟就是这些,希望对刚接触闹钟的你有所帮助。