Android - 泵悼遥活(1)前臺服務(wù)保活

老婆保佑优俘,代碼無BUG

前言

項目中遇到一個需求京办,需要竟可能的上傳用戶的定位信息,引發(fā)了我對目前已知的狈溃活手段的探究惭婿,同時也遇到過客戶說,推送不能收到视搏,不能像微信那樣审孽,MMP的,不想理客戶

目錄

  • 一:如何創(chuàng)建前臺服務(wù)
    • 1.DeskService 前臺服務(wù)
    • 2.移除前臺Service通知欄標(biāo)志
    • 3.注冊服務(wù)
    • 4.啟動服務(wù)
  • 二:查看adj級別

一:如何創(chuàng)建前臺服務(wù)

1.DeskService 前臺服務(wù)

package com.cpsc.livedemo;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.Service;
import android.content.Intent;
import android.os.Build;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;

/**
 * 描述:
 * <p>
 * Created by allens on 2018/1/31.
 */

public class DeskService extends Service {

    private static final String TAG = "DaemonService";
    public static final int NOTICE_ID = 100;

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

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "DaemonService---->onCreate被調(diào)用浑娜,啟動前臺service");
        //如果API大于18佑力,需要彈出一個可見通知
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
            Notification.Builder builder = new Notification.Builder(this);
            builder.setSmallIcon(R.mipmap.ic_launcher);
            builder.setContentTitle("KeepAppAlive");
            builder.setContentText("DaemonService is runing...");
            startForeground(NOTICE_ID, builder.build());
            // 如果覺得常駐通知欄體驗不好
            // 可以通過啟動CancelNoticeService,將通知移除筋遭,oom_adj值不變
            Intent intent = new Intent(this, CancelNoticeService.class);
            startService(intent);
        } else {
            startForeground(NOTICE_ID, new Notification());
        }
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // 如果Service被終止
        // 當(dāng)資源允許情況下打颤,重啟service
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        // 如果Service被殺死暴拄,干掉通知
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
            NotificationManager mManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            mManager.cancel(NOTICE_ID);
        }
        Log.d(TAG, "DaemonService---->onDestroy,前臺service被殺死");
        // 重啟自己
        Intent intent = new Intent(getApplicationContext(), DeskService.class);
        startService(intent);
    }

}

2.移除前臺Service通知欄標(biāo)志

package com.cpsc.livedemo;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.Service;
import android.content.Intent;
import android.os.Build;
import android.os.IBinder;
import android.os.SystemClock;
import android.support.annotation.Nullable;

/**
 * 描述:
 * <p>
 * Created by allens on 2018/1/31.
 */

public class CancelNoticeService extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR2) {
            Notification.Builder builder = new Notification.Builder(this);
            builder.setSmallIcon(R.mipmap.ic_launcher);
            startForeground(DeskService.NOTICE_ID, builder.build());
            // 開啟一條線程编饺,去移除DaemonService彈出的通知
            new Thread(new Runnable() {
                @Override
                public void run() {
                    // 延遲1s
                    SystemClock.sleep(1000);
                    // 取消CancelNoticeService的前臺
                    stopForeground(true);
                    // 移除DaemonService彈出的通知
                    NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                    manager.cancel(DeskService.NOTICE_ID);
                    // 任務(wù)完成乖篷,終止自己
                    stopSelf();
                }
            }).start();
        }
        return super.onStartCommand(intent, flags, startId);
    }
}

3.注冊服務(wù)


        <service
            android:name=".DeskService"
            android:enabled="true"
            android:exported="true"
            android:process=":daemon_service" />


        <service
            android:name=".CancelNoticeService"
            android:enabled="true"
            android:exported="true"
            android:process=":service" />

4.啟動服務(wù)

 startService(new Intent(this, DeskService.class));

二:查看adj級別

adb shell

ps|grep <package_name> 查看基本信息

1|root@generic_x86:/ # ps|grep com.cpsc.livedemo                               
u0_a63    6834  1348  1285208 43884 SyS_epoll_ b73712b5 S com.cpsc.livedemo
u0_a63    6884  1348  1271160 28944 SyS_epoll_ b73712b5 S com.cpsc.livedemo:daemon_service
解釋
u0_a63 USER 進程當(dāng)前用戶
6834 進程ID
1348 進程的父進程ID
1285208 進程的虛擬內(nèi)存大小
43884 實際駐留”在內(nèi)存中”的內(nèi)存大小
com.cpsc.livedemo 進程名

cat /proc/<進程id>/oom_adj

root@generic_x86:/ # cat /proc/6884/oom_adj                                    
1
root@generic_x86:/ # cat /proc/6884/oom_adj                                    
1
root@generic_x86:/ # 

adj級別 說明
UNKNOWN_ADJ 16 預(yù)留的最低級別,一般對于緩存的進程才有可能設(shè)置成這個級別
CACHED_APP_MAX_ADJ 15 緩存進程透且,空進程撕蔼,在內(nèi)存不足的情況下就會優(yōu)先被kill
CACHED_APP_MIN_ADJ 9 緩存進程,也就是空進程
SERVICE_B_ADJ 8 不活躍的進程
PREVIOUS_APP_ADJ 7 切換進程
HOME_APP_ADJ 6 與Home交互的進程
SERVICE_ADJ 5 有Service的進程
HEAVY_WEIGHT_APP_ADJ 4 高權(quán)重進程
BACKUP_APP_ADJ 3 正在備份的進程
PERCEPTIBLE_APP_ADJ 2 可感知的進程秽誊,比如那種播放音樂
VISIBLE_APP_ADJ 1 可見進程
FOREGROUND_APP_ADJ 0 前臺進程
PERSISTENT_SERVICE_ADJ -11 重要進程
PERSISTENT_PROC_ADJ -12 核心進程
SYSTEM_ADJ -16 系統(tǒng)進程
NATIVE_ADJ -17 系統(tǒng)起的Native進程

參考作者鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鲸沮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子锅论,更是在濱河造成了極大的恐慌讼溺,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件最易,死亡現(xiàn)場離奇詭異怒坯,居然都是意外死亡,警方通過查閱死者的電腦和手機藻懒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門剔猿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人束析,你說我怎么就攤上這事艳馒≡餮牵” “怎么了员寇?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長第美。 經(jīng)常有香客問我蝶锋,道長,這世上最難降的妖魔是什么什往? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任扳缕,我火速辦了婚禮,結(jié)果婚禮上别威,老公的妹妹穿的比我還像新娘躯舔。我一直安慰自己,他們只是感情好省古,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布粥庄。 她就那樣靜靜地躺著,像睡著了一般豺妓。 火紅的嫁衣襯著肌膚如雪惜互。 梳的紋絲不亂的頭發(fā)上布讹,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機與錄音训堆,去河邊找鬼描验。 笑死,一個胖子當(dāng)著我的面吹牛坑鱼,可吹牛的內(nèi)容都是我干的膘流。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼鲁沥,長吁一口氣:“原來是場噩夢啊……” “哼睡扬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起黍析,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤卖怜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后阐枣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體马靠,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年蔼两,在試婚紗的時候發(fā)現(xiàn)自己被綠了甩鳄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡额划,死狀恐怖妙啃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情俊戳,我是刑警寧澤揖赴,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站抑胎,受9級特大地震影響燥滑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜阿逃,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一铭拧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恃锉,春花似錦搀菩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至炼团,卻和暖如春澎嚣,著一層夾襖步出監(jiān)牢的瞬間疏尿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工易桃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留褥琐,地道東北人。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓晤郑,卻偏偏與公主長得像敌呈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子造寝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359