小弟刚接触Android,手里有个真机,发现Android和WM的一样由一个休眠的机制,在用户无操作的状态下会进入休眠状态,该状态下几乎所有的进程都被挂起,任何当前使用的程序都会失效,计入休眠状态。可能跟WM的还有点区别,至少我目前观察很类似。现在的问题是:
如果我开发一个需要长期在后台运行的程序,该如何解决休眠问题呢?
比如监测电量,或者收集GPs数据,这种需求在WM上有一个第三方开发的定时器可以解决,这个定时器会想系统发送硬件中断,从而达到唤醒系统的目的。
因此,我想请教一下各位,Android的上面如何用可用的Java API,用程序去定时唤醒系统呢?可行不可行呢?类似于WM的那样。
小弟新手,抛砖引玉,请各位,各抒己见,百家争鸣。

解决方案 »

  1.   

    一般的休眠会关电,包括CPU,所以不会有程序还可以允许了。不过,Android有关闭屏幕的那种省电模式。
      

  2.   

    楼上已经解释了问题的根结,参考一下ARM的电源管理模式吧。http://wenku.baidu.com/view/df0df25c3b3567ec102d8a42.html
      

  3.   

    谢谢楼上指点。
    但是我想知道如何从程序操控电源管理,或者发送中断信号激活系统
    硬件上是怎么一回事,目前没有太多时间去探究
    我只是想如何用代码实现程序长期后台运行,定期激活休眠的系统做某一件事,例如像服务器发送数据,收集GPS数据等等
    这样可以达到两个效果:1.程序可用,避开了系统休眠的问题,或者说解决了
                          2.总体省电,而不是一直让系统保持运行状态
      

  4.   

    不知道哪些wakelock的锁有没有用,是否可用来关闭屏幕而不休眠?
      

  5.   

    这一点wm 做的不大好。。手机的各个IO 设备需要单独的电源管理才正确
      

  6.   

    这个没有什么问题的吧,只要CPU支持alarm唤醒就可以了
    我们的设备就支持系统进休眠后5分钟自动唤醒做一些动作
      

  7.   

    用SERVICE就可以了,看看后台播音乐的例子吧
      

  8.   

    使用PowerManager 持有 PARTIAL_WAKE_LOCK 类型的锁,PARTIAL_WAKE_LOCK锁的解释如下:
    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.
      

  9.   

    参考这里,可能会实现你需要的,定时唤醒程序
    http://www.51mokao.com/Groups/ForumPost.aspx?id=34136
    如果你想长期在后台运行的话,最好用Service写,Service会一直在后台运行。
      

  10.   

    后台服务需要用Service来实现这是肯定的,Android手机在手机灭屏后是会在一定时间后进入关闭CPU的状态的。你需要一个WakeLock锁来让CPU保存在CPU运转状态。具体介绍你可以看下这篇文章:
    http://www.hzlitai.com.cn/article/ARM11/SYSTEM/1754.html
      

  11.   

    必须硬件上配合,硬件唤醒cpu,否则无解
      

  12.   

    楼主,通过添加权限的方式可以吗
    在Manifest.xml文件里面用user-permission声明android.permission.WAKE_LOCK
      

  13.   

    1.添加权限
    <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在锁屏时不被干掉。但是这样又有一个问题,就是耗电特别快,我想借问下高手有人知道要怎样解决耗电的问题吗?
      

  14.   

    如果长时间要运行,就不能wake_lock,这样会很快把设备电耗光的
    如果实在要周期性运行统计结果,那只能设置一个alarm,周期性唤醒
    做完事情后又让设备sleep,
    最好不要这样搞,这样的程序,大家都不喜欢,很耗电,我如果发现我手机
    上有类似的软件,马上会卸掉
      

  15.   

    你可以用中断或clock去做了,在申请中断时好像有个参数可以把它注册为可唤醒系统中断,闹钟也是可以唤醒系统的。
      

  16.   

    问题:service会不会在休眠状态下运行?
      

  17.   

    可以给个例子吗?我想知道怎样才可以做到你说的周期性唤醒,谢了,邮箱:[email protected]
      

  18.   

    我觉得用以下东西就可以:
    IntentService, AlarmManager, PendingIntent.加一个BroardcastRecieverIntentService会自己开一个线程,AlarmManager加PendingIntent可以实现没两小时发个广播,然后Reciever启动这个Service,Service干完活后stop掉。
      

  19.   

    后台运行用Service,唤醒系统看一下闹钟怎么做的就可以了。
    如果需要开机自动运行,就注册BOOT_COMPLETED服务。
      

  20.   

    靠谱放在服务中执行
    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);
      

  21.   

    反编译手机qq,微信,米聊,你会发现他们都是用的wake_lock,这表示什么,你懂得
      

  22.   


    请问楼上看QQ的源码,他是一直拿着wake_lock锁吗?还是周期性的?
      

  23.   

    timer会在系统进入休眠时变慢,之前做过一个应用,timer在休眠状态下1秒钟要延迟一分钟左右
      

  24.   

    广播,wake_lock等等等 都能解决让唤醒沉睡的cpu,某些机器可能出现唤醒延迟....但是对于某些android机器对唤醒gps来说这是无效的...
      

  25.   

    AlarmManager,定时唤醒啊,就是保证你的程序在休眠状态下,还能保持运行,比如,你30分钟收集一次gps数据,你就28分钟唤醒一次。
      

  26.   


    - # 表述失误,, gps不会受影响.....  如果是获得基站信息就会受影响...获得基站信息是与cpu休眠与唤醒关系不大,,, 但是机器黑屏 你后台拿到的基站信息 永远是开屏前那一刻的..
      

  27.   

    休眠有early suspend和suspend,early suspend是可以通过alarm来唤醒的,但是suspend没法通过alarm来唤醒,进入suspend之后系统自带的闹钟程序都不会起作用了,我刚发了帖子在寻求解决办法呢http://bbs.csdn.net/topics/390336575