Android保持设备为唤醒状态

转载 2015年11月18日 11:09:03

当Android设备从运行状态转至空闲状态时,手机的屏幕将会慢慢变暗并关闭屏幕,最终cpu也将处于休息状态。这样的机制主要是为了缓解电池电量的流失。 但是对于有些情况,我们并不希望屏幕变暗,例如当我们在玩游戏或者说我们在看电影的时候,就需要屏幕能够保持常亮状态。
同样当在做一些比较重要的操作的时候,也希望cpu能够一直保持着运行状态,而不是休息状态,导致操作中止。
Android中提供了一些方法来实现这些需求。

保持屏幕常亮

当有需求需要屏幕常亮时(例如游戏或者电影),最好的方式是在Activity中使用FLAG_KEEP_SCREEN_ON。但是这个标志不要在service或者其他组件中使用,仅能够在Activity中使用。

public class MainActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  }

这种方式相对于wake locks(后面会讲到)的优势在于,一是不需要申请权限即可使用;二是不需要考虑资源的释放,如wakeLock。

除此之外,还可以在xml布局中指定这个flag,具体方法是使用android:keepScreenOn属性。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:keepScreenOn="true">
    ...
</RelativeLayout>

在xml指定android:keepScreenOn属性与在Activity中addFlag效果是一样的,只是方式不同,可根据需要来进行选择。

而当不再需要保持屏幕常亮时,只要调用clearFlags()方法清除掉FLAG_KEEP_SCREEN_ON即可

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)

保持cpu运行状态

在执行某些重要的操作时,确实需要在屏幕熄灭后,cpu依旧能保持运行状态来完成这些操作。
这时可能通过申请WAKE_LOCK来保持cpu处于运行状态。但是记住不要长时间地hold住,在完成操作后一定要释放掉,否则耗电会非常严重。

申请wake lock,首先需要在manifest文件中添加申请权限:

<uses-permission android:name="android.permission.WAKE_LOCK" />

然后在需要保持cpu运行状态操作的地方法,申请wakelock:

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
Wakelock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
        "MyWakelockTag");
wakeLock.acquire();

以上便能保证当手机屏幕熄灭后,cpu依旧能保持运行状态,来完成那个比较重要的操作。
需要注意的是,在完成这些操作之后,一定要记得释放掉wakeLock。长时间保持cpu运行状态将会使手机的电量快速的耗尽。到时,app将会出现在耗电量排行榜的首位。

wakelock.release()

使用WakefulBroadcastReceiver

如果需求hold住wakeLock的service是通过BroadcastReceiver来启动的,那么更加建议使用WakefulBroadcastReceiver,而不是直接调用wakeLock.acquire()
因为WakefulBroadcastReceiver能很好的帮我们管理hold住的wakeLock。

使用WakefulBroadcastReceiver与使用普通的BroadcastReceiver并没有多大的区别,不同的是在于启动service之后,需要调用startWakefulService来保持cpu运行状态。

public class MyWakefulReceiver extends WakefulBroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // 启动service来完成一些重要的任务  
        Intent service = new Intent(context, MyIntentService.class);

        // 调用这个方法来保持cpu在屏幕熄灭的时候能够处于运行状态  
        startWakefulService(context, service);
    }
}

而当service中处理完任务之后,只需要调用completeWakefulIntent方法即可完成释放

public class MyIntentService extends IntentService {
    public MyIntentService() {
        super("MyIntentService");
    }
    @Override
    protected void onHandleIntent(Intent intent) {
        Bundle extras = intent.getExtras();

        // 开始处理一些任务。。。
        // ...
        // 完成处理任务  

        // 调用此方法来释放wakeLock
        MyWakefulReceiver.completeWakefulIntent(intent);
    }
}

使用WakefulBroadcastReceiver是官方比较推荐的方式,原因从startWakefulServicecompleteWakefulIntent可以看出,不需要写多余的getSystemService等方法去进行wakeLock,WakefulBroadcastReceiver已经替我们封装好了。并且这两个方法中使用了synchronized关键字,是线程安全的。WakefulBroadcastReceiver还会负责管理这些申请过来的wakeLock。

Android保持设备唤醒状态

为了避免电池的消耗,当Android设备出于闲置状态的时候,就会处于睡眠状态。但是有的时候应用需要唤醒屏幕或者CPU并且保持唤醒状态来完成一些工作。保持屏幕唤醒如果你的应用需要保持屏幕唤醒,例如游戏或...

Android应用程序 --- WakeLock 保持后台唤醒状态

一些手机app(如微信、QQ等)有新消息来到达,手机屏幕即使在锁屏状态下也会亮起,并提示用户有新消息。但是,一般情况下手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段时间后会使系统进入...

Android应用程序 --- WakeLock 保持后台唤醒状态

一些手机app(如微信、QQ等)有新消息来到达,手机屏幕即使在锁屏状态下也会亮起,并提示用户有新消息。但是,一般情况下手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段时间后会使系统进入...

Android应用程序通过WakeLock保持后台唤醒状态

一些手机app(如微信、QQ等)有新消息来到达,手机屏幕即使在锁屏状态下也会亮起,并提示用户有新消息。但是,一般情况下手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段时间后会使系统进入...

Android应用程序 --- WakeLock 保持后台唤醒状态

一些手机app(如微信、QQ等)有新消息来到达,手机屏幕即使在锁屏状态下也会亮起,并提示用户有新消息。但是,一般情况下手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段时间后会使系统进入...

Android保持屏幕常亮唤醒状态

第一步:  首先添加权限: [html] view plain copy print? uses-permission android:name="android.permission...

Android应用程序---WakeLock保持后台唤醒状态

一些手机app(如微信、QQ等)有新消息来到达,手机屏幕即使在锁屏状态下也会亮起,并提示用户有新消息。但是,一般情况下手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段时间后会使系统进入...
  • xdwyyan
  • xdwyyan
  • 2015年05月14日 14:57
  • 647

应用程序通过WakeLock保持后台唤醒状态

一些手机app(如微信、QQ等)有新消息来到达,手机屏幕即使在锁屏状态下也会亮起,并提示用户有新消息。但是,一般情况下手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段时间后会使系统进入...

获取Android设备电池电量状态

Android开发者可以利用BroadcastReceiver机制,获取电池电量变化的ACTION_BATTERY_CHANGED intent,进而获取当前android设备的电池状态。 具体操作...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android保持设备为唤醒状态
举报原因:
原因补充:

(最多只允许输入30个字)