timer定时

后台执行的定时任务

2016-07-21  本文已影响2363人  TTTqiu

另可参考:Android 定时任务的多种实现方式

1. 创建 Alarm

主要就是借助了** AlarmManager 类来实现的。类似 NotificationManager,通过调用 Context 的 getSystemService() 方法来获取实例的,只是这里需要传入的参数是 Context.ALARM_SERVICE**。

AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

2. 设置定时任务

调用 AlarmManager 的 set()方法 就可以设置一个定时任务。
如想设定一个 10 秒的定时任务:

long triggerAtTime = SystemClock.elapsedRealtime() + 10 * 1000;
manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pendingIntent);

long triggerAtTime = System.currentTimeMillis() + 10 * 1000;
manager.set(AlarmManager.RTC_WAKEUP, triggerAtTime, pendingIntent);
set() 方法:
使用 System.currentTimeMillis() 方法可以获取到 1970 年 1 月 1 日 0 点至今所经历时间的毫秒数。

3. 示例

1. 创建一个可以长期在后台执行定时任务的服务。
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("LongRunningService", "executed at " + new Date().toString());
            }
        }).start();
        AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
        int anHour = 60 * 60 * 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);
    }
}
2. 再新建一个 AlarmReceiver 类:
public class AlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Intent i = new Intent(context, LongRunningService.class);
        context.startService(i);
    }
}

一旦启动 LongRunningService,就会在 onStartCommand() 方法里设定一个定时任务,这样一小时后 AlarmReceiver 的 onReceive() 方法就将得到执行,然后我们在这里再次启动 LongRunningService,这样就形成了一个永久的循环,保证 LongRunningService 可以每隔一小时就会启动一次。

3. 最后需要在打开程序的时候启动一次 LongRunningService,之后 LongRunningService 就可以一直运行了。
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Intent intent = new Intent(this, LongRunningService.class);
        startService(intent);
    }
}
上一篇 下一篇

猜你喜欢

热点阅读