1. 程式人生 > >安卓守護程序,使你的程序不被殺死

安卓守護程序,使你的程序不被殺死

是這個情況,前幾天在騰訊公開課看到的,確實不錯,首先我先說下怎麼實現的?

**實現思路:**建立A,B兩個服務,然後同時啟動A、B服務,雙程序守護,當然要另開一個程序,通過AIDL實現跨程序通訊,在A、B服務中的onStartCommand方法中,互相繫結對方,然後我們想想,服務如果被強殺了怎麼辦,接下來是關鍵:我們實現ServiceConnection這個介面,在onServiceDisconnected方法中重新繫結並且start服務(被kill的service)這樣每次killservice都會走到這個方法裡面,哈哈,服務就被重啟了,MDZZ很強勢有沒有?還有誰?我就想問下。

對了還有web視訊要看,先不吹B,直接上程式碼:

本地服務code:

package app.project.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 android.widget.Toast; import app.project.IMyAidlInterface; public class LocalService extends Service { MyBinder binder; MyConn conn; @Nullable @Override public IBinder onBind(Intent intent) { return binder; } @Override public void
onCreate() { super.onCreate(); binder = new MyBinder(); conn = new MyConn(); } class MyBinder extends IMyAidlInterface.Stub { @Override public String getServiceName() throws RemoteException { return LocalService.class.getSimpleName(); } } @Override public int onStartCommand(Intent intent, int flags, int startId) { Toast.makeText(LocalService.this, " 本地服務started", Toast.LENGTH_SHORT).show(); this.bindService(new Intent(LocalService.this, RomoteService.class), conn, Context.BIND_IMPORTANT); return START_STICKY; } class MyConn implements ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder service) { } @Override public void onServiceDisconnected(ComponentName name) { Toast.makeText(LocalService.this, "遠端服務killed", Toast.LENGTH_SHORT).show(); //開啟遠端服務 LocalService.this.startService(new Intent(LocalService.this, RomoteService.class)); //繫結遠端服務 LocalService.this.bindService(new Intent(LocalService.this, RomoteService.class), conn, Context.BIND_IMPORTANT); } } @Override public void onDestroy() { super.onDestroy(); //開啟遠端服務 LocalService.this.startService(new Intent(LocalService.this, RomoteService.class)); //繫結遠端服務 LocalService.this.bindService(new Intent(LocalService.this, RomoteService.class), conn, Context.BIND_IMPORTANT); } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72

遠端服務code:

package app.project.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 android.widget.Toast;

import app.project.IMyAidlInterface;

public class RomoteService extends Service {
    MyConn conn;
    MyBinder binder;

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

    @Override
    public void onCreate() {
        super.onCreate();
        conn = new MyConn();
        binder = new MyBinder();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        Toast.makeText(this, " 遠端服務started", Toast.LENGTH_SHORT).show();
        this.bindService(new Intent(this, LocalService.class), conn, Context.BIND_IMPORTANT);

        return START_STICKY;
    }

    class MyBinder extends IMyAidlInterface.Stub {
        @Override
        public String getServiceName() throws RemoteException {
            return RomoteService.class.getSimpleName();
        }
    }

    class MyConn implements ServiceConnection {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {

        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Toast.makeText(RomoteService.this, "本地服務killed", Toast.LENGTH_SHORT).show();

            //開啟本地服務
            RomoteService.this.startService(new Intent(RomoteService.this, LocalService.class));
            //繫結本地服務
            RomoteService.this.bindService(new Intent(RomoteService.this, LocalService.class), conn, Context.BIND_IMPORTANT);
        }

    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        //開啟本地服務
        RomoteService.this.startService(new Intent(RomoteService.this, LocalService.class));
        //繫結本地服務
        RomoteService.this.bindService(new Intent(RomoteService.this, LocalService.class), conn, Context.BIND_IMPORTANT);

    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78

aidl檔案:

// IMyAidlInterface.aidl
package app.project;

// Declare any non-default types here with import statements

interface IMyAidlInterface {
   String getServiceName();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

這裡說下aidl的建立,右鍵aidl檔案,建立完成後看圖:

這裡寫圖片描述

注意啦:一定要clean下專案,保證在gen下生成aidl檔案,看圖:

這裡寫圖片描述

配置檔案:
  <service
            android:name=".service.LocalService"
            android:enabled="true"
            android:exported="true" />
        <service
            android:name=".service.RomoteService"
            android:process=":romoteservice"
            android:enabled="true"
            android:exported="true"></service>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

接下來就是在activity裡啟動A、B服務咯,測試就看你自己咯!

下面是視訊連線地址:http://www.bilibili.com/video/av6607227/

相關推薦

Android 通過JNI實現守護程序使Service服務殺死

開發一個需要常住後臺的App其實是一件非常頭疼的事情,不僅要應對國內各大廠商的ROM,還需要應對各類的安全管家...  雖然不斷的研究各式各樣的方法,但是效果並不好,比如工作管理員把App幹掉,服務就起不來了... 網上搜尋一番後,主要的方法有以下幾種方法,但其實也都

守護程序使程序殺死

是這個情況,前幾天在騰訊公開課看到的,確實不錯,首先我先說下怎麼實現的? **實現思路:**建立A,B兩個服務,然後同時啟動A、B服務,雙程序守護,當然要另開一個程序,通過AIDL實現跨程序通訊,在A、B服務中的onStartCommand方法中,互相繫結對方,然後我們想

怎麽讓 Android 程序一直後臺運行像 QQ 一樣殺死

著作權 RoCE 就是 自己 檢查 ble 技術 來源 進程守護 轉自:https://blog.csdn.net/javazejian/article/details/52709857 作者:閉關寫代碼鏈接:https://www.zhihu.com/questi

Service啟動方式如何保證Service殺死程序等級IntentService

一、Service 類的啟動 ,有兩種方法:       •Context.startService()        • Context.bindService()      1. 在同一個應用任何地方呼叫startService() 方法就能啟動 Service

一步一步教實現mvvm架構雙向資料繫結

google 2015年9月推出了mvvm架構,實現了在xml上設定雙向資料繫結,類似js。 開發步驟: 1   首先要先在build.gradle內新增 dataBinding { enabled true }   2.  建立一個Model

一步一步教實現mvvm架構雙向資料繫結(二)

上文講了普通介面的雙向資料繫結,本文講一下recyclerview的雙向資料繫結,整個工程只要寫一個adapter就夠了,不用像以前一個recyclerview寫一個adapter了,節省了至少80%的程式碼,什麼第三方庫都不需要了。強大的工具! 1.   建立一個通用

面試題:1,程序和執行緒的區別?什麼時候用程序?什麼時候用執行緒?為什麼的專案中用的是執行緒?為什麼不用程序?如果只有程序這個專案有沒有影響?

答:首先得知道什麼是程序什麼是執行緒,我的理解是程序是指在系統中正在執行的一個應用程式;程式一旦執行就是程序,或者更專業化來說:程序是指程式執行時的一個例項,即它是程式已經執行到課中程度的資料結構的彙集。從核心的觀點看,程序的目的就是擔當分配系統資源(CPU時間、記憶體等)的

IOS中公布應用程序進度條一直走怎麽處理

sso pan arch 技術分享 成功 csdn 版本 進度條 div 在IOS中公布應用程序非常是喜聞樂見。近期1周。我更新了6次版本號。可是時不時的會卡住,進度條不走。最後總結了幾個原因。 1.在公布前你要確認自己的證書是否配置正確 2.DNS域名server有沒

new Date()在下正常在IOS下顯示出來

顯示 安卓 strong fine def 不支持 返回 方案 nbsp 之前用JS在做一個倒計時,在PC端和安卓下面顯示沒問題,在IOS下顯示不出來。 查找了資料,鏈接我忘記了。 原因是:   在IOS下,new Date("2000-2-22 00:10"),返回的

配置ip使的虛擬機可以別人訪問到搭建服務器必備

scripts sysconf ron pin wid png system restart 是我 我麽一般配置虛擬機的時候,我們總是喜歡使用虛擬網段,但是這樣別人有可能ping不通我的虛擬機的。 若是我們想要別人ping我們的ip ,則我們要跟改以下幾個操作: 在我們的網

的進化用戶的陣痛?從奧利奧與奧利粵說起

安卓今天,榮耀總裁趙明在微博上公布了榮耀手機EMUI 8.0的最新更新適配計劃,共計11款手機在列,既包括老款也包括新款。這一消息一經放出,引來了大量的關註。原因在於EMUI 8.0與以往的系統不同,這次更新是建立在Android 8.0奧利奧之上,而奧利奧包含了大量的底層優化,不僅更新過程需耗費大量人力財力

和ios移動端時間排序的問題

  data是一個數組,每一項是物件,根據data數組裡面的MatchDate,時間欄位,來把這個陣列排序 , 時間格式為(MatchDate:"2018-03-21 17:00:00") data.sort(function(a, b) {     &nb

混淆之後android與js互動異常原因

解決方案:需要js互動程式碼不被混淆掉,加入以下程式碼即可 -keepclassmembers class com.taohaohuo365.taohaohuo.activity.H5Activity$AndroidAndJSInterface { public *; } -keepcla

程式中建立一個子程序然後父子程序各自獨自執行程序在標準輸入裝置上讀入小寫字母寫入管道。子程序從管道讀取字元並轉化為大寫字母。讀到x結束

程式中建立一個子程序,然後父子程序各自獨自執行,父程序在標準輸入裝置上讀入小寫字母,寫入管道。子程序從管道讀取字元並轉化為大寫字母。讀到x結束。(非字母字元就輸出本身) 相關的系統函式:fork(),read(),write(),pipe(); 筆者在telnet上寫這些程式碼,由於

dva相容瀏覽器ios低版本自動帶上瀏覽器字首

果然打程式碼 文件不能看漏 DVA文件裡面有寫好的自動帶字首,今天找了大半天webpack相容 https://github.com/sorrycc/roadhog/blob/master/README_zh-cn.md#%E9%85%8D%E7%BD%AE 配置文件裡有一句

解決小米魅族狀態列全白的問題

本文不是原創  是借鑑了其他大神的程式碼,我只是轉發收藏一下,方便自己學習記錄 原文地址:https://blog.csdn.net/xiaoshuxgh/article/details/80253196  先看下我沒解決的效果   全白的  

推薦一款看片神器版的很給力的!

這年頭,哪個不看片? 不論是否有男/女朋友,相信你都會有心癢難耐的時候,這個時候很多人選擇看片來渡過! 大多數人手中可能儲存了十來個App,或是明顯的,或是不明顯的。有些是收費型的,充值了會員才能繼續觀看,十多個App可以輪著來看。有些是免費的,但是國內免費的情況大多數是

移動端系統中固定在底部的按鈕輸入框的鍵盤頂上去的問題解決辦法

處理問題的思路:         監控螢幕大小的變化,當螢幕變小的時候讓按鈕隱藏起來,當螢幕大小與當前螢幕保持一致的時候,讓按鈕正常顯示。  解決辦法有2種: 1、原生辦法 (推薦) var h = document.body.scrollHeight; wi

適配px與dp兩種適配方法

技術群裡一朋友最近在群裡抱怨適配好難好難,今天正好事情不多,所以來簡單的寫寫關於適配的文章。網上關於適配的文章實在太多,但是對於一些時間比較緊,想馬上提交程式碼的朋友並不是很試用。不再講使用相對佈局,執行緒佈局等內容,直接上乾貨。 朋友們先如果有時間就看看: 我也

喝過的所有雞湯消化吸收使強壯

江蘇省宿遷中學 創新三部 徐士權 同學們好,我今天跟大家分享的話題是:正確對待心靈雞湯。 先來看看我們的困惑和焦慮: 我相信我們絕大多數班主任都會收到以下一些提問(請各位同學各取所需,對號入座) “我覺得我不聰明,那是不是學了也沒用啊。”   “沒有學習動力怎麼辦呀