1. 程式人生 > >Android多程序間採用AIDL方式進行通訊簡單DEMO

Android多程序間採用AIDL方式進行通訊簡單DEMO

在上一節中,我介紹了Android中Service的生命週期以及一些有關知識。在這一節中,我採用程式碼編寫的方式來介紹一下不同程式之間也就是不同程序之間通訊採用AIDL方式。

首先我需要解釋一下,不同程式程序間採用AIDL方式啟動服務,我們可以看作成client客戶端與server服務端之間的通訊,無非c/s都是安裝在了我們的智慧手機裝置Android系統之上。好了,理解到這裡我們就可以繼續往下介紹了。

首先我們編寫server服務端程式:

1)我們新建一個應用程式S,它的應用程式架構如下:


2)我們在com.lgy.s包下編寫S.aidl檔案,具體程式碼如下:(aidl編碼格式不再敘述)

package com.lgy.s;

interface S{
	String getStr(String name);
}
編寫好S.aidl檔案我們就可以使用S.stub類下的相關方法。

3)我們可以自定義我們的Service了,具體程式碼如下:

package com.lgy.s;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;

public class MyService extends Service {

	private static final String TAG = "MyService";
	private S.Stub server;
	
	@Override
	public void onCreate() {
		Log.i(TAG, "onCreate");
		server = new S.Stub() {
			@Override
			public String getStr(String name) throws RemoteException {
				Log.i(TAG, name);
				return name;
			}
		};
		super.onCreate();
	}
	
	@Override
	public boolean onUnbind(Intent intent) {
		Log.i(TAG, "onUnbind");
		return super.onUnbind(intent);
	}
	
	@Override
	public void onDestroy() {
		Log.i(TAG, "onDestroy");
		server = null;
		super.onDestroy();
	}
	
	
	@Override
	public IBinder onBind(Intent intent) {
		Log.i(TAG, "onBind");
		
		return server;
	}

}
4)我們進行服務端Server最後一步,在AndroidManifest.xml檔案中註冊服務Service
<pre name="code" class="plain"><service android:name="com.lgy.s.MyService">
            <intent-filter >
                <action android:name="android.lgy.myService" />
            </intent-filter>
        </service>
-----------到此我們伺服器端就編寫完畢------------------------

下面我們編寫客戶端client應用程式:

1)我們新建一個應用程式C,具體應用架構如下:

2)我們將在伺服器端S寫的aidl原封不動的移到客戶端C上來(注包檔名都原封不動),移動後架構如下圖:

3)我們就可以在客戶端MainActivity中直接呼叫繫結伺服器上的服務,具體程式碼如下:

package com.lgy.c;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;

import com.lgy.s.S;

public class MainActivity extends Activity {
	
	protected static final String TAG = "MainActivity";
	private S s;
	private ServiceConnection conn = new ServiceConnection() {
		@Override
		public void onServiceDisconnected(ComponentName name) {
			
		}
		
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			s = S.Stub.asInterface(service);
			Log.i(TAG, "onServiceConnected client");
		}
	};
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
	
	public void bindBtn(View v){
		Intent mIntent = new Intent("android.lgy.myService");
		bindService(mIntent, conn, BIND_AUTO_CREATE);
	}

	public void greetBtn(View v){
		try {
			Log.i(TAG, s.getStr("client"));
		} catch (RemoteException e) {
			e.printStackTrace();
		}
	}
	
	public void unbindBtn(View v){
		unbindService(conn);
	}
	
}
4)MainActivity對應的佈局檔案程式碼如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.lgy.c.MainActivity" >

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:onClick="bindBtn"
        android:text="繫結伺服器Service" />

    <Button
        android:id="@+id/button2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/button1"
        android:layout_below="@+id/button1"
        android:onClick="greetBtn"
        android:text="傳遞引數給伺服器獲取返回的資料" />

    <Button
        android:id="@+id/button3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/button2"
        android:layout_below="@+id/button2"
        android:onClick="unbindBtn"
        android:text="解除繫結服務" />

</RelativeLayout>
至此為止客戶端程式碼我們已經編寫完畢----------------------------------

下面我們開始測試:

