您的位置:首页 > 移动开发 > Android开发

保持Android设备屏幕常亮和cpu活动状态

2016-06-14 12:13 459 查看
为了设备节约用电,设备闲置一会儿后就会关闭屏幕,cpu也会进入休眠状态不在运行。但有的应用需要我们保持设备屏幕常亮,并且cpu也一直运行。关键在于你的应用需求,是要保持屏幕常亮,还是cpu运行。我们自己应该明白这点,以免对系统资源造成浪费。

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回调 方法中去执行,执行完第一个再执行第二个,不会开启多个线程,也不用担心它会阻塞主线程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: