service钡挪活

service被斐郏活

在實(shí)際開(kāi)發(fā)中,我們會(huì)遇到一些要求后臺(tái)運(yùn)行的service凳厢,但是現(xiàn)在Android手機(jī)型號(hào)太多账胧,而且國(guó)內(nèi)的系統(tǒng)都是各大廠商定制過(guò)得,加入了自己的一些優(yōu)化設(shè)置(比如省電方面的)先紫。造成的的問(wèn)題是:當(dāng)service在后臺(tái)運(yùn)行一段時(shí)間后治泥,如果是比較耗電,會(huì)被系統(tǒng)kill遮精,service里的邏輯操作也就停止了居夹,對(duì)我們的業(yè)務(wù)造成困擾。那么該如何處理呢本冲?

主要有2種方法:手動(dòng)設(shè)置和代碼設(shè)置混合使用

手動(dòng)設(shè)置

在手機(jī)設(shè)置界面中准脂,有鎖屏保護(hù)和省電管理或者手機(jī)管家中的內(nèi)存優(yōu)化都要進(jìn)行處理。

鎖屏保護(hù)

在360F4手機(jī)中檬洞,在設(shè)置-->電池和省電-->鎖屏受保護(hù)應(yīng)用:選中我們自己的app狸膏,就想選中微信一樣,如果不選中微信的話添怔,鎖屏30分鐘后湾戳,微信也會(huì)被kill掉贤旷。不同的手機(jī)鎖屏后kill掉app的時(shí)間是不同的,有的沒(méi)有這一項(xiàng)設(shè)置砾脑,有的是幾分鐘幼驶,360F4手機(jī)是30分鐘。見(jiàn)下圖:


這里寫(xiě)圖片描述

省電管理

手機(jī)管家

這類(lèi)App一般都是系統(tǒng)自帶的韧衣,都是品牌商自己的軟件盅藻,為了時(shí)間省電優(yōu)化,通常都會(huì)把后臺(tái)運(yùn)行的app殺死畅铭,而且權(quán)限還挺高氏淑。不過(guò)也有用于自己安裝的,比如:360手機(jī)衛(wèi)士顶瞒、騰訊手機(jī)管家夸政、獵豹清理大師等,各種app的優(yōu)化設(shè)置不同榴徐,這里介紹幾個(gè)常見(jiàn)的

360手機(jī)衛(wèi)士

我-->設(shè)置-->清理加速-->內(nèi)存加速優(yōu)化名單-->把我們的app加入優(yōu)化忽略名單中


這里寫(xiě)圖片描述

OPPO手機(jī)管家

待定

代碼設(shè)置

這也有2種方法:

  1. 給serviceA在配置一個(gè)守護(hù)它的serviceB守问,當(dāng)我們的serviceA被殺死后,我們可以serviceB再重新開(kāi)啟A,
  2. 注冊(cè)BroadcastReceiver,鎖屏?xí)r獲取“電源鎖”坑资,屏幕解鎖是釋放“電源鎖”

增加一個(gè)守護(hù)的service

原理:在這個(gè)serviceB中開(kāi)啟一個(gè)Thread,每個(gè)1分鐘查找正在運(yùn)行的service耗帕,如果沒(méi)有serviceA,那么久開(kāi)啟serviceA袱贮;如果有serviceA仿便,那么就做處理。

public class MonitorService extends Service {

    protected static boolean isCheck = false;

    protected static boolean isRunning = false;

    private static final String SERVICE_NAME = "com.cqc.walelock01.WakeLockService";

    @Override
    public void onCreate() {
        Log.d("MonitorService2", "MonitorService onCreate");
        super.onCreate();

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("MonitorService2", "MonitorService onStartCommand");
        new Thread() {
            @Override
            public void run() {
                while (isCheck) {
                    try {
                        Thread.sleep(5 * 60 * 1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                        Log.d("MonitorService2", "thread sleep failed" );
                    }

                    if (!isServiceWork(getApplicationContext(), SERVICE_NAME)) {
                        Log.d("MonitorService2", "WakeLockService軌跡服務(wù)已停止攒巍,正在重啟軌跡服務(wù)");
                        startService(new Intent(MonitorService.this, WakeLockService.class));
                    } else {
                        Log.d("MonitorService2", "WakeLockService軌跡服務(wù)正在運(yùn)行");
                    }
                }
            }

        }.start();
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    /**
     * 判斷某個(gè)服務(wù)是否正在運(yùn)行的方法
     *
     * @param mContext
     * @param serviceName 是包名+服務(wù)的類(lèi)名(例如:com.baidu.trace.LBSTraceService)
     * @return true代表正在運(yùn)行嗽仪,false代表服務(wù)沒(méi)有正在運(yùn)行
     */
    public boolean isServiceWork(Context mContext, String serviceName) {
        boolean isWork = false;
        ActivityManager myAM = (ActivityManager) mContext
                .getSystemService(Context.ACTIVITY_SERVICE);
        List<RunningServiceInfo> myList = myAM.getRunningServices(80);
        if (myList.size() <= 0) {
            return false;
        }
        for (int i = 0; i < myList.size(); i++) {
            String mName = myList.get(i).service.getClassName().toString();
            if (mName.equals(serviceName)) {
                isWork = true;
                break;
            }
        }
        return isWork;
    }
}

WakeLock :電源鎖

注冊(cè)廣播,當(dāng)鎖屏?xí)r獲取電源鎖柒莉,當(dāng)屏幕解鎖時(shí)釋放電源鎖闻坚,

public class TrackReceiver extends BroadcastReceiver {

    private static final String TAG = "TrackReceiver";