我們不執行伺服器端,而是直接執行客戶端的話,相對應的效果會怎麼樣呢?具體效果如下解析:

第一:我們點選繫結服務的話,系統程式無任何反應,這個時候在客戶端服務已經繫結,但是沒有連線到服務端。接著我們再次點解讀取資料的話,系統將會崩潰。因為沒有連線到伺服器端方法沒有具體實現。

第二:我們點選繫結服務的話,系統程式無任何反應,這個時候在客戶端服務已經繫結,但是沒有連線到服務端,接著我們點選解除服務繫結的話,系統仍然沒有任何反應,我們要是再接著點選解除服務繫結的話,系統就會崩潰,這也就從而再次證明了服務只會繫結一次,多次繫結的話服務不會做出任何反應;服務解除繫結只能僅只能解除繫結一次,多次解除繫結服務的話,系統就會崩潰。

第三:我們直接點選接受資料,系統程式也會崩潰,原因就是在於服務沒有繫結,服務端根本就沒有連線,相當於資料讀取方法沒有實現。

第四:我們直接點選解除繫結的話,系統程式也會崩潰,原因就是在於服務一次也沒有繫結。

我們現在執行伺服器,相對應的效果又會怎麼樣呢?具體效果如下解析:

第一:我們點選繫結服務,可以觀察到後臺logcat日誌資訊:



從日誌我們可以看出在客戶端C繫結服務同時連線服務端,可以看到服務端Service的啟動onCreate和服務Service繫結onBind。

第二:我們點選獲取資料,可以觀察到後臺logcat日誌資訊:



從日誌圖中我們可以看出客戶端將client字串資料傳遞給伺服器端,伺服器端接受並返回一個字串資料。

第三:我們點選解除繫結服務,具體logcat如下:


第四:如果我們不點選繫結服務,而是直接點獲取資料,或者解除繫結的話,系統都將會崩潰,具體原因前面已經解釋清楚,在此不作過多重複。

以上就是AIDL在多程序中通訊呼叫的簡單應用(C應用程式啟動S應用程式服務Service)。

相關推薦

Android程序採用AIDL方式進行通訊簡單DEMO

在上一節中,我介紹了Android中Service的生命週期以及一些有關知識。在這一節中,我採用程式碼編寫的方式來介紹一下不同程式之間也就是不同程序之間通訊採用AIDL方式。 首先我需要解釋一下,不同程式程序間採用AIDL方式啟動服務,我們可以看作成client客戶端與se

Android IPC程序通訊(四)AIDL

AIDL-Android介面定義語言 一· 1.相比於Messenger AIDL可跨程序呼叫方法。 2.支援資料型別: (1) Java 的原生基本型別(int, long, char, boolean, double等) (2)String 和CharSequence (3) Arr

程序通訊方式執行緒同步機制總結

多程序之間通訊方式:           檔案對映:本地之間           共享記憶體:本地之間           匿名管道:本地之間           命名管道:跨伺服器           郵件槽:一對多的傳輸資料,通常通過網路向一臺Windo

網路程式設計(40)—— 使用訊號量semaphore進行程序的同步

        本文主要介紹下在多程序中使用訊號量semaphore的方法。在上一文中,我們已經知道semaphore和mutex對臨界區訪問控制的一個最主要區別就是semaphore可以跨程序使用,而mutex只能在一個程序中使用。我們再來看下sem_init的原型,熟悉

Android採用SharedPreferences方式進行檔案的儲存與讀取

工程目錄: 做軟體開發應該都知道,很多軟體會有配置檔案,裡面存放這程式運行當中的各個屬性值,由於其配置資訊並不多,如果採用資料庫來存放並不划算,因為資料庫連線跟操作等耗時大大影響了程式的效率,因此我們使用鍵值這種一一對應的關係來存放這些配置資訊。SharedPrefe

最優雅退出 Android 應用程序的 6 種方式

home鍵 應用 一點 container new 出棧 manage 而且 rec 一、容器式建立一個全局容器,把所有的Activity存儲起來,退出時循環遍歷finish所有Activity import java.util.ArrayList; impor

Android程序Process開發總結-優點與缺陷-(個人註釋版,非絕對原創)

