Android - 守護(hù)進(jìn)程

老婆保佑,代碼無BUG

目錄

  • 效果圖
  • 實現(xiàn)原理
  • 如何實現(xiàn)
    • 步驟
    • 代碼
    • 源碼地址

一. 先上一個GIF 至少給個效果給大家看看嘛

sd.gif

二. 實現(xiàn)原理

用到的知識點 AIDL,如果有隊AIDL 不熟悉的小伙伴,請移步點擊跳轉(zhuǎn),這里面是以前寫的service,其中的遠(yuǎn)程服務(wù)用到的就是AIDL,不知道的小伙伴可以點擊,看看,鏈接

三. 如何實現(xiàn)

步驟

  • 寫一個AIDL
  • 寫一個本地服務(wù)
  • 寫一個遠(yuǎn)程服務(wù)
  • 本地服務(wù),和遠(yuǎn)程服務(wù)相互綁定

哈哈,感覺說的很模糊啊

簡單點說,當(dāng)本地服務(wù)被殺死的時候,我們可以通過監(jiān)聽事件,然后在監(jiān)聽事件中,告訴遠(yuǎn)程服務(wù),我被殺死了,遠(yuǎn)程服務(wù)收到了這個消息,就把你重新啟動,并且,再次綁定關(guān)系

代碼

AIDL


//第一步,寫一個AIDL
interface IAIDL {

    String getTestData();
}

本地服務(wù)

首先本地服務(wù),和遠(yuǎn)程服務(wù)的代碼,一樣,只是在清單文件中的配置不同,這里,直接放上本地服務(wù)代碼,源碼會在片尾雙手奉上。

package com.allens.saveservicedemo.service;

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;
import android.support.annotation.Nullable;
import android.util.Log;

import com.allens.saveservicedemo.IAIDL;

/**
 * 描述:本地服務(wù)
 * <p>
 * Created by allens on 2017/12/27.
 */

public class FirstService extends Service {

    private MyBinder myBinder;
    private MyCon myCon;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        //第4步,將自定義的Binder,在這里 return
        return myBinder;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.e("TAG", "本地服務(wù)啟動");

        //第3步,new 一個我們自己寫的Binder
        myBinder = new MyBinder();

        //第6步,new  一個自定義的連接對象
        if (myCon == null) {
            myCon = new MyCon();
        }
    }


    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);

        //第7步,當(dāng)這個服務(wù)啟動的時候,和遠(yuǎn)程服務(wù)綁定   bindService
        Intent intent1 = new Intent(FirstService.this, SecondService.class);
        FirstService.this.bindService(intent1, myCon, Context.BIND_IMPORTANT);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.e("TAG", "本地服務(wù)注銷");
    }


    //第二步,繼承AIDL.Stub
    public class MyBinder extends IAIDL.Stub {

        @Override
        public String getTestData() throws RemoteException {
            return "Hello 我是第一個服務(wù)";
        }
    }


    //第5步,實現(xiàn)ServiceConnection 接口,實現(xiàn)它兩個方法
    public class MyCon implements ServiceConnection {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.e("TAG", "連接遠(yuǎn)程服務(wù)成功");

        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.e("TAG", "連接遠(yuǎn)程服務(wù)失敗");


            //這里是重點,當(dāng)遠(yuǎn)程服務(wù)被殺死的時候,我們會在這里收到消息   然后重新啟動服務(wù),并且重新建立連接
            Intent intent = new Intent(FirstService.this, SecondService.class);
            //重新啟動服務(wù)
            FirstService.this.startService(intent);
            //重新建立連接
            FirstService.this.bindService(intent, myCon, Context.BIND_IMPORTANT);
        }
    }
}

清單文件


        <service android:name=".service.FirstService" />

        <service
            android:name=".service.SecondService"
            android:process=":div" />

最后,奉上源碼

SaveServiceDemo,點擊即可跳轉(zhuǎn)

寫在最后

這種保火,已經(jīng)out了,現(xiàn)在手機都是多核的,該殺還是啥,這個思路值得我們學(xué)習(xí)。

最后編輯于
?著作權(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)容