最近遇到一个棘手的问题,如下:public class TestService extends android.app.Service implements Runnable {
public TestService() {
} public void onStart(android.content.Intent intent, int startId) {
Thread t = new Thread(this);
t.start();
} public android.os.IBinder onBind(android.content.Intent intent) {
return null;
} public void run() {
long beg;
do {
beg = System.currentTimeMillis();
try {
Thread.sleep(3000L);
} catch (Exception e) {
}
System.out.println("#TestService: "+(System.currentTimeMillis()-beg));
} while (true);
}
}在程序的Activity里面调用以上的service:
startService(new Intent(this, TestService.class));但是得到的结果却很出乎我的预料:
07-22 17:32:11.496: INFO/System.out(11759): #TestService: 3001
07-22 17:32:14.496: INFO/System.out(11759): #TestService: 3001
07-22 17:32:17.509: INFO/System.out(11759): #TestService: 3002
关闭手机屏幕(并且USB线不能插在手机上)
07-22 17:32:35.266: INFO/System.out(11759): #TestService: 17760
开启手机屏幕或者USB线插在手机上
07-22 17:32:38.266: INFO/System.out(11759): #TestService: 3000
07-22 17:32:41.272: INFO/System.out(11759): #TestService: 3000
07-22 17:32:44.267: INFO/System.out(11759): #TestService: 3000
07-22 17:32:47.275: INFO/System.out(11759): #TestService: 3002
07-22 17:32:50.266: INFO/System.out(11759): #TestService: 3000
07-22 17:32:53.278: INFO/System.out(11759): #TestService: 3002
07-22 17:32:56.279: INFO/System.out(11759): #TestService: 3001
07-22 17:32:59.281: INFO/System.out(11759): #TestService: 3002
同样的情况,把Service换成Thread,也是一样的。还有更糟糕的,使用Object.wait(3000L)在这样的情况下也得到同样的结果。这个问题已经困扰我好几天了,没有任何进展。
不知哪位大侠能帮个忙,给小弟解开这个谜团,万分感谢!!!

解决方案 »

  1.   

    有啥的啊? 不是差不多的啊? 有个小误差很正常的啊,都在3000大一点啊关手机屏幕,可能会进suspend状态,应该也正常吧
      

  2.   

    首先这里面的“17760”只是我把手机屏幕关闭的时间,也就是说如果我关闭屏幕一个小时,那么本来sleep 3秒的程序,就要sleep一个小时,如果关闭10个小时就是sleep十个小时。
    这样的线程还有什么用处?
      

  3.   

    关屏后手机可能进入省电模式,一句系统不同,可能将CPU速度拉的很低,而一般线程的sleep是一句CPU的tick来算的而不是RTC之类的硬件timer中断,这样出现此问题也在情理之中了。
      

  4.   

    有些程序在屏幕系统进入sleep mode之后也会休眠,以达到省电的效果,但是也有很多服务是开启的,时刻在运行中。楼主可以创建这种不会响应屏幕变黑或者系统sleep的服务试试看。
      

  5.   

    那都是中断,当有事件到了把系统唤醒。
    你也可以启动硬件timer定时给中断啊
    手机不会确定的,一般每家片子公司的都不一样,虽然软件上层都是android,但是下面驱动、kernel的配置会不一样的。
    android提供的只是软件平台,硬件平台还要看芯片来定。支不支持睡眠,支持到什么程度,大家都不太一样
      

  6.   

    android的framework我也不是很清楚,上面说的也是猜测,也许根据android的policy,进入省电模式后,activity及一些service,thread/process根本就不让它进入run状态。
      

  7.   

    这个也许就是我现在遇到的情况。
    但是反过来想,系统内部的Google Talk等IM软件就可以在后台运行得很好,觉得很奇怪。
    下载了代码看后,又觉得没有什么特别的地方,苦恼中
      

  8.   

    如果这样的话,也许只能通过NDK的方式来解决了。但是这样又觉得失去了android的本意。
    希望能够获得高手的解答
      

  9.   

    楼主有android代码吗,搜索一下SCREEN_OFF,看看如果系统抛出SCREEN_OFF的信号之后,会有多少地方接收,并不再响应系统事件。