進(jìn)程迸樽螅活之雙進(jìn)程守護(hù)

上一篇文章講到一個(gè)像素保活線程睡榆。沒有看的小伙伴可以去看看萍肆。地址:http://www.reibang.com/p/a61ecc016aa5

原理:

殺進(jìn)程是一個(gè)一個(gè)殺的。我們可以定義兩個(gè)進(jìn)程胀屿,兩個(gè)進(jìn)程相互監(jiān)聽塘揣。A進(jìn)程被殺死,B進(jìn)程監(jiān)聽到就啟動(dòng)A進(jìn)程宿崭。否則相反亲铡。

實(shí)現(xiàn):

1,創(chuàng)建MainActivity。一上來就啟動(dòng)兩個(gè)服務(wù)奖蔓。

package com.zsj.doubleprocess;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 一上來就啟動(dòng)兩個(gè)服務(wù)琅摩。
        startService(new Intent(this, LocalService.class));
        startService(new Intent(this, RemoteService.class));
    }
}

2,創(chuàng)建兩個(gè)進(jìn)程的服務(wù)LocalService和RemoteService锭硼,并相互綁定。在連接斷開的啟動(dòng)對(duì)方的進(jìn)程的服務(wù)蜕劝。

LocalService.java

package com.zsj.doubleprocess;

import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;

/**
 * 第一個(gè)服務(wù)檀头。本地服務(wù)
 * 
 * @author zsj
 *
 */
public class LocalService extends Service {

    private MyBind bind;
    private MyServiceConnection conn;

    @Override
    public void onCreate() {
        super.onCreate();
        if (bind == null) {
            bind = new MyBind();
        }
        if (conn == null) {
            conn = new MyServiceConnection();
        }
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // 綁定另外進(jìn)程的服務(wù)RemoteService,并設(shè)置BIND_IMPORTANT為重要綁定
        bindService(new Intent(LocalService.this, RemoteService.class), conn,
                Context.BIND_IMPORTANT);

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

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

    public class MyBind extends RemoteConn.Stub {
        @Override
        public String getProcessName() throws RemoteException {
            return "LocalService";
        }
    }

    public class MyServiceConnection implements ServiceConnection {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // 遠(yuǎn)程服務(wù)連接成功回調(diào)
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            // 被綁定的服務(wù)斷開連接的時(shí)候回調(diào)
            // 啟動(dòng)被綁定的服務(wù)。
            startService(new Intent(LocalService.this, RemoteService.class));
            bindService(new Intent(LocalService.this, RemoteService.class),
                    conn, Context.BIND_IMPORTANT);
        }
    }

}

RemoteService.java

package com.zsj.doubleprocess;

import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;

public class RemoteService extends Service {

    private MyBind bind;
    private MyServiceConnection conn;

    @Override
    public void onCreate() {
        super.onCreate();
        if (bind == null) {
            bind = new MyBind();
        }
        if (conn == null) {
            conn = new MyServiceConnection();
        }
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // 綁定另外進(jìn)程的服務(wù)LocalService,并設(shè)置BIND_IMPORTANT為重要綁定
        bindService(new Intent(RemoteService.this, LocalService.class), conn,
                Context.BIND_IMPORTANT);

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

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

    public class MyBind extends RemoteConn.Stub {
        @Override
        public String getProcessName() throws RemoteException {
            return "RemoteService";
        }
    }

    public class MyServiceConnection implements ServiceConnection {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // 遠(yuǎn)程服務(wù)連接成功回調(diào)

        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            // 被綁定的服務(wù)斷開連接的時(shí)候回調(diào)
            // 啟動(dòng)被綁定的服務(wù)岖沛。
            startService(new Intent(RemoteService.this, LocalService.class));
            bindService(new Intent(RemoteService.this, LocalService.class),
                    conn, Context.BIND_IMPORTANT);
        }
    }
}‘

3,因?yàn)閮蓚€(gè)服務(wù)在不同的進(jìn)程里面.所以在AndroidManifest.xml配置:

圖片發(fā)自簡書App

4.在不同的進(jìn)程通信暑始。用到Aidl.定義一個(gè)通信接口RemoteConn.aidl。

RemoteConn.aidl

package com.zsj.doubleprocess;

interface RemoteConn {
    String getProcessName();
}

雙進(jìn)程守護(hù)就完成了婴削。
因?yàn)檫@兩個(gè)服務(wù)都是后臺(tái)服務(wù)廊镜。為了提高更加不容易被殺死“λ祝可以提升為前臺(tái)服務(wù)嗤朴。就不給實(shí)現(xiàn)了。很簡單虫溜。

優(yōu)點(diǎn):

可以防止360等第三方清理工具殺死雹姊。

弊端:

但是當(dāng)用戶手動(dòng)點(diǎn)擊強(qiáng)制停止。進(jìn)程真的就停止了衡楞。

下次寫就算用戶手動(dòng)點(diǎn)擊強(qiáng)制停止吱雏。也能自動(dòng)喚醒進(jìn)程。

demo下載:
https://github.com/zsj1225/DoubleProcess

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瘾境,一起剝皮案震驚了整個(gè)濱河市歧杏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌迷守,老刑警劉巖犬绒,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異盒犹,居然都是意外死亡懂更,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門急膀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沮协,“玉大人,你說我怎么就攤上這事卓嫂】对荩” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長行瑞。 經(jīng)常有香客問我奸腺,道長,這世上最難降的妖魔是什么血久? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任突照,我火速辦了婚禮,結(jié)果婚禮上氧吐,老公的妹妹穿的比我還像新娘讹蘑。我一直安慰自己,他們只是感情好筑舅,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布座慰。 她就那樣靜靜地躺著,像睡著了一般翠拣。 火紅的嫁衣襯著肌膚如雪版仔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天误墓,我揣著相機(jī)與錄音蛮粮,去河邊找鬼。 笑死谜慌,一個(gè)胖子當(dāng)著我的面吹牛蝉揍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播畦娄,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼又沾,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了熙卡?” 一聲冷哼從身側(cè)響起杖刷,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎驳癌,沒想到半個(gè)月后滑燃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡颓鲜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年表窘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甜滨。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乐严,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出衣摩,到底是詐尸還是另有隱情昂验,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站既琴,受9級(jí)特大地震影響占婉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜甫恩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一逆济、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧磺箕,春花似錦纹腌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽莱褒。三九已至击困,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間广凸,已是汗流浹背阅茶。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谅海,地道東北人脸哀。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像扭吁,于是被迫代替她去往敵國和親撞蜂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,863評(píng)論 25 707
  • 什么是進(jìn)程 進(jìn)程(Process)是計(jì)算機(jī)中的程序關(guān)于某數(shù)據(jù)集合上的一次運(yùn)行活動(dòng)侥袜,是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單...
    晨起清風(fēng)閱讀 1,776評(píng)論 0 5
  • 上篇我們講解了Android中的5中等級(jí)的進(jìn)程蝌诡,分別是:前臺(tái)進(jìn)程、可見進(jìn)程枫吧、服務(wù)進(jìn)程浦旱、后臺(tái)進(jìn)程、空進(jìn)程九杂。系統(tǒng)會(huì)按照...
    徐愛卿閱讀 3,854評(píng)論 6 33
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理颁湖,服務(wù)發(fā)現(xiàn),斷路器例隆,智...
    卡卡羅2017閱讀 134,638評(píng)論 18 139
  • 天貓的新Banner式樣廣告6秒后收入banner中 非彈層廣告 干擾性低 流暢自然與界面融為一體 不影響操作
    小凡03004閱讀 113評(píng)論 0 0