Android 后台定时任务有几种实现方式

作者&投稿:羿物 (若有异议请与网页底部的电邮联系)
android 后台运行 并定时触发任务~

Android中的定时任务一般有两种实现方式,一种是使用Java
API里的Timer类,另一种是使用Android的Alarm机制。
这两种方式在多数情况下都能实现类似的效果,但Timer有一个明显的短板,它并不太适用与那些需要长期在后台运行的定时任务。As we
know,为了能让电池更加耐用,每种手机都会有自己的休眠策略:比如手机不用的时候智能的断开wifi连接,根据光线强弱自动调节屏幕亮度,根据手机长时间无操作时自动的让CPU进入到休眠状态等,当进入休眠状态时,这就有可能导致Timer中的定时任务无法正常运行。而Alarn机制则不存在这种情况,它具有唤醒CPU的功能,即可以保证每次需要执行定时任务的时候CPU都能正常工作。需要注意的是,这里的唤醒CPU和唤醒屏幕不是同一个概念,不能混淆。
这里我们只说Alarm机制的方式,代码如下:

public class AutoUpdateService extends Service {

@Override
public IBinder onBind(Intent intent) {

return null;
}

// 每次服务启动的时候调用
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable() {

@Override
public void run() {
doSomething();//这是定时所执行的任务
}
}).start();
AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
int anHour =8 * 60 * 60 * 1000;// 这是8小时的毫秒数 为了少消耗流量和电量,8小时自动更新一次
long triggerAtTime = SystemClock.elapsedRealtime() + anHour;
Intent intent2 = new Intent(this, AutoUpdateReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent2, 0);
manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);

return super.onStartCommand(intent, flags, startId);
}
注意这里的AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);此处实现了定时任务。

首先我们通过调用Context的getSystemService()方法来获取AlarmManager的实例,这里需要传入的参数是ALARM_SERVICE.

接下来调用AlarmManager的set()方法就可以设置一个定时任务了,比如设定一个任务在5秒钟后执行,就可以写成 long
triggerAtTime = SystemClock.elapsedRealtime() + 5*1000;

manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime,
pi);

其中第一个参数是一个整形参数,用于指定AlarmManager的工作类型,有四种值可以选,分别是
ELAPSED_REALTIME、ELAPSED_REALTIME_WAKEUP、RTC和RTC_WAKEUP。其中ELAPSED_REALTIME表示让定时任务的触发时间从系统开机开始算起,但不会唤醒CPU。ELAPSED_REALTIME_WAKEUP同样表示让定时任务的触发时间从系统开机开始算起,但会唤醒CPU。RTC表示让定时任务的触发时间从1970年1月1日0点开始算起,但不会唤醒CPU。RTC_WAKEUP同样表示让定时任务的触发时间从1970年1月1日0点开始算起,但会唤醒CPU。使用SystemClock.elapsedRealtime()方法可以获取到系统开机至今所经历时间的毫秒数,使用System.currentTimeMillis()方法可以获取到1970年1月1日0点至今所经历时间的毫秒数。
然后看一下第二个参数,这个参数就好理解多了,就是定时任务触发的时间,以毫秒为单位。如果第一个参数使用的是ELAPSED_REALTIME或ELAPSED_REALTIME_WAKEUP,则这里传入开机至今的时间再加上延迟执行的时间。如果第一个参数使用的是RTC或RTC_WAKEUP,则这里传入1970年1月1日0点至今的时间再加上延迟执行的时间。

第三个参数是一个PendingIntent,这里我们一般会调用getBroadcast()方法来获取一个能够执行广播的PendingIntent。这样当定时任务被触发的时候,广播接收器的onReceive()方法就可以得到执行。
当然设定一个任务在10秒钟后执行还可以写成:

longtriggerAtTime =
System.currentTimeMillis() + 10 * 1000;

manager.set(AlarmManager.RTC_WAKEUP,triggerAtTime,
pendingIntent);

然后创建PendingIntent指定处理定时任务的广播接收器AutoUpdateReceiver。

import service.AutoUpdateService;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class AutoUpdateReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent(context, AutoUpdateService.class);
context.startService(i);
}

}
当启动AutoUpdateService后,就会在onStartCommand()方法里设定一个定时任务,这样每8个小时AutoUpdateReceiver的onReceive()方法就会得到执行,这样就又会启动AutoUpdateService服务,形成了永久的循环,保证服务每隔一段时间就会启动一次,这样就完成了一个长期在后台运行的服务。


我们在哪里启动服务呢,这要看具体的情况了,一般的话,当我们打开程序的时候启动一次就好了

比如写在Activity的onCrete()方法里
Intent
intent =new Intent(this,AutoUpdateService.class);

startService(intent);

