长期后台运行 Service

来源:互联网 发布:xp软件下载 编辑:程序博客网 时间:2024/04/28 05:45

* 从 Android 4.4 版本开始,Alarm 任务的触发时间将会变得不准确,有可能会延迟一段时间后任务才能得到执行这并不是个 bug,而是系统在耗电性方面进行的优化。 系统会自动检测目前有多少 Alarm 任务存在,然后将触发时间将近的几个任务放在一起执行, 这就可以大幅度地减少 CPU 被唤醒的次数,从而有效延长电池的使用时间。 如果你要求 Alarm 任务的执行时间必须准备无误,Android 仍然提供了解决方案。 使用 AlarmManager 的 setExact()方法来替代 set()方法,就可以保证任务准时执行了*

package com.gao.servicetest;import android.annotation.TargetApi;import android.app.AlarmManager;import android.app.PendingIntent;import android.app.Service;import android.content.Intent;import android.os.Build;import android.os.IBinder;import android.os.SystemClock;import android.util.Log;import java.util.Date;/** * 长期后台运行的 服务在 onStartCommand()方法里开启了一个子线程, 然后在子线程里就可以执行具体的逻辑操作了。这里简单起见,只是打印了一下当前的时间。创建线程之后的代码就是使用 Alarm了,先是获取到了AlarmManager 的实例,然后定义任务的触发时间为一小时后,再使用 PendingIntent 指定处理定时任务的广播接收器为 AlarmReceiver,最后调用 set()方法完成设定。 */public class LongRunningService extends Service {    public LongRunningService() {    }    @Override    public IBinder onBind(Intent intent) {        // TODO: Return the communication channel to the service.        throw new UnsupportedOperationException("Not yet implemented");    }    @TargetApi(Build.VERSION_CODES.KITKAT)    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        new Thread(){            @Override            public void run() {                super.run();                Log.d("LongRunningService", "打印时间: " + new Date().toString());            }        }.start();        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);        int time = 5*1000; //这是间隔时间的 毫秒值        long triggerAtTime = SystemClock.elapsedRealtime()+time;        Intent mIntent = new Intent(this,AlarmReceiver.class);        PendingIntent pendingIntent = PendingIntent.getBroadcast(this,0,mIntent,0);        alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP,triggerAtTime,pendingIntent);        return super.onStartCommand(intent, flags, startId);    }}

AlarmReceiver 类,并让它继承自 BroadcastReceiver


创建 Intent 对象,然后去启动LongRunningService 这个服务

package com.gao.servicetest;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;public class AlarmReceiver extends BroadcastReceiver {    public AlarmReceiver() {    }    @Override    public void onReceive(Context context, Intent intent) {        Intent intent1 = new Intent(context,LongRunningService.class);        context.startService(intent1);    }}

需要在打开程序的时候启动一次LongRunningService,之后 LongRunningService 就可以一直运行了

public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Intent intent = new Intent(this, LongRunningService.class);startService(intent);}}
0 0
原创粉丝点击