Android保持设备唤醒状态

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

保持屏幕唤醒

如果你的应用需要保持屏幕唤醒,例如游戏或者电影。最好的方法就是在你的Activity中使用FLAG_KEEP_SCREEN_ON,这个标签只能用在Activity,不能用在Service或者其他组件。

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);
  }

这个方法不需要特别的权限,并且平台可以正确的进行管理,不需要担心释放不需要的资源。

另一种方法就是可以在应用的布局文件中添加android:keepScreenOn=”true”.

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

上面的两种方法相同,你可以使用任意一个,在程序中添加这个标签的好处就是你可以在需要的地方清除这个标签。

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

事实上,你不需要清除FLAG_KEEP_SCREEN_ON标签,除非你不想屏幕保持唤醒。因为窗口管理者可以帮你正确的管理在后台和前台。

保持CPU唤醒

如果你需要CPU在进入睡眠状态之前保持运行状态,你可以使用PowerManager的服务特性你调用wake locks,wake locks允许你的应用去控制你的设备电池的状态。

但是我们需要注意的就是创建并且维持wake locks对设备电池寿命有影响,因此只有在确实需要的时候才去使用,并且在尽可能短的时间去维持它。像我们在Activity中就不需要使用这个,因为按照上面的直接使用上面的那个标签就行。

一种需要使用wake locks的情况就是当屏幕属于睡眠状态的时候,后台的服务需要获取一个wake lock去让CPU运行去做一些工作。

使用wake locks需要加入下面的这个WAKE_LOCK权限在应用的Manifest文件中。

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

另外,如果你的应用包含了一个广播接收者,在这个广播接收者中启动了一个服务去做一些工作,那么你可以管理wake lock通过一个WakefulBroadcastReceiver,但是如果你应用不使用这种方式,你可以按照下面这个直接来设置:

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

释放wake lock可以调用wakelock.release(),需要注意的是释放是必须的,不然电池会持续消耗。

使用WakefulBroadcastReceiver

使用广播接收者,然后结合一个服务就可以管理一个后台任务的生命周期。
WakefulBroadcastReceiver是一个特殊类型的广播接收者,它只关心为你的应用创建或者管理一个 PARTIAL_WAKE_LOCK。WakefulBroadcastReceiver可以传递工作给Service或者IntentService,另外当任务完成,就可以释放wake lock。

第一步,在manifest文件中声明一个receiver:

<receiver android:name=".MyWakefulReceiver"></receiver>

下面就是使用startWakefulService()启动MyIntentService:

public class MyWakefulReceiver extends WakefulBroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        // Start the service, keeping the device awake while the service is
        // launching. This is the Intent to deliver to the service.
        Intent service = new Intent(context, MyIntentService.class);
        startWakefulService(context, service);
    }
}

当认为完成,调用MyWakefulReceiver.completeWakefulIntent()释放wake lock。

public class MyIntentService extends IntentService {
    public static final int NOTIFICATION_ID = 1;
    private NotificationManager mNotificationManager;
    NotificationCompat.Builder builder;
    public MyIntentService() {
        super("MyIntentService");
    }
    @Override
    protected void onHandleIntent(Intent intent) {
        Bundle extras = intent.getExtras();
        // Do the work that requires your app to keep the CPU running.
        // ...
        // Release the wake lock provided by the WakefulBroadcastReceiver.
        MyWakefulReceiver.completeWakefulIntent(intent);
    }

WakeLock的使用:
1、获取WakeLock:
void acquire():获得WakeLock
void acquire(long timeOut):获得WakeLock timeOut时长,当超过timeOut之后系统自动释放WakeLock。
2、释放WakeLock:release()
3、判断是否已经获取WakeLock:boolean isHeld()
4、void setReferenceCounted(boolean value):是否使用引用计数。类似于垃圾回收策略,只是把垃圾回收改成了WakeLock回收。如果value是true的话将启用该特性,如果一个WakeLock acquire了多次也必须release多次才能释放掉。但是如果释放次数比acquire多则会抛出RuntimeException(“WakeLock under-locked ” + mTag)异常。默认是开启了引用计数的!

PowerManager的几个实用方法
1、boolean PowerManager::isScreenOn ()判断屏幕是否亮着(不管是暗的dimed还是正常亮度),在API20被弃用,推荐boolean PowerManager::isInteractive ()

2、void PowerManager::goToSleep(long time)time是时间戳,一般是System.currentTimeMillis()+timeDelay。强制系统立刻休眠,需要Manifest中添加权限”android.permission.DEVICE_POWER”。按下电源键锁屏时调用的就是这个方法。

3、void PowerManager::wakeUp(long time)与上面对应。参数含义,所需权限与上同。按下电源键解锁屏幕时调用的就是这个方法。

4、void PowerManager::reboot(String reason)重启手机,reason是要传给linux内核的参数,比如“recovery”重启进recovery模式,“fastboot”重启进fastboot模式。需要权限”android.permission.REBOOT”。

原文链接:
Keeping the Device Awake

参考文章:
Android中的WakeLock使用

可参考文章:
唤醒锁: 检测 Android* 应用中的 No-Sleep(无法进入睡眠)问题

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值