最后,既然我们用到了服务和广播接收器,那么就得在AndroidManifest.xml中注册才行。


<receiver android:name="receiver.AutoUpdateReceiver"
>




本文参考资料:《第一行代码》

自己百度搜一下,这种简单的功能,网上现成的代码一堆。

123456789ignore_user_abort();//关掉浏览器,PHP脚本也可以继续执行.<a href="/s?wd=set_time_limit&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1YLm1FbrAD1uW6dryRYrynz0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EnW0snHT3PjckrjRdrjb1nWfd" target="_blank" class="baidu-highlight">set_time_limit</a>(0);// 通过<a href="/s?wd=set_time_limit&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1YLm1FbrAD1uW6dryRYrynz0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EnW0snHT3PjckrjRdrjb1nWfd" target="_blank" class="baidu-highlight">set_time_limit</a>(0)可以让程序无限制的执行下去$interval=60*30;// 每隔半小时运行do{ //ToDo sleep($interval);// 等待5分钟}while(true); 简单直接不顾后果型


张家港市19718007108: android怎么设置一个定时的任务 -
徵索怡维: 我知道的有三种方法;方法一:可以通过android自带的Handler机制,里面有new Handler().postDelayed(new Runnable(){ @Override public void run() { //延迟的时间到了执行 } },延迟的时间); 方法二:可以通过java里面的线程来...

张家港市19718007108: android怎么实现定时的操作 -
徵索怡维: 有时候我们会遇到定时打开某些应用的这样一种需求.比如最近我在使用读者 Android版的应用的时候,每次打开应用,应用发送一定的联网请求之后就可以给我的账号增加一定的积分,连续登录的次数越多,积分奖励越多.而一旦有一天没...

张家港市19718007108: android用timer做定时任务,崩溃的原因? -
徵索怡维: 在做定时任务的时候,有的同学可能能会用到Timer这个定时任务的辅助类,但是使用它会有潜在的风险,风险如下,(1)时间计算不准确问题 因为Timer是以绝对时间计算定时任务的,会受到系统时间的影响,如果在任务执行期间,更改了系...

张家港市19718007108: android下如何实现Timer的定时循环 -
徵索怡维: 一个定时器 timer 一个定时事务timerTask 一个handler来接受消息处理 private final Timer timer=new Timer(); private TimerTask tast; private Handler handler;//每当定时器中的事务完成时 发出一个Message handler接收消息 处理 handler=new ...

张家港市19718007108: 如何让android的service一直在后台运行 -
徵索怡维: Android的service一直运行的方法:1、 Intent.ACTION_TIME_TICK的使用 我们知道广播的注册有静态注册和动态注册,但此系统广播只能通过动态注册的方式使用.即你不能通过在manifest.xml里注册的方式接收到这个广播,只能在代码里通过...

张家港市19718007108: android timer 是什么时间 -
徵索怡维: 在Android应用开发过程中,设置完Timer后,在Timer消息还没有到来之前,跳到设置里面把时间或者日期往前设置,会发现Timer永远来不了了.经过源码分析发现:Timer是以系统时间System.currentTimeMillis()(从January 1, 1970 00:00:...

张家港市19718007108: android 用timer定时去访问一个方法,怎么获得最新数据 -
徵索怡维: 这种我刚做过类似的,后台服务自动定时上传位置,锁屏状态连续工作10小时,每分钟上传一次.不用保持唤醒状态和点亮屏幕,非常省电. 主要思路就是用闹钟管理器来保持一个repeat的PendingIntent. 这种办法,不惧怕系统休眠,不需要保持唤醒. 据我所知,好像一个Timer一旦被cancel之后就废了,只有重新构造一个才行.

张家港市19718007108: android怎么实现闹钟 -
徵索怡维: android中有一个AlarmManager,顾名思义吧,基本上就是一些定时任务.工作原理就是向系统注册一个定时任务,当时间到的时候系统会自动帮你启动你要执行的任务,比如闹钟.基本上就是这样,详细的请百度一下,勤劳的双手会助你在学习的道路上越走越远.希望能够帮到你!

张家港市19718007108: 如何在android下实现定时任务
徵索怡维: long retryAt=...;Intent service = new Intent(“...”); PendingIntent operation = PendingIntent.getService( context, 0, service, PendingIntent.FLAG_ONE_SHOT); AlarmManager am = (AlarmManager) context.getSystemService( Context.ALARM_SERVICE); am.set(AlarmManager.RTC, retryAt, operation);

张家港市19718007108: Android中Service服务有哪些?
徵索怡维: 通过startService()启动的服务处于“启动的”状态,一旦启动,service就在后台运行,即使启动它的应用组件已经被销毁了.通常started状态的service执行单任务并且不返回任何结果给启动者.比如当下载或上传一个文件,当这项操作完成...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网