app程序进入后台或者手机屏幕关闭,确保开启的定时器任务(使用timers的计数任务)继续执行
来源:互联网 发布:手机淘宝店招280 50px 编辑:程序博客网 时间:2024/06/14 22:28
需求:app程序进入后台或者手机屏幕关闭,开启的定时器任务(使用timers的计数任务)继续执行
问题:调试手机usb连接电脑,程序进入后台或手机屏幕关闭,开启的定时器任务正常执行;但是,如果拔掉usb数据线,定时器任务被阻塞。无法达到正常计数的效果。
方案:新建TimersService,在Service中实现定期是任务
问题:此时只能解决程序进入后台情况
public class TimersService extends Service {
@Overridepublic IBinder onBind(Intent intent) { return null;}@Overridepublic void onCreate() { super.onCreate();}@Overridepublic int onStartCommand(Intent intent,int flags, int startId) { long currTime = intent.getLongExtra("currTime",System.currentTimeMillis()); Logger.i("DemoLog","currTime:"+currTime); LocalQRCodeUtil.getInstance().calculTime(currTime);//定时器任务开启 return START_STICKY;}@Overridepublic void onDestroy() { LocalQRCodeUtil.getInstance().stopTimer();//定时器任务关闭 super.onDestroy();}
}
问题:添加TimersService,关闭手机屏幕,定时器任务仍然被阻塞
方案:确保关闭屏幕,定时器任务正常执行,需要在TimersService添加PowerManager.WakeLock 在屏幕休眠后保持cpu唤醒状态以使得service继续运行。
参考:http://blog.csdn.net/sinat_33285127/article/details/76131349
public class TimersService extends Service {
*private PowerManager.WakeLock wakeLock = null;*@Overridepublic IBinder onBind(Intent intent) { return null;}@Overridepublic void onCreate() { //保持cpu唤醒状态以使得service继续运行。 *PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TimersService.class.getName()); wakeLock.acquire();* super.onCreate();}@Overridepublic int onStartCommand(Intent intent,int flags, int startId) { long currTime = intent.getLongExtra("currTime",System.currentTimeMillis()); Logger.i("DemoLog","currTime:"+currTime); LocalQRCodeUtil.getInstance().calculTime(currTime); return START_STICKY;}@Overridepublic void onDestroy() { //service关闭处理 *if (wakeLock != null) { wakeLock.release(); wakeLock = null; }* LocalQRCodeUtil.getInstance().stopTimer(); super.onDestroy();}
}
问题:在Aactvity启动Service,在Bactivity关闭启动的Service
使用Service的startService启动方式
启动service代码:
public void calculTime(Activity mActivity,long time){
Logger.e(“启动服务”);
stopService(mActivity);
currentTime = time;
Intent intent = new Intent(mActivity, TimersService.class);
intent.putExtra(“currTime”,currentTime);
mActivity.startService(intent);
}
关闭service代码:
public void stopService(Activity mActivity){
Logger.e(“关闭服务”);
Intent intent = new Intent(mActivity, TimersService.class);
mActivity.stopService(intent);
}
注:启动service的mActivity与关闭service的mActivity可以不是同一个activity类
service的两种启动模式
1 startService(全局模式)
区别于绑定模式,一处开启service,任一activity关闭service
2 bindService(绑定模式)
绑定在一个acitivty上,activty销毁service也跟随着销毁
具体service理解和使用
参考:http://blog.csdn.net/zjws23786/article/details/51800929
- app程序进入后台或者手机屏幕关闭,确保开启的定时器任务(使用timers的计数任务)继续执行
- APP进入后台,执行任务
- iPhone的后台执行任务
- 后台执行的定时任务
- 后台执行的定时任务
- 后台执行的定时任务
- 后台劳动者--后台执行的定时任务
- 在程序后台执行一个短时间的任务
- 在程序后台执行一个短时间的任务
- 项目转向后台继续执行任务
- Java 定时器的使用:每天定时执行任务
- Java 定时器的使用:每天定时执行任务
- Java 定时器的使用:每天定时执行任务
- Java 定时器的使用:每天定时执行任务
- Java 定时器的使用:每天定时执行任务
- springboot自带定时器实现定时任务的开启关闭以及动态修改定时规则
- service的简单使用--后台执行的定时任务
- php自动刷新与关闭页面后继续执行,定时任务的实现方式
- HNUSTOJ 部分源码
- 利用Random类来产生5个20~50之间的随机整数
- python中numpy与matlab的对应关系
- 面向对象与面向过程的一点思考
- git 常用命令介绍
- app程序进入后台或者手机屏幕关闭,确保开启的定时器任务(使用timers的计数任务)继续执行
- wifi下上传文件
- 【2】《程序是怎样跑起来的》
- Java Integer的缓存策略
- 计提与预提的区别?
- 日历备忘录
- [python]python a[::-1]
- mysql 连接错误
- Python-Day03-函数