    @SuppressLint("Wakelock")
    @Override
    public void onReceive(final Context context, final Intent intent) {
        final String action = intent.getAction();
        if (Intent.ACTION_SCREEN_OFF.equals(action)) {
            Log.d(TAG,"screen off,acquire wake lock!");
            if (null != WakeLockService.wakeLock && !(WakeLockService.wakeLock.isHeld())) {
                WakeLockService.wakeLock.acquire();
            }
        } else if (Intent.ACTION_SCREEN_ON.equals(action)) {
            Log.d(TAG,"screen on,release wake lock!");
            if (null != WakeLockService.wakeLock && WakeLockService.wakeLock.isHeld()) {
                WakeLockService.wakeLock.release();
            }
        }
    }
}

獲取電源鎖是需要權(quán)限的

<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.DEVICE_POWER"/>
第二個(gè)權(quán)限AS會(huì)紅色提示“這是系統(tǒng)app需要的權(quán)限”,這是提示不是報(bào)錯(cuò)兢孝,添加上就可以了
這里寫(xiě)圖片描述

BroadcastReceiver有2種注冊(cè)方法:靜態(tài)注冊(cè)和動(dòng)態(tài)注冊(cè)窿凤。
我么這里采用動(dòng)態(tài)注冊(cè)的方法,原因是:

receiver應(yīng)該跟隨serviceA的生命周期跨蟹,當(dāng)serviceA被銷(xiāo)毀后雳殊,將不再獲取電源鎖;service開(kāi)啟后窗轩,再根據(jù)屏幕的變化判斷是獲取還是釋放電源鎖

public class WakeLockService extends Service {
    //cpu焙煌海活
    private static boolean isRegister = false;
    protected static PowerManager pm = null;
    public static PowerManager.WakeLock wakeLock = null;
    public static TrackReceiver trackReceiver = new TrackReceiver();

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //動(dòng)態(tài)注冊(cè)
        if (!isRegister) {
            if (null == pm) {
                pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
            }
            if (null == wakeLock) {
                wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "track upload");
            }
            IntentFilter filter = new IntentFilter();
            filter.addAction(Intent.ACTION_SCREEN_OFF);
            filter.addAction(Intent.ACTION_SCREEN_ON);
            registerReceiver(trackReceiver, filter);
            isRegister = true;
        }
        return super.onStartCommand(intent, flags, startId);
    }


    @Override
    public void onDestroy() {
        super.onDestroy();
        if (isRegister) {
            try {//銷(xiāo)毀廣播
                unregisterReceiver(trackReceiver);
                isRegister = false;
            } catch (Exception e) {
            }
        }
    }
}

這個(gè)service保活是從百度鷹眼官方Demo中提取的。
網(wǎng)址:http://lbsyun.baidu.com/index.php?title=android-yingyan/guide/tracelive

這里寫(xiě)圖片描述

Demo: http://git.oschina.net/ServiceDemo/WakeLock01
其他相關(guān):
Android的PowerManager和PowerManager.WakeLock用法簡(jiǎn)析
使用WakeLock使Android應(yīng)用程序保持后臺(tái)喚醒

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末寝并,一起剝皮案震驚了整個(gè)濱河市箫措,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌衬潦,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件植酥,死亡現(xiàn)場(chǎng)離奇詭異镀岛,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)友驮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門(mén)漂羊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人卸留,你說(shuō)我怎么就攤上這事走越。” “怎么了耻瑟?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵旨指,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我喳整,道長(zhǎng)谆构,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任框都,我火速辦了婚禮搬素,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘魏保。我一直安慰自己熬尺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布谓罗。 她就那樣靜靜地躺著粱哼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪妥衣。 梳的紋絲不亂的頭發(fā)上皂吮,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音税手,去河邊找鬼蜂筹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛芦倒,可吹牛的內(nèi)容都是我干的艺挪。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼麻裳!你這毒婦竟也來(lái)了口蝠?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤津坑,失蹤者是張志新(化名)和其女友劉穎妙蔗,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體疆瑰,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡眉反,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了穆役。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寸五。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖耿币,靈堂內(nèi)的尸體忽然破棺而出梳杏,到底是詐尸還是另有隱情,我是刑警寧澤淹接,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布十性,位于F島的核電站,受9級(jí)特大地震影響蹈集,放射性物質(zhì)發(fā)生泄漏烁试。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一拢肆、第九天 我趴在偏房一處隱蔽的房頂上張望减响。 院中可真熱鬧,春花似錦郭怪、人聲如沸支示。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)颂鸿。三九已至,卻和暖如春攒庵,著一層夾襖步出監(jiān)牢的瞬間嘴纺,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工浓冒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留栽渴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓稳懒,卻偏偏與公主長(zhǎng)得像闲擦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 網(wǎng)上有很多介紹保活的文章寞忿,還有一些極客利用Native背刍#活service,確實(shí)很有想法~我這個(gè)方案不算新鮮罐脊,不過(guò)確...
    麥兜叮叮當(dāng)閱讀 2,898評(píng)論 0 4
  • 讓app 的service常駐其實(shí)是很流氓的做法定嗓,但是需求擺在那里。萍桌。。 但是要清除一點(diǎn):想百分百绷杓颍活servic...
    PengPengPro閱讀 16,156評(píng)論 10 65
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,727評(píng)論 25 707
  • 1.List<T>和List<?>的區(qū)別上炎? List<T>是泛型搅幅,List<?>是泛型類(lèi)型通配符扎谎,相當(dāng)于List<...
    小酷哥閱讀 897評(píng)論 0 2
  • 暗戀就是一種情緒 在內(nèi)心瘋狂地滋長(zhǎng) 種成根深的樹(shù) 思緒纏繞著 不能表達(dá)的枝蔓 心里一次次作繭 又一次次掙扎 讓情感...
    微雨憑欄閱讀 258評(píng)論 7 8