后臺服務(wù)保持設(shè)備喚醒狀態(tài)

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)行定時喚醒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容