Android保持设备为唤醒状态
2015-11-18 11:09
459 查看
当Android设备从运行状态转至空闲状态时,手机的屏幕将会慢慢变暗并关闭屏幕,最终cpu也将处于休息状态。这样的机制主要是为了缓解电池电量的流失。 但是对于有些情况,我们并不希望屏幕变暗,例如当我们在玩游戏或者说我们在看电影的时候,就需要屏幕能够保持常亮状态。
同样当在做一些比较重要的操作的时候,也希望cpu能够一直保持着运行状态,而不是休息状态,导致操作中止。
Android中提供了一些方法来实现这些需求。
当有需求需要屏幕常亮时(例如游戏或者电影),最好的方式是在Activity中使用
这种方式相对于
除此之外,还可以在xml布局中指定这个flag,具体方法是使用
在xml指定
而当不再需要保持屏幕常亮时,只要调用
在执行某些重要的操作时,确实需要在屏幕熄灭后,cpu依旧能保持运行状态来完成这些操作。
这时可能通过申请
申请wake lock,首先需要在manifest文件中添加申请权限:
然后在需要保持cpu运行状态操作的地方法,申请wakelock:
以上便能保证当手机屏幕熄灭后,cpu依旧能保持运行状态,来完成那个比较重要的操作。
需要注意的是,在完成这些操作之后,一定要记得释放掉wakeLock。长时间保持cpu运行状态将会使手机的电量快速的耗尽。到时,app将会出现在耗电量排行榜的首位。
如果需求hold住wakeLock的service是通过BroadcastReceiver来启动的,那么更加建议使用WakefulBroadcastReceiver,而不是直接调用
因为WakefulBroadcastReceiver能很好的帮我们管理hold住的wakeLock。
使用WakefulBroadcastReceiver与使用普通的BroadcastReceiver并没有多大的区别,不同的是在于启动service之后,需要调用
而当service中处理完任务之后,只需要调用
使用WakefulBroadcastReceiver是官方比较推荐的方式,原因从
同样当在做一些比较重要的操作的时候,也希望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是官方比较推荐的方式,原因从
startWakefulService和
completeWakefulIntent可以看出,不需要写多余的getSystemService等方法去进行wakeLock,WakefulBroadcastReceiver已经替我们封装好了。并且这两个方法中使用了synchronized关键字,是线程安全的。WakefulBroadcastReceiver还会负责管理这些申请过来的wakeLock。
相关文章推荐
- Android横竖屏切换小结
- Android抽象布局——include、merge 、ViewStub
- Android布局RelativeLayout(相对布局)笔记
- 汉字转换拼音(pinyin4j)
- Android开发-将Android studio的Gradle升级到最新版本
- Android调用手机中的应用市场,去评分的功能实现
- Android AsyncTask
- 享元模式
- android的onClick()和onTouch()方法详解
- zigbee网关 android客户端添加设置液晶显示功能
- android BroadcastReceiver详解2 无序广播和有序广播
- Android 操作系统获取Root权限 原理详细解析
- android service常驻内存的一点思考
- android View 总结
- Android Service 双进程常驻后台(2)
- android项目——透明圆角框的制作
- Android 4.4 以上分分钟实现状态栏伪沉浸(状态栏透明)
- Android 从底层实现让应用杀不死(1)
- Android系统获取手机型号和系统版本号,以及其他配置信息
- 利用 Gradle 编译 Android Sample