Android例子—简单定时后台线程的实现

来源:互联网 发布:淘宝卖假货被公安抓了 编辑:程序博客网 时间:2024/05/22 02:08

前者不适合于需要长期在后台运行的定时任务,CPU一旦休眠,Timer中的定时任务 就无法运行;Alarm则不存在这种情况,他具有唤醒CPU的功能,另外,也要区分CPU 唤醒与屏幕唤醒!

使用流程:

  1. Step 1:获得Service: AlarmManager manager = (AlarmManager)
    getSystemService(ALARM_SERVICE);
  2. Step 2:通过set方法设置定时任务 int anHour = 2 * 1000; long triggerAtTime =
    SystemClock.elapsedRealtime() + anHour;
    manager.set(AlarmManager.RTC_WAKEUP,triggerAtTime,pendingIntent);
  3. Step 3:定义一个Service 在onStartCommand中开辟一条事务线程,用于处理一些定时逻辑
  4. Step 4:定义一个Broadcast(广播),用于启动Service,最后别忘了,在AndroidManifest.xml中对这Service与Boradcast进行注册!

参数详解: set(int type,long startTime,PendingIntent pi)

type: 有五个可选值:

AlarmManager.ELAPSED_REALTIME: 闹钟在手机睡眠状态下不可用,该状态下闹钟使用相对时间(相对于系统启动开始),状态值为3;

AlarmManager.ELAPSED_REALTIME_WAKEUP 闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟也使用相对时间,状态值为2;

AlarmManager.RTC 闹钟在睡眠状态下不可用,该状态下闹钟使用绝对时间,即当前系统时间,状态值为1;

AlarmManager.RTC_WAKEUP 表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟使用绝对时间,状态值为0;

PS:第一个参数决定第二个参数的类型,如果是REALTIME的话就用: SystemClock.elapsedRealtime( )方法可以获得系统开机到现在经历的毫秒数 如果是RTC的就用:System.currentTimeMillis()可获得从1970.1.1 0点到 现在做经历的毫秒数

startTime: 闹钟的第一次执行时间,以毫秒为单位,可以自定义时间,不过一般使用当前时间。 需要注意的是,本属性与第一个属性(type)密切相关,如果第一个参数对应的闹钟 使用的是相对时间(ELAPSED_REALTIMEELAPSED_REALTIME_WAKEUP),那么本属 性就得使用相对时间(相对于系统启动时间来说),比如当前时间就表示为: SystemClock.elapsedRealtime();如果第一个参数对应的闹钟使用的是绝对时间 (RTC、RTC_WAKEUP、POWER_OFF_WAKEUP),那么本属性就得使用绝对时间, 比如当前时间就表示为:System.currentTimeMillis()。

PendingIntent: 绑定了闹钟的执行动作,比如发送一个广播、给出提示等等。PendingIntent 是Intent的封装类。
需要注意的是:
如果是通过启动服务来实现闹钟提示的话, PendingIntent对象的获取就应该采用Pending.getService (Context c,int i,Intent intent,int j)方法;

如果是通过广播来实现闹钟提示的话, PendingIntent对象的获取就应该采用 PendingIntent.getBroadcast (Context c,int i,Intent intent,int j)方法;

如果这三种方法错用了的话,虽然不会报错,但是看不到闹钟提示效果。

另外:
从4.4版本后(API 19),Alarm任务的触发时间可能变得不准确,有可能会延时,是系统 对于耗电性的优化,如果需要准确无误可以调用setExtra()方法~

核心代码:

public class LongRunningService 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() {                Log.d("BackService", new Date().toString());            }        }).start();        AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);        //这里是定时的,这里设置的是每隔两秒打印一次时间=-=,自己改        int anHour = 2 * 1000;        long triggerAtTime = SystemClock.elapsedRealtime() + anHour;        Intent i = new Intent(this,AlarmReceiver.class);        PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);        manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);        return super.onStartCommand(intent, flags, startId);    }}

AlarmReceiver.java

public class AlarmReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        Intent i = new Intent(context,LongRunningService.class);        context.startService(i);    }}
0 1
原创粉丝点击