1. 程式人生 > >Android偽守護程序(通過AIDL實現)

Android偽守護程序(通過AIDL實現)

這裡主要記錄下學習AIDL,通過AIDL來實現一個偽守護程序,也就是殺不死的程序(ps:這裡指的是在一定情況下是殺不死,離微信,qq那些用NDK來實現的差很遠,只是用於學習)。

先看下效果圖
這裡寫圖片描述

看了效果圖是不是發現我這個demo裡面有兩個程序,殺死一個還能重啟另外一個呢!下面主要記錄下在應用層通過AIDL 和 Service來實現一個偽守護程序。看下面程式碼:

要實現守護我們是不是得啟動2根服務來監聽,如微信,360它們的應用都不會少於2根執行緒在後臺執行,進行相互監聽。那我們就先啟動2根服務

MainActivity程式碼:

public class MainActivity extends
Activity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent localService = new Intent(this, LocalService.class); this.startService(localService); Intent remoteService = new
Intent(this, RemoteService.class); this.startService(remoteService); } }

Manifest配置

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

      <service android:name=".RemoteService" android:process=":remote"/>

設定AIDL介面,新建一個.aidl為字尾的aidl檔案,我這裡隨便提供了一個方法

package com.richard.guardservicedemo
.aidl; interface GuardAidl{ void doSomething(); }

LocalService程式碼:

package com.richard.guardservicedemo;

import com.richard.guardservicedemo.aidl.GuardAidl;

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.util.Log;
import android.widget.Toast;

/**
 * 本地服務
 * @author Richard
 *
 */
public class LocalService extends Service{

    private MyBilder mBilder;

