Android实现定时任务的几种方式

一、AlarmManager

AlarmManager是系统开放的闹钟功能,使用方式和普通的manager没有区别。

AlarmManager am = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE);  
// Schedule the alarm!  
Intent intent = new Intent(XXXXX);
PendingIntent sender = PendingIntent.getBroadcast(mcontext,requestCode, intent, 0);  
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,  
                         firstTime, 30*1000, sender); 

上面就是定时器的基本用法,先获取manager,然后定义闹钟的flag,循环时间,到指定时间发出的pendingIntent。

一般都发出的pendingIntent都是广播,自定义一个广播接收器,就可以通过接收这个广播,来处理自己的功能逻辑了。

这里需要注意在独立进程中配置,这是android所定义的

<receiver android:name="com.xxxx.Receiver" android:process=":remote" />
优点总结

1,Alarm定时不需要程序自身去维护,而又系统来维护,使得程序更好避免了容易出错问题,更是占用系统资源,cpu占有率。

2,即使程序退出后,程序自身不会有任何烦恼的问题,系统到时间自动调用对应组件执行定义好的逻辑

3,定时的多样性,包括一次定时,循环定时(在xx年x月x日执行,周一至周五执行,每天几点几分执行。。。)

二、Handler

Handler可以帮助我们在子线程中操作UI线程,例如子线程解析数据,解析结束后通知UI刷新界面。他本身也可以实现定时器。

private Handler handler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            switch (msg.what) {
            case 0:
                // 移除所有的msg.what为0等消息,保证只有一个循环消息队列再跑
                handler.removeMessages(0);
                // app的功能逻辑处理
                ...
                // 再次发出msg,循环更新
                handler.sendEmptyMessageDelayed(0, 1000);
                break;

            case 1:
                // 直接移除,定时器停止
                handler.removeMessages(0);
                break;

            default:
                break;
            }
        };
    };
优点总结

每次循环都是在主线程中操作,避免了子线程和主线程之间的穿插交互。

三、Timer

Timer是Android直接启动定时器的类。

// 初始化定时器
Timer timer = new Timer();
timer.schedule(new TimerTask() {

    @Override
    public void run() {
        Log.e("lzp", "timer excute");
    }
}, delay, period);

// 停止定时器
private void stopTimer(){
    if(timer != null){
        timer.cancle();
        // 一定设置为null,否则定时器不会被回收
        timer = null;
    }
}

delay : 从定时器初始化成功 开始启动 的延迟时间。
period:定时器的间隔时间。

优点总结

Timer的使用很简单,TimerTask是一个子线程,方便处理一些比较复杂耗时的功能逻辑,经常与handler结合使用。

四、Thread

Thread实现定时器是创建一个子线程,在里面while循环,可以通过handler来更新UI。

private MyThread thread;

    private class MyThread extends Thread {

        public boolean stop;

        public void run() {
            while (!stop) {
                // 处理功能

                // 通过睡眠线程来设置定时时间
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        };
    };

    /**
     * 启动线程
     * */
    private void start() {
        if (thread == null) {
            thread = new MyThread();
            thread.start();
        }
    }

    /**
     * 停止线程
     * */
    private void stop() {
        if (thread != null) {
            thread.stop = true;
            thread = null;
        }
    }
五、ScheduledExecutorService实现定时任务

ScheduledExecutorService是从JDK1.5做为并发工具类被引进的,存在于java.util.concurrent,这是最理想的定时任务实现方式。
相比于上面两个方法,它有以下好处:
(1)、相比于Timer的单线程,它是通过线程池的方式来执行任务的,所以可以支持多个任务并发执行 ,而且弥补了上面所说的Timer的缺陷
(2)、可以很灵活的去设定第一次执行任务delay时间
(3)、提供了良好的约定,以便设定执行的时间间隔

public class ScheduledExecutorServiceTask 
{  
    public static void main(String[] args) 
    {  
        final TimerTask task = new TimerTask()  
        {  
            @Override  
            public void run()  
            {  
               //execute task  
            }  
        };   
        ScheduledExecutorService pool = Executors.newScheduledThreadPool(1);  
        pool.scheduleAtFixedRate(task, 0 , 1000, TimeUnit.MILLISECONDS);  

    }  
}
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android实现定时任务,可以使用以下几种方式: 1. 使用系统提供的 AlarmManager 类: AlarmManager 是 Android 系统提供的一个系统级别的闹钟服务,可以在指定的时间触发一个 Intent,从而实现定时任务的效果。 示例代码: ``` AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(this, AlarmReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); long triggerAtTime = System.currentTimeMillis() + 60 * 1000; // 1 分钟后触发 alarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerAtTime, pendingIntent); ``` 2. 使用 Handler 类: Handler 可以实现定时任务的效果,通过 postDelayed() 方法可以实现延迟一段时间后执行 Runnable 对象的功能。 示例代码: ``` private Handler mHandler = new Handler(); private Runnable mTask = new Runnable() { @Override public void run() { // 定时任务代码 mHandler.postDelayed(this, 60 * 1000); // 1 分钟后再次执行 } }; // 在 onCreate() 方法中调用 mHandler.postDelayed(mTask, 60 * 1000); // 1 分钟后执行 ``` 3. 使用 Timer 类: Timer 是 Java 中提供的一个定时器类,可以在指定时间间隔内重复执行指定任务。 示例代码: ``` Timer timer = new Timer(); TimerTask task = new TimerTask() { @Override public void run() { // 定时任务代码 } }; // 在 onCreate() 方法中调用 timer.schedule(task, 60 * 1000, 60 * 1000); // 1 分钟后执行,之后每隔 1 分钟再执行一次 ``` 以上是几种Android实现定时任务方式,开发者可以根据自己的需求选择合适的方式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

互联网小熊猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值