您的位置:首页 > 移动开发 > Android开发

长期后台运行 Service

2016-07-13 15:09 429 查看
* 从 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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  service android