保持Android设备屏幕常亮和cpu活动状态
2016-06-14 12:13
459 查看
为了设备节约用电,设备闲置一会儿后就会关闭屏幕,cpu也会进入休眠状态不在运行。但有的应用需要我们保持设备屏幕常亮,并且cpu也一直运行。关键在于你的应用需求,是要保持屏幕常亮,还是cpu运行。我们自己应该明白这点,以免对系统资源造成浪费。
它的优点是:不需要像Wake Lock(唤醒cpu的工具,下面将讲到)一样需要权限,也不需要担心如何去释放资源。
还有一种方式就是在你的xml文件中去配置:
使用唤醒锁的最好地方就是你创建了一个后台服务,而这个后台服务又需要cpu保持运行。在此提醒,尽量少用,会对电池寿命有极大影响的!
a.使用唤醒锁(wake lock),第一步首先要加入用户使用权限在AnroidManifest.xml中:
如果你的应用包含了一个广播接收器,并使用服务来做一些事情。那么你可以使用WakefulBroadcastReceiver来管理唤醒锁,如果你的应用不是此种情况,可以使用下面的方式来使用唤醒锁:
b.还有一种方式,就是上面我们说到的使用WakefulBroadcastReceiver来管理唤醒锁:
使用广播来管理一个服务,可以让你更好的管理后台任务的生命周期。WakefulBroadcastReceiver是一种特殊的广播接收器,它负责创建和管理你应用程序的PARTIAL_WAKE_LOCK(唤醒锁)。一个WakefulBroadcastReceiver仿照了一个工作服务(其实是IntentService),它确保设置不会再使用中进入休眠状态。如果你没有为一个正在工作的服务得到唤醒锁,那么你无法确保在设备进入休眠之前你的任务已经完成了。
使用WakefulBroadcastReceiver第一步当然是像其他广播一样,需要注册
然后我们继承这个WakefulBroadcastReceiver,然后我们在onReceive里面来启动一个MyIntentService服务(它继承自IntentService),相对于普通的startService()这里方法我们使用startWakefulService()来启动服务,我们不仅让WakefulBroadcastReceiver拿到了锁,Intent还获得了一个额外的标识锁。
当服务完成工作后,我们通过MyWakefulReceiver.completeWakefulIntent()来释放唤醒锁,这里的completeWakefulIntent()方法里面的参数就是前面从MyWakefulReceiver传递过来的intent。
●其中说到了PwoerManager的常量状态PARTIAL_WAKE_LOCK,它们各种状态锁的类型对CPU
、屏幕、键盘的影响不同:
PARTIAL_WAKE_LOCK:保持CPU 运转,屏幕和键盘灯有可能是关闭的。
SCREEN_DIM_WAKE_LOCK:保持CPU 运转,允许保持屏幕显示但有可能是灰的,允许关闭键盘灯
SCREEN_BRIGHT_WAKE_LOCK:保持CPU 运转,允许保持屏幕高亮显示,允许关闭键盘灯
FULL_WAKE_LOCK:保持CPU 运转,保持屏幕高亮显示,键盘灯也保持亮度
●还有一个概念就是IntentService,其实它和Service的主要区别就是运行中开启了子线程,完成任务后自己销毁,省去我们的许多操作。
它是继承于Service并在子线程中处理任务的一个类,它会开启一个子线程来处理耗时操作,当操作完成后,它会自动停止,而不需要我们手
动处 理。还有一个特点就是我们多次启动IntentService处理多个耗时操作,每个耗时操作都会以队列的方式在IntentService的
onHnandleIntent回调 方法中去执行,执行完第一个再执行第二个,不会开启多个线程,也不用担心它会阻塞主线程。
1.保持屏幕常亮,也就是Screen On
如果你的应用是游戏或视频类应用,最好保持设备屏幕常亮的方法就是使用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); }
它的优点是:不需要像Wake Lock(唤醒cpu的工具,下面将讲到)一样需要权限,也不需要担心如何去释放资源。
还有一种方式就是在你的xml文件中去配置:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:keepScreenOn="true"> ... </RelativeLayout>当然如果你的应用进入了后台,你不想再让屏幕常亮,可以使用clearFlags()方法来使屏幕可以变暗:getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)。
2.保持cpu持续活动,CPU On
如果系统进入休眠状态后,cpu也会停止工作。而你的应用任然需要用到cpu,那么你可以使用PowerManager系统服务类来得到唤醒锁,从而控制设备的电源状态。唤醒锁的使用会极大的影响待机时间,所以除非必要,尽量少用。例如:没必要在Activity中使用唤醒锁,用FLAG_KEEP_SCREEN_ON即可。使用唤醒锁的最好地方就是你创建了一个后台服务,而这个后台服务又需要cpu保持运行。在此提醒,尽量少用,会对电池寿命有极大影响的!
a.使用唤醒锁(wake lock),第一步首先要加入用户使用权限在AnroidManifest.xml中:
如果你的应用包含了一个广播接收器,并使用服务来做一些事情。那么你可以使用WakefulBroadcastReceiver来管理唤醒锁,如果你的应用不是此种情况,可以使用下面的方式来使用唤醒锁:
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag"); wakeLock.acquire();当不再使用时,还要记得使用wakeLock.release()方法来释放锁,不然会浪费你的电量。
b.还有一种方式,就是上面我们说到的使用WakefulBroadcastReceiver来管理唤醒锁:
使用广播来管理一个服务,可以让你更好的管理后台任务的生命周期。WakefulBroadcastReceiver是一种特殊的广播接收器,它负责创建和管理你应用程序的PARTIAL_WAKE_LOCK(唤醒锁)。一个WakefulBroadcastReceiver仿照了一个工作服务(其实是IntentService),它确保设置不会再使用中进入休眠状态。如果你没有为一个正在工作的服务得到唤醒锁,那么你无法确保在设备进入休眠之前你的任务已经完成了。
使用WakefulBroadcastReceiver第一步当然是像其他广播一样,需要注册
然后我们继承这个WakefulBroadcastReceiver,然后我们在onReceive里面来启动一个MyIntentService服务(它继承自IntentService),相对于普通的startService()这里方法我们使用startWakefulService()来启动服务,我们不仅让WakefulBroadcastReceiver拿到了锁,Intent还获得了一个额外的标识锁。
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()来释放唤醒锁,这里的completeWakefulIntent()方法里面的参数就是前面从MyWakefulReceiver传递过来的intent。
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); } }到此,两种方式就介绍完了。
●其中说到了PwoerManager的常量状态PARTIAL_WAKE_LOCK,它们各种状态锁的类型对CPU
、屏幕、键盘的影响不同:
PARTIAL_WAKE_LOCK:保持CPU 运转,屏幕和键盘灯有可能是关闭的。
SCREEN_DIM_WAKE_LOCK:保持CPU 运转,允许保持屏幕显示但有可能是灰的,允许关闭键盘灯
SCREEN_BRIGHT_WAKE_LOCK:保持CPU 运转,允许保持屏幕高亮显示,允许关闭键盘灯
FULL_WAKE_LOCK:保持CPU 运转,保持屏幕高亮显示,键盘灯也保持亮度
●还有一个概念就是IntentService,其实它和Service的主要区别就是运行中开启了子线程,完成任务后自己销毁,省去我们的许多操作。
它是继承于Service并在子线程中处理任务的一个类,它会开启一个子线程来处理耗时操作,当操作完成后,它会自动停止,而不需要我们手
动处 理。还有一个特点就是我们多次启动IntentService处理多个耗时操作,每个耗时操作都会以队列的方式在IntentService的
onHnandleIntent回调 方法中去执行,执行完第一个再执行第二个,不会开启多个线程,也不用担心它会阻塞主线程。
相关文章推荐
- Android中的Drawable资源—— LayerDrawable
- 推荐一个Android开发,懒人框架ButterKnife。
- Android获取应用cpu使用率
- Android自定义可动画展开收缩View的实现
- Android 使用 YouWave 模拟器 进行程序调试
- android命令查看cpu与内存使用率
- 使用Espresso Test Recorder编写Android测试
- Android中Context详解 ---- 你所不知道的Context
- Android之Notification的多种用法
- Android学习之RecyclerView(三)-ItemDecoration(二)之瀑布流
- 关于降低android手机摄像头预览分辨率
- Android ViewPager 下 ListView 不显示的问题
- android里camera支持的预览尺寸的获取
- Android得到视频缩略图
- 美团Android自动化之旅—生成渠道包之打包工具
- android 获取视频,图片缩略图的具体实现
- Android--从零单排系列(5)--常用传感器的使用
- Android Studio 使用随笔 - (一)
- Android ListView添加footerView时footerView.setVisibility(View.GONE)有空白区域
- android 图片轮播com.daimajia.slider.library.SliderLayout注意事项