2013-10-25 8 views
0

我有关于Android system.I的功率管理有点误解知道,如果我保持激活锁定在我的应用程序,然后在我释放唤醒锁之前,移动设备不会睡眠。但是我有一个疑问,如果我从活动开始提供服务,那么我将启动后台线程服务。当按下电源键时,移动设备应该进入睡眠状态,为了省电,但是我发现线程仍然在后台运行,所以我有点误会,谁阻止了android系统的睡眠?当后台服务启动一个线程,该线程不能被系统停止,即使我按电源键

+0

换句话说,我真的想知道如何android系统或Linux系统控制移动或CPU进入节电模式或睡眠模式?这样我就可以建立一个socket长连接或后台线程,我送花儿给人认为当CPU或moible进入省电模式或睡眠模式,我的申请代码将不会被执行,直到它被唤醒。 – KrystalJake

回答

0

Android系统犯规转到睡眠,因为它需要处理大量的事情一样,短信,电话,地点,报警等事件,如晃动,手势不能gotto一个“睡眠”模式。

当你按下电源按钮,只是关闭屏幕和移动到节电模式。休息一切都是一样的。

您的线程将被只要进程正在运行或运行它已经完成了完成其任务。

+0

酷,我有点明白了,你可以给有关节电模式的一些细节?为什么android系统具有“唤醒概念”?难道CPU将处理线程运行,即使在移动进入省电模式?什么会醒来,如果从功率移动回储存模式?谢谢 – KrystalJake

+0

顺便说一句,当CPU进入睡眠模式?并将继续处理我的后台线程? – KrystalJake

0

您应该在您的活动的onPause()方法中停止服务,然后在onResume()中重新启动它,也许如果满足某些条件(可以设置控制变量,例如ind_start_service并使用 if,以决定是否要启动此服务):

boolean ind_start_service = false; 

@Override 
public void onCreate(){ 
    super.onCreate(); 

    button_mainmenu_compass.setOnClickListener(new OnClickListener(){ 
     @Override 
     public void onClick(View v) { 
      startService(new Intent(this, YourService.class)); 
      ind_start_service = true; 
     } 
    }); 
} 

@Override 
public void onResume(){ 
    super.onResume(); 

    if (ind_start_service){ 
     startService(new Intent(this, YourService.class)); //it doesn't matter whether it's already started; it won't be duplicated 
    } 

} 

@Override 
public void onPause(){ 
    super.onPause(); 

     stopService(new Intent(this, YourService.class)); 
} 



或者 - 一般多 - 停止执行迭代一个线程(我认为这就是你的情况发生),你可以设置一个控制变量,可以在每次迭代时停止线程:

  1. 创建一个布尔变量(例如:active_activity),这将是只要真为特定活动是例如可见:其设置为true在的onResume()方法,和为false的onPause():

    @Override 
    public void onResume(){ 
        super.onResume(); 
    
        active_activity = true; 
    } 
    
    @Override 
    public void onPause(){ 
        super.onPause(); 
    
        active_activity = false; 
    } 
    
  2. 在你的线程上,建立一个循环将在每次迭代检查变量的值执行指令前:

    new Thread(new Runnable() { 
        public void run() { 
    
         while (active_activity==true){      
          try { 
           Thread.sleep(1000); 
          } catch (InterruptedException e) { 
           e.printStackTrace(); 
          }  
          //... instructions    
         } 
    
        } 
    }).start(); 
    


我希望它的作品了你。

+0

这里的代码有问题吗? –

相关问题