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能夠很方便的同其他語言