    @Override
    public IBinder onBind(Intent intent) {
        if (mBilder == null)
            mBilder = new MyBilder();

        return mBilder;

    }

    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        //在LocalService執行後,我們對RemoteService進行繫結。 把優先順序提升為前臺優先順序
        this.bindService(new Intent(LocalService.this, RemoteService.class), 
                connection, Context.BIND_ABOVE_CLIENT);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO Auto-generated method stub
        return super.onStartCommand(intent, flags, startId);
    }

    private class MyBilder extends GuardAidl.Stub{

        @Override
        public void doSomething() throws RemoteException {
            Log.i("TAG", "繫結成功!");
            Intent localService = new Intent(LocalService.this, RemoteService.class);
            LocalService.this.startService(localService);
            LocalService.this.bindService(new Intent(LocalService.this, RemoteService.class), 
                    connection, Context.BIND_ABOVE_CLIENT);
        }

    }

    private ServiceConnection connection = new ServiceConnection() {

        /**
         * 在終止後呼叫,我們在殺死服務的時候就會引起意外終止,就會呼叫onServiceDisconnected
         * 則我們就得裡面啟動被殺死的服務,然後進行繫結
         */
        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.i("TAG", "RemoteService被殺死了");
            Intent localService = new Intent(LocalService.this, RemoteService.class);
            LocalService.this.startService(localService);
            LocalService.this.bindService(new Intent(LocalService.this, RemoteService.class), 
                    connection, Context.BIND_ABOVE_CLIENT);
            Toast.makeText(LocalService.this, "RemoteService被殺死!", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.i("TAG", "RemoteService連結成功!");
            try {
                if(mBilder != null)
                    mBilder.doSomething();
            } catch (RemoteException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    };


}

RemoteService程式碼

package com.richard.guardservicedemo;

import com.richard.guardservicedemo.aidl.GuardAidl;

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.util.Log;
import android.widget.Toast;

/**
 * 守護服務
 * @author Richard
 *
 */
public class RemoteService extends Service {

    private MyBilder mBilder;

    @Override
    public IBinder onBind(Intent intent) {
        if (mBilder == null)
            mBilder = new MyBilder();
        return mBilder;
    }

    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        //在RemoteService執行後,我們對LocalService進行繫結。 把優先順序提升為前臺優先順序
        this.bindService(new Intent(RemoteService.this, LocalService.class),
                connection, Context.BIND_ABOVE_CLIENT);
    }

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

    private class MyBilder extends GuardAidl.Stub{

        @Override
        public void doSomething() throws RemoteException {
            Log.i("TAG", "繫結成功!");
        }

    }

    private ServiceConnection connection = new ServiceConnection() {

        /**
         * 在終止後呼叫,我們在殺死服務的時候就會引起意外終止,就會呼叫onServiceDisconnected
         * 則我們就得裡面啟動被殺死的服務,然後進行繫結
         */
        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.i("TAG", "LocalService被殺死了");
            Intent remoteService = new Intent(RemoteService.this, LocalService.class);
            RemoteService.this.startService(remoteService);
            RemoteService.this.bindService(new Intent(RemoteService.this, LocalService.class),
                    connection, Context.BIND_ABOVE_CLIENT);
            Toast.makeText(RemoteService.this, "LocalService被殺死!", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.i("TAG", "LocalService連結成功!");
            try {
                if(mBilder != null)
                    mBilder.doSomething();
            } catch (RemoteException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    };

}

到這裡基本上就實現了一個偽守護程序,’殺不死應用’。呵呵,當然這還是可以殺死的。在應用層如果還想保險點,那就加廣播監聽,比如:電量變化的廣播啊!
當然,不推薦這樣寫程式碼。因為這不是正確的實現方式,也不是保險的實現方式,這只是一個然並卵的實現方式。不推薦用於實際開發。

相關推薦

Android守護程序通過AIDL實現

這裡主要記錄下學習AIDL,通過AIDL來實現一個偽守護程序,也就是殺不死的程序(ps:這裡指的是在一定情況下是殺不死,離微信,qq那些用NDK來實現的差很遠,只是用於學習)。 先看下效果圖 看了效果圖是不是發現我這個demo裡面有兩個程序,殺死一個還能

Word Count程序C語言實現

地址 組成 other 進一步 and 文件遍歷 stand evel oid Word Count 程序 GitHub地址:https://github.com/MansonYe/Word-Count 一、項目簡介 Word Count 是用以統計文本文件的字符數

Windows下雙守護程序spring boot 版本

一、簡介 現在的伺服器端程式很多都是基於Java開發,針對於Java開發的Socket程式,這樣的伺服器端上線後出現問題需要手動重啟,萬一大半夜的掛了,還是特別麻煩的。 大多數的解決方法是使用其他程序來守護伺服器程式,如果伺服器程式掛了,通過守護程序來啟動伺服器程式。 萬一守護程序掛了呢

執行緒有哪些狀態?分別表示什麼意思?通過程式碼實現

執行緒的狀態在面試中經常被問起,以至於八九成的程式設計師都知道執行緒的幾種狀態,但每一種狀態是什麼意思,對於什麼情況會進入什麼狀態,不一定都能拿捏的準(這麼說並不表示我一定拿捏的準)。所以在這裡我準備多花點時間去探討一下。 執行緒的狀態有以下幾種: NEW:新

zabbix批量監控埠和程序通過巨集變數

需求:批量監控埠和程序 什麼是巨集?(是變數) 巨集是一種抽象,根據一系列預定義的規則替換一定的文字模式,而直譯器或編譯器在遇到巨集時會自動進行這一模式替換,可以理解為變數

Android通過AIDL實現程序更新UI

一、概述 本篇文章將和大家一起來學習AIDL實現跨程序更新UI。 需求是:在同一個應用中有兩個Activity,MainActivity和TempActivity,這兩個Activity不在同一個程序中。 現在需要通過TempActivity來改變Ma

android開發中通過aidl實現遠端方法呼叫

在安卓開發過程中我們可能見過這樣的問題,就是在一個應用中呼叫另一個應用中的服務,並呼叫該服務中的方法。 我們可能對呼叫服務並不陌生,可是要執行服務中的方法,卻不能直接呼叫。因為兩個服務和呼叫它的程式屬

[日更-2019.5.18] Android 系統內的守護程序--core類中的服務 : adbd

宣告 其實很好奇Android系統中的一些關鍵守護程序服務的作用; 暫且大概分析下它們的作用,這樣有助於理解整個系統的工作過程;

[日更-2019.5.20] Android 系統內的守護程序--core類中的服務 : lmkd

宣告 其實很好奇Android系統中的一些關鍵守護程序服務的作用; 暫且大概分析下它們的作用,這樣有助於理解整個系統的工作過程;

【Java】Swing+IO流實現一個簡單的文件加密程序較完整版

move 初始 baidu images 文件選擇器 while login 一個 ktr 留著參考 beans package com.my.bean; import java.io.Serializable; public class

Android項目實戰三十七:Activity管理及BaseActivity的實現

nbsp agen etc == tar fin email ted AD 原文:Android項目實戰(三十七):Activity管理及BaseActivity的實現Ps:7-10月 完成公司兩個app項目上架。漏掉的總結 開始慢慢補上。 一、寫一個Activit

mfc通過MapWinGIS控件讀取shp文件通過#import實現

連接 bst bool add 創建 利用 layer () ctx 1、首先註冊MapWinGIS ActiveX組件, 引入MapWinGIS.ocx產生的MapWinGIS_i.h和MapWinGIS_i.c文件,利用CoCreateInstance函數來調用 演

vs2017 遠程調試部署在centos上的asp.net core程序通過附加程序的方式

log 調試 font blog db文件 設置 子進程 src bug 前言 有時候必須在服務器上調試代碼。比如做微信公眾號開發,需要做一些url回調, 此時無法在開發電腦上做調試。所以遠程調試代碼就很有必要了。經過2個小時摸索,順利實現。

php 守護程序 簡單

首先需要解釋的是什麼是守護程序。 守護程序就是在後臺一直執行的程序。比如我們啟動的httpd,mysqld等程序都是常駐記憶體內執行的程式。 針對需求進行分析: 需求:有一個常駐佇列messageQueue(假設在redis記憶體中),這個佇列會有可能有請求不定期的往佇列中增加元素。同時我們要求在佇列中

守護程序瞭解

守護程序 主程序建立子程序,然後將該程序設定成守護自己的程序,守護程序伴隨著子程序的結束而結束。 如果我們有兩個任務需要併發執行,那麼開一個主程序和一個子程序分別去執行就ok了,如果子程序的任務在主程序任務結束後就沒有存在的必要了,那麼該子程序應該在開啟前就被設定成守護程序。主程序程式碼執行結束,守護程序

c#守護程序windows服務監測程式,程式關閉後自啟動最詳細!!!!!!!!

最近專案需要:程式關閉後自動重新啟動,需要一個監測程式所以寫下這篇文章,為自己以後留個印象,也給大家一個參考,不喜勿噴!!! 1.開啟VS建立windows服務  2.實現服務的操作步驟(檢視service1程式碼)  3.(右鍵)新增引用(這個dll是為顯示介

Android開發實戰使用VR技術實現360°全景視訊播放功能

一.在build.gradle中引入谷歌VR的SDK依賴 compile 'com.google.vr:sdk-videowidget:1.10.0' 二.注意支援的最小SDK minSdkVersion 19 targetSdkVersi

Android自動化測試初探: 模擬鍵盤滑鼠事件Socket+Instrumentation實現

通過Socket + Instrumentation實現模擬鍵盤滑鼠事件主要通過以下三個部分組成:   *   Socket程式設計:實現PC和Emulator通訊,並進行迴圈監聽   *   Service服務:將Socket的監聽程式放在Service中,從而達到

最短路徑—Dijkstra演算法通過實現鬆弛:鄰接矩陣

上一節通過Floyd-Warshall演算法寫了多源節點最短路徑問題: 這一節來學習指定一個點(源點)到其餘各個頂點的最短路徑。也叫做“單源最短路徑”Dijkstra。 例如求下圖中1號頂點到2、3、4、5、6號頂點的最短路徑。 用二維陣列e儲存頂點之間邊的關係,初

python呼叫外部子程序通過管道實現非同步標準輸入和輸出的互動

我們通常會遇到這樣的需求:通過C++或其他較底層的語言實現了一個複雜的功能模組,需要搭建一個基於Web的Demo,方法查詢資料。由於Python語言的強大和簡潔,其用來搭建Demo非常合適,Flask框架和jinja2模組功能為python提供了方便的web開發能力。同時,python能夠很方便的同其他語言