长期后台运行 Service

* 从 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 {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, LongRunningService.class);
startService(intent);
}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值