1)保持CPU 運行,WakeLock
系統(tǒng)為了節(jié)省電量,CPU在沒有任務(wù)忙的時候就會自動進(jìn)入休眠。
這時候想執(zhí)行任務(wù)。就要給CPU加wake_lock鎖來喚醒CPU高效執(zhí)行。
注意:喚醒CPU(給CPU加Wake_lock)來工作。記得釋放wake_lock.
示例:
// 獲取電源管理者
pw = (PowerManager) getSystemService(POWER_SERVICE);
//獲取Wake_Lock
mWakeLock = pw.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"myWake_lock");
//喚醒CPU
mWakeLock.acquire();
//執(zhí)行任務(wù)
mWakelock.release();//記得釋放CPU鎖
要加上喚醒CPU權(quán)限
<uses-permission android:name="android.permission.WAKE_LOCK"/>
判斷網(wǎng)絡(luò)連接
//判斷是否有網(wǎng)絡(luò)
public boolean isConn() {
// 獲取網(wǎng)絡(luò)連接管理者
ConnectivityManager connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
// 獲取網(wǎng)絡(luò)信息
NetworkInfo activeNetworkInfo = connManager.getActiveNetworkInfo();
// 判斷是不是連接網(wǎng)絡(luò)
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
記得加上權(quán)限。網(wǎng)絡(luò)權(quán)限和獲取網(wǎng)絡(luò)狀態(tài)權(quán)限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
缺點:創(chuàng)建和持有喚醒鎖對電池的續(xù)航有較大的影響創(chuàng)建和持有喚醒鎖對電池的續(xù)航有較大的影響。
推薦使用方式:
使用WakefulBroadcastReceiver:使用廣播和Service(典型的IntentService)結(jié)合的方式可以讓你很好地管理后臺服務(wù)的生命周期使用WakefulBroadcastReceiver:使用廣播和Service(典型的IntentService)結(jié)合的方式可以讓你很好地管理后臺服務(wù)的生命周期
WakefulBroadcastReceiver和IntentService結(jié)合使用示例:
使用WakefulBroadcastReceiver第一步就是在Manifest中注冊:
<receiver android:name=".SimpleWakefulReceiver" />
在WakefulBroadcastReceiver的中用startWakefulService()啟動服務(wù),與startService()相比,在啟動服務(wù)的同時,并啟用了喚醒鎖。
package com.netraffic.wakefulreceiverdemo;
import android.content.Context;
import android.content.Intent;
import android.support.v4.content.WakefulBroadcastReceiver;
/**
* 創(chuàng)建者 朱勝軍
* 創(chuàng)建時間 2017/6/18 0:28
*/
public class SimpleWakefulReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//啟動服務(wù),在設(shè)備保持設(shè)備喚醒的同時啟動。 這是提供服務(wù)的意圖。
startWakefulService(context, new Intent(context, MyIntentService.class));
}
}
創(chuàng)建IntentService做耗時操作。昨晚耗時操作,調(diào)用WakefulBroadcastReceiver.completeWakefulIntent()來釋放喚醒鎖。來釋放喚醒鎖。
//在Manifest中注冊服務(wù)
package com.netraffic.wakefulreceiverdemo;
import android.app.IntentService;
import android.content.Intent;
import android.os.SystemClock;
import android.util.Log;
/**
* 創(chuàng)建者 朱勝軍
* 創(chuàng)建時間 2017/6/18 0:28
*/
public class MyIntentService extends IntentService {
public MyIntentService() {
super("MyIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
//執(zhí)行需要您的應(yīng)用程序來保持CPU運行的工作。
// ...
for (int i = 0; i < 50; i++) {
SystemClock.sleep(50);
Log.d("zsj", "zsj onHandleIntent = " + i);
}
//釋放WakefulBroadcastReceiver提供的喚醒鎖。
SimpleWakefulReceiver.completeWakefulIntent(intent);
}
}
觸發(fā)WakefulBroadcastReceiver
//發(fā)送廣播觸發(fā)WakefulBroadcastReceiver
sendBroadcast(new Intent(MainActivity.this, SimpleWakefulReceiver.class));
2)保持屏幕常亮
在Activity中使用FLAG_KEEP_SCREEN_ON 的Flag
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
取消屏幕常亮
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
3)采用定時重復(fù)的開啟Service
利用Android自帶的定時器AlarmManager實現(xiàn)
示例:
Intent intent = new Intent(MainActivity.this, SimpleWakefulReceiver.class);
PendingIntent sender = PendingIntent.getBroadcast(MainActivity.this, 0,
intent, 0);
// We want the alarm to go off 30 seconds from now.
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND, 30);
// Schedule the alarm!
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
// Tell the user about what we did.
if (mToast != null) {
mToast.cancel();
}
mToast = Toast.makeText(MainActivity.this, "安排完畢", Toast.LENGTH_LONG);
mToast.show();
總結(jié):
1.在關(guān)鍵邏輯的執(zhí)行過程中,就需要Wake Lock來保護(hù)。
2.休眠的情況下如何喚醒來執(zhí)行任務(wù)?用AlarmManager進(jìn)行定時喚醒。