AIDL實現跨應用調用服務

AIDL服務全稱是Android Interface definition Language
其作用是跨應用調用服務,也就是調用別人編寫的服務或是自己寫服務給別人調用

所以至少要2個程序來完成,一個是定義服務,一個是調用服務

AIDL的編寫流程:

服務端:

AIDLServiceDemo.java

1.src下面的包中建立file
編寫aidl文件,這個文件和寫Java接口基本一樣,唯一的區別是第一不支持自定義類型,第二不允許任何修飾符

package com.example.aidlservicedemo;

interface MyServiceInterface{
    void sayHello();
}

保存後悔會在gen下生成一個相應的Java類--------MyServiceInterface。Java暫時不用管

2.接下來我們正常編寫Service類,實現onBind方法
在onBind方法中創建並返回gen包中自動生成的那個java類中的內部類Stub的實現類對象
最後別忘了註冊Service,另外通過意圖過濾器設定一個別名,以便其他程序訪問
以上操作是完成了服務提供方的代碼

同樣在stc/下的包中建立一個  Myservice.java

package com.example.aidlservicedemo;

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{

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return new MyServiceInterface.Stub() {
			
			@Override
			public void sayHello() throws RemoteException {
				Log.v("TAG", "你好,我是AIDL服務返回的數據,我來自com.example.aidlservicedemo");
			}
		};
	}

}

3.註冊

 <service android:name=".MyService">
            <intent-filter>
                <action android:name="myService" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </service>


接下來我們開始編寫服務使用者的功能

AIDLClientDemo.java

正常綁定服務,編寫ServiceConnection接口實現類
只不過實現類中onServiceConnected方法的參數IBinder service不能直接轉型
而是必須通過之前gen包中生成的Java類的Stub類中的靜態方法asInterface來使其IBinder類型轉換爲gen包中生成的那個Java類類型

1.在MainActivity.java中

佈局一個按鈕出發

package com.example.aidlclientdemo;

import com.example.aidlservicedemo.MyServiceInterface;

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.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {

	ServiceConnection conn=new ServiceConnection() {
		
		@Override
		public void onServiceDisconnected(ComponentName name) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			try{
				MyServiceInterface myService=MyServiceInterface.Stub.asInterface(service);
				myService.sayHello();
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		((Button)findViewById(R.id.btn)).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Intent intent=new Intent("myService");
				bindService(intent, conn, BIND_AUTO_CREATE);
			}
		});
	}
}
2.將AIDLServiceDemo.java的gen下的包複製到src下,刪除其中的兩個Java類(BuildConfig.java和R.java)

代碼完成

先運行AIDLServiceDemo,保持在後臺,然後在運行,否則不會得調用遠程服務獲得數據


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章