小弟刚接触Android,手里有个真机,发现Android和WM的一样由一个休眠的机制,在用户无操作的状态下会进入休眠状态,该状态下几乎所有的进程都被挂起,任何当前使用的程序都会失效,计入休眠状态。可能跟WM的还有点区别,至少我目前观察很类似。现在的问题是:
如果我开发一个需要长期在后台运行的程序,该如何解决休眠问题呢?
比如监测电量,或者收集GPs数据,这种需求在WM上有一个第三方开发的定时器可以解决,这个定时器会想系统发送硬件中断,从而达到唤醒系统的目的。
因此,我想请教一下各位,Android的上面如何用可用的Java API,用程序去定时唤醒系统呢?可行不可行呢?类似于WM的那样。
小弟新手,抛砖引玉,请各位,各抒己见,百家争鸣。
如果我开发一个需要长期在后台运行的程序,该如何解决休眠问题呢?
比如监测电量,或者收集GPs数据,这种需求在WM上有一个第三方开发的定时器可以解决,这个定时器会想系统发送硬件中断,从而达到唤醒系统的目的。
因此,我想请教一下各位,Android的上面如何用可用的Java API,用程序去定时唤醒系统呢?可行不可行呢?类似于WM的那样。
小弟新手,抛砖引玉,请各位,各抒己见,百家争鸣。
解决方案 »
- android的那个控件为什么叫spinner?
- 求android 常用类和其方法 汇总
- 求助高手!我的线程运行时间不同!
- base64生成的字符串有换行符“/n”,做文件名出错,何解?
- 请问android那些设置网络代理软件的原理是什么?
- 安卓获取当前日期
- eclipse无法建立AVD
- 停止正在运行的服务,求助!!
- android源码编译错误make ***/llvm-rs-cc_intermediates/llvm-rs-cc] Error 1
- Android ListView的问题。
- 直接用animation动画没有popupwindow加载的动画效果平滑
- update系统Calendar事件后,事件不显示了
但是我想知道如何从程序操控电源管理,或者发送中断信号激活系统
硬件上是怎么一回事,目前没有太多时间去探究
我只是想如何用代码实现程序长期后台运行,定期激活休眠的系统做某一件事,例如像服务器发送数据,收集GPS数据等等
这样可以达到两个效果:1.程序可用,避开了系统休眠的问题,或者说解决了
2.总体省电,而不是一直让系统保持运行状态
我们的设备就支持系统进休眠后5分钟自动唤醒做一些动作
If you hold a partial wakelock, the CPU will continue to run, irrespective of any timers and even after the user presses the power button. In all other wakelocks, the CPU will run, but the user can still put the device to sleep using the power button.
http://www.51mokao.com/Groups/ForumPost.aspx?id=34136
如果你想长期在后台运行的话,最好用Service写,Service会一直在后台运行。
http://www.hzlitai.com.cn/article/ARM11/SYSTEM/1754.html
在Manifest.xml文件里面用user-permission声明android.permission.WAKE_LOCK
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DEVICE_POWER" />
2.建一个Service,在里面写:
WakeLock mWakeLock;// 电源锁
/**
* onCreate时,申请设备电源锁
*/
private void acquireWakeLock() {
if (null == mWakeLock) {
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK
| PowerManager.ON_AFTER_RELEASE, "myService");
if (null != mWakeLock) {
mWakeLock.acquire();
}
}
} /**
* onDestroy时,释放设备电源锁
*/
private void releaseWakeLock() {
if (null != mWakeLock) {
mWakeLock.release();
mWakeLock = null;
}
}
这样就可以保证你的Service在锁屏时不被干掉。但是这样又有一个问题,就是耗电特别快,我想借问下高手有人知道要怎样解决耗电的问题吗?
如果实在要周期性运行统计结果,那只能设置一个alarm,周期性唤醒
做完事情后又让设备sleep,
最好不要这样搞,这样的程序,大家都不喜欢,很耗电,我如果发现我手机
上有类似的软件,马上会卸掉
IntentService, AlarmManager, PendingIntent.加一个BroardcastRecieverIntentService会自己开一个线程,AlarmManager加PendingIntent可以实现没两小时发个广播,然后Reciever启动这个Service,Service干完活后stop掉。
如果需要开机自动运行,就注册BOOT_COMPLETED服务。
AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
PendingIntent pi = createAlarmIntent();//启动自身服务的Intent
long nextTime = SystemClock.elapsedRealtime() + NEXT_DELAY;
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, nextTime, pi);
请问楼上看QQ的源码,他是一直拿着wake_lock锁吗?还是周期性的?
- # 表述失误,, gps不会受影响..... 如果是获得基站信息就会受影响...获得基站信息是与cpu休眠与唤醒关系不大,,, 但是机器黑屏 你后台拿到的基站信息 永远是开屏前那一刻的..