安卓應用保活實踐(雙程序守護)
研究安卓應用保活黑科技已經有一段時間了,其實很多都是看看文章,部落格,看完就忘了,今天休息,在家寫寫Demo,研究一下,跟大家分享。
學習資料:http://www.oschina.net/code/snippet_1021353_36835
通過最近一段時間的學習,初步瞭解了類似微信,QQ等產品的保活手段,這樣的黑科技實在不應被髮明並應用到市場,希望每位讀者也是跟本人一樣,抱著學術研究的態度來了解雙程序守護機制,如果要應用於自己的應用,請三思而後行!謝謝!
要實現雙程序守護,首先需要解決的問題是:一般每個應用只對應一個程序,那麼在安卓中一個應用如何開啟雙程序?相信大家跟我剛開始想這個問題時一樣懵逼,如果你此刻已經想到了開啟服務來解決程序問題,那你已經找到了解決問題的核心,如果你已經想到了運用遠端服務,OK,你離成功就差那麼一點點了!
其實,雙程序守護很簡單,簡單到核心程式碼只有20行,咱們分3步來實現吧:
第一步:清單檔案宣告:
安卓中,我們定義一個服務,除了寫一個類整合Service,還有一步很關鍵,就是在清單檔案裡宣告這個服務,類似這樣的操作:
<span style="font-size:14px;"><service android:name="com.example.doubleservice.LocalService"/></span>
其實,在宣告服務時,我們還會看到一個叫做process的引數,你沒有用過沒關係,我也第一次使用,這個引數的意思就是指定宣告的服務執行在哪個程序中,是不是感覺很厲害的樣子!注意這裡的引數值可以自己寫,但是 格式不要寫錯:"."+引數名 <span style="font-size:14px;"> <service android:name="com.example.doubleservice.RecommendService" android:process=".recommendservice" /></span>
好了,現在你只要啟動這兩個服務,就會發現此時的應用已經對應了兩個程序,是不是很意外,這麼簡單。
第二步:開啟遠端服務:
AIDL遠端服務我就不跟大夥囉嗦了,直接在程式碼裡新建一個檔案,注意字尾名一定是.aidl,寫完aidl大家會發現,在gen目錄裡已經生成了對應的java檔案
接下來的任務是在服務類裡,呼叫遠端服務的存根,很關鍵的
class MyBinder extends ProcessService.Stub {
@Override
public String getServiceName() throws RemoteException {
// TODO Auto-generated method stub
return "localService";
}
}
第三步:開啟並繫結服務
這一步的目的是使兩個程序可以互相啟動,互相繫結,在本地程序殺死的時候,開啟遠端程序,真正實現雙程序守護,很簡單,呼叫服務的startService和bindService的方法,bindService需要一個連線物件作為引數這個物件正好為我們所用,監聽另外一個程序的狀態!
/**
* 繫結方式開啟服務需要實現ServiceConnection介面
*
* @author fflin
*
*/
class MyConn implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
Toast.makeText(LocalService.this, "遠端服務啟動了", 0).show();
}
@Override
public void onServiceDisconnected(ComponentName name) {
Toast.makeText(LocalService.this, "遠端服務被殺死", 0).show();
// 在本地服務類裡監聽到遠端服務有沒有被殺死,被殺死則重新開啟並繫結
LocalService.this.startService(new Intent(LocalService.this,RecommendService.class));
LocalService.this.bindService(new Intent(LocalService.this,RecommendService.class), conn, Context.BIND_IMPORTANT);
}
}
好了,核心程式碼已經寫完了,是不是很簡單,只有20行?這裡演示的程式碼只是本地服務類的程式碼,那麼另外的服務類該怎麼寫?很簡單,複製+貼上
具體的呼叫相信大家都沒有問題,畢竟是一些基礎一點的知識
private MyBinder binder;
private MyConn conn;
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return binder;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
binder = new MyBinder();
if (conn == null) {
conn = new MyConn();
}
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
//實現兩個服務相互繫結
this.bindService(new Intent(this,RecommendService.class), conn, Context.BIND_IMPORTANT);
}
謝謝您的光顧,希望對您有一些幫助!