1. 程式人生 > >安卓應用保活實踐(雙程序守護)

安卓應用保活實踐(雙程序守護)

         研究安卓應用保活黑科技已經有一段時間了,其實很多都是看看文章,部落格,看完就忘了,今天休息,在家寫寫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);
	}
        謝謝您的光顧,希望對您有一些幫助!