安卓守護程序,使你的程序不被殺死
是這個情況,前幾天在騰訊公開課看到的,確實不錯,首先我先說下怎麼實現的?
**實現思路:**建立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兩種適配方法
技術群裡一朋友最近在群裡抱怨適配好難好難,今天正好事情不多,所以來簡單的寫寫關於適配的文章。網上關於適配的文章實在太多,但是對於一些時間比較緊,想馬上提交程式碼的朋友並不是很試用。不再講使用相對佈局,執行緒佈局等內容,直接上乾貨。 朋友們先如果有時間就看看: 我也
願你喝過的所有雞湯,都被消化吸收,使你強壯
江蘇省宿遷中學 創新三部 徐士權 同學們好,我今天跟大家分享的話題是:正確對待心靈雞湯。 先來看看我們的困惑和焦慮: 我相信我們絕大多數班主任都會收到以下一些提問(請各位同學各取所需,對號入座) “我覺得我不聰明,那是不是學了也沒用啊。” “沒有學習動力怎麼辦呀