长期后台运行 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); } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析