一个空间两个网站对seo,腾讯云网站建设视频,wordpress 非插件分页,网站建设行业增长率这篇文章主要针对http://android.xsoftlab.net/training/scheduling/alarms.html#tradeoffs中的Scheduling Repeating Alarms一文进行大体翻译#xff1a;
Alarms(基于AlarmManager类)可以使你的应用在正常的生命周期之外执行基于时间的任务。举个例子#xff0c;你可以使用…这篇文章主要针对http://android.xsoftlab.net/training/scheduling/alarms.html#tradeoffs中的Scheduling Repeating Alarms一文进行大体翻译
Alarms(基于AlarmManager类)可以使你的应用在正常的生命周期之外执行基于时间的任务。举个例子你可以使用Alarm去创建一个长时间的任务比如说每天启动一个服务来下载天气预报。 Alarms拥有以下特征
它允许你设置一个Intent在固定的时间或者时间段执行。你可以用它们和广播进行结合来启动服务去执行其它操作。它们可以在你的应用程序之外进行操作任务所以你可以在你的应用没有启动的时候使用它们去触发任务或者执行任务甚至是设备在休眠状态时。它们可以帮助减小你应用资源的需求你可以在不依赖定时器的情况下安排任务或者连续运行后台任务。
懂得权衡
在相对有限的应用范围一个可以执行重复任务的闹钟可以相对简单的解释其原理它可能对你的应用来说不是一个好的选择特别是当你需要用它来去执行一个网络任务时。一个不好的设计会导致设备的电量快速消耗并导致服务器很频繁的处于负载状态。 一个常见的触发任务的场景便是在你应用的生命周期之外去与服务器进行数据同步这种情况下你可能想尝试用重复的时钟任务来完成但是如果你拥有自己的服务器你就可以通过GCM和Sync Adapter结合来完成这个任务它可能比AlarmManager效果更好。
权衡练习
每一种基于时钟的任务设计都可能会导致系统资源被滥用举个例子有一个非常受欢迎的有数据同步功能的App如果这个数据同步操作都在每天晚上11点钟进行那么去被连接的服务器可能会一直处于高负载状态甚至是服务器挂掉请在使用时钟功能时遵循以下原则
将时钟任务的触发时间使用随机条件上下浮动以下不要聚集在一个时间点。 1 . 当时钟任务触发时要先处理一下本地任务本地任务是指任何不与服务器产生交互的任务。2 . 在同一时间需要在一个相同时间间隔周期的基础之上执行基于时钟任务的网络请求。保证使时钟任务的频率降到最低最好一天一次。越低越好。不要在不必要的情况下唤醒设备。尽可能的避免使用你自己的时钟任务管理器。
设置一个时钟任务:
基于上面的描述时钟任务对有规律执行事件或者数据查询的事情来说是最好的选择时钟任务拥有以下特性
时钟类型具体请查看下文中的 关于时钟类型的选择。触发时间如果你设置了过去的时间那么闹钟任务就会立即执行。时钟间隔比如每一天每一个小时每5秒等等。一个Pending Intent它可以在时钟任务在触发时被调用如果你在几秒钟之内设置了相同的Pending Intent那么前一个会被后一个任务顶掉。
关于选择时钟类型
第一个需要考虑的就是时钟的触发类型了。 这里有两种方式供你选择一种是相对时间一种是真实的时间。相对时间就是基于系统启动的时间间隔真实的时间就是说每天的几点几点。这个的意思就是说相对时间适合用来做基于过去的时间任务(举个例子比如说每过30秒执行一次任务)它不受时区的影响。而真实时间它比较适合去执行基于真实世界时间的任务。 每一种选择都都唤醒的功能也就是说它可以在屏幕关闭的情况下唤醒CPU继续起来干活它确保了时钟任务可以在被设定的时间呗执行如果你的App对时间有依赖的情况下特别有用举个例子它可以有个小窗口可以使用户进行操作如果你不使用唤醒的功能那么所有的时钟任务将会在你的设备下次被打开的时候一起蹦出来。 如果你只是简单的需要每过一段时间就去执行一段时钟任务(比如每半个小时)那么相对时间就非常适合你。 如果你需要在每一天的固定时间执行一个时钟任务那么选择一种基于真实时间的闹钟类型注意无论如何这种途径会有一些小缺点比如APP可能会在不同的时区效果不同如果用户自己改变了设备的系统时间那么就可能使你的应用出现一些异常正如上面所讨论的使用真实时间可能伸缩性不强。我们还是推荐你尽可能的使用相对时间。
以下是类型种类
ELAPSED_REALTIME 设定一个基于时间量的Pending Intent这个时间量是从系统启动时开始计算的不过它不会唤醒设备相对时间还包括设备在睡眠状态下的时间。ELAPSED_REALTIME_WAKEUP 这个和上面基本相同都是基于开机时间的不过它会在时间到达时唤醒设备。RTC 这个是基于真实时间的不过它不会唤醒设备RTC_WAKEUP 这个也基于真实时间的不过它会在时钟任务被触发的时候唤醒设备。
接下来使用ELAPSED_REALTIME_WAKEUP类型举个例子 这个例子会在系统启动之后30分钟之后启动一个任务并且在随后的每30分钟之后都会再次启动。
// Hopefully your alarm will have a lower frequency than this!
alarmMgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,AlarmManager.INTERVAL_HALF_HOUR,AlarmManager.INTERVAL_HALF_HOUR, alarmIntent);
这个例子会在系统启动一分钟之后启动一个时钟任务并且会唤醒设备不过它只会执行一次。
private AlarmManager alarmMgr;
private PendingIntent alarmIntent;
...
alarmMgr (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent new Intent(context, AlarmReceiver.class);
alarmIntent PendingIntent.getBroadcast(context, 0, intent, 0);
alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,SystemClock.elapsedRealtime() 60 * 1000, alarmIntent);
接下来使用RTC_WAKEUP类型举个例子
在每天下午接近两点的时候去执行一个任务并唤醒设备它并且会在每天的这个时间重复执行。
// Set the alarm to start at approximately 2:00 p.m.
Calendar calendar Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 14);
// With setInexactRepeating(), you have to use one of the AlarmManager interval
// constants--in this case, AlarmManager.INTERVAL_DAY.
alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),AlarmManager.INTERVAL_DAY, alarmIntent);
这个例子是在每天8点半的时候执行一个任务并且唤醒设备接着它会在接下来的每20分钟后执行一次。
private AlarmManager alarmMgr;
private PendingIntent alarmIntent;
...
alarmMgr (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent new Intent(context, AlarmReceiver.class);
alarmIntent PendingIntent.getBroadcast(context, 0, intent, 0);
// Set the alarm to start at 8:30 a.m.
Calendar calendar Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 8);
calendar.set(Calendar.MINUTE, 30);
// setRepeating() lets you specify a precise custom interval--in this case,
// 20 minutes.
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),1000 * 60 * 20, alarmIntent); 下面是如何取消时钟任务的例子
// If the alarm has been set, cancel it.
if (alarmMgr! null) {alarmMgr.cancel(alarmIntent);
} 以下是当系统启动时如何启动一个时钟任务的方式(同时也可以作为开机启动任务的一种方法)
默认情况下在系统关机状态下时所有的时钟任务都被取消执行为了预防这种情况发生你可以选择在设备重启的时候自动的重新启动时钟任务这可以确保在用户不需要手动重启的闹钟任务的情况下通过AlarmManager继续执行任务。
以下是实现步骤
1.在你程序的Manifest文件中设置开机启动权限RECEIVE_BOOT_COMPLETED它可以使你在系统启动完成之后接受到一个 ACTION_BOOT_COMPLETED的广播不过这种情况仅限于用户已经启动过你的程序了。
uses-permission android:nameandroid.permission.RECEIVE_BOOT_COMPLETED/
2.实现一个广播接收器
public class SampleBootReceiver extends BroadcastReceiver {Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction().equals(android.intent.action.BOOT_COMPLETED)) {// Set the alarm here.}}
}
3.在你的广播接收器的中静态添加Intent过滤器
receiver android:name.SampleBootReceiverandroid:enabledfalseintent-filteraction android:nameandroid.intent.action.BOOT_COMPLETED/action/intent-filter
/receiver 这里需要注意的是这个广播接收器的android:enabledfalse属性为false它的意思是除非程序已经明确的可以使用了否则则不会调用它这样阻止了不必要的系统启动广播被调用你可以使用以下步骤启动广播接收器
ComponentName receiver new ComponentName(context, SampleBootReceiver.class);
PackageManager pm context.getPackageManager();
pm.setComponentEnabledSetting(receiver,PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP); 只要有一次通过这种方式启动了广播那么它会一直保持可用状态甚至是用户重启了设备换句话说除非你的程序自己关掉了它否则它会一直保持可用状态你可以通过以下方式来关掉它
ComponentName receiver new ComponentName(context, SampleBootReceiver.class);
PackageManager pm context.getPackageManager();
pm.setComponentEnabledSetting(receiver,PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP); 好了以上的文章就翻译完了从整体上来说老外写的文档可真是负责对于某些细节会强调好几遍大拇哥~