1、背景 我公司產品,一共有三個程序,其中主程序一個、子程序一個、推送程序一個   Androiod多程序 為何使用多程序,有啥好處?  推送業務為何都要獨立程序,這裡涉及到的一個知識就是程序保活技術,推送程序只要不掛掉,那麼推送保證沒有問題 a、不會

Android IPC程序通訊(七) Binder連線池

Binder管家之Binder連線池 IPC程序間通訊(四)之AIDL中的AIDL由一個Service進行管理,若是建立10個AIDL業務模組是不是也要建立10個Service來進行管理,那100個呢?顯然繁瑣,怎麼辦麼,用Binder連線池呀! 工作機制: 1.每個業務模組建立其AID

Android IPC程序通訊(六)Socket

網路通訊之Socket 特點:功能強大,可通過網路傳輸位元組流,支援一對多併發即時通訊。 不支援RPC。 服務端實現: public class SorviceSocket extends Service { private static final String TAG

Android IPC程序通訊(三)Binder

程序間通訊的介質Binder Binder實現了IBinder介面,是android中跨程序通訊的一種方式。是服務端和客戶端通訊的媒介。 Binder的建立: 1.建立自定義類Book.java實現Parcelable介面,以實現序列化可反序列化。 public class Book

Android IPC程序通訊(二)Messenger

Messenger實現程序間低併發即時通訊 Messenger是一種輕量級的IPC,底層實現是AIDL,即可認為Binder。通過在Message中攜帶Bundle進而實現程序之間傳遞資料。由於Messenger一次只能處理一個請求,因此服務端們不用考慮執行緒同步問題。 一,我們在服務端

Android IPC程序通訊(一)檔案共享

IPC程序間通訊簡介 1.在AndroidManifest.xml中宣告元件android:process屬性。 不指定process屬性,則預設執行在主程序中,主程序名字為包名。 android:process = package:remote,將執行在package:remote程序

Android程序總結一:生成程序(android:process屬性)

前言 正常情況下,一個apk啟動後只會執行在一個程序中,其程序名為apk的包名,所有的元件都會在這個程序中執行,以下為DDMS的程序截圖: com.biyou.multiprocess為程序名,也是apk的包名,  但是如果需要將某些元件(如Service,Activity等)執行在單

Linux下的程序共享資源的互斥訪問

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android程序app中Application回撥onCreate()方法被執行次分析及解決

最近工作中碰到一個問題,在優化app,使用DDMS檢視Application log過程中看到,app啟動了三個程序,一個主程序,兩個附帶的程序。如下圖可看到一個app啟動的三個程序。  自定義Application回撥方法onCreate()被執行了3次。開始不知是何原因。 相

Python程序程式設計及程序通訊,資料傳輸

多程序程式設計及程序間的通訊 意義:充分利用計算機的資源提高程式的運算速率 定義:通過應用程式利用計算機多個核心達到同時執行多個任務的目的,以此提高計算機的執行速率 實施方案:多程序 多執行緒 並行: 計算機同時處理多個任務 併發:同時處理多個任務,核心在不斷的任務間小虎切換,達到好像還都在處理執行的

Android程序之Binder解綁監聽的問題

Android多程序系列 接上一篇文章《Android多程序之手動編寫Binder類》中向服務端註冊監聽事件的問題,在擴充套件了Binder類後,我們還需要改造對應的服務端和客戶端 客戶端和服務端的改

Android 程序之Messenger的使用

Android多程序系列 Messenger也可以作為Android多程序的一種通訊方式,通過構建Message來在客戶端和服務端之間傳遞資料 簡單使用Messenger 客戶端通過Messenger

Linux程序相關API及程序通訊

一、相關API 1、程序的建立fork()                     #include <unistd.h>                     pid_t fork(void);                     pid_t vfork

Android系統程序通訊 IPC 機制Binder中的Server啟動過程原始碼分析

                        在前面一篇文章中,介紹了在Android系統中Binder程序間通訊機制中的Server角色是如何獲得Service Manager遠端介面的,即defaultServiceManager函式的實現。Server獲得了Service Manager遠端介面之後,