49.android利用AIDL通信

AIDL:Android的接口定义语言,接口定义语言,顾名思义,就是定义接口的语言,即利用AIDL可以定义接口。

AIDL简单地说就是进程间通信的方法,类似于Java的的中的RMI,主要用来进程之间通信的;

1.把远程服务的方法抽取成一个单独的接口的Java的文件

2.把接口的Java的文件的后缀名改成AIDL

3.在自动生成的publicbusiness.java文件中,有一个静态类抽象存根,它已经继承了粘合剂类实现了publicbusiness接口,这个类就是新的中间人。

4.把AIDL文件复制粘贴到新的项目中,粘贴的时候AIDL文件所在的包名必须和AIDL创建的时候的包名一致

5.新的项目中,强转中间人对象直接使用Stub.asInterface();

将之前创建的接口文件publicbusiness.java名字修改成publicbusiness.aidl并去掉里面的市民,因为AIDL里面的东西本身就是公开的。

publicbusiness.java是自动生产的,里面实现了中间人的方法:

public static abstract class Stub extends android.os.Binder implements com.ldw.remoteService.publicbusiness

因此在服务中不需要继承和实现一些方法,直接使用存根作为中间人对象。

中间方法定义成了这个

	class zhongjian extends Stub{
		public void diao(){
			beidiaoyong();
		}
	}

调用这个服务的应用程序需要把AIDL文件也粘贴到代码目录下,注意包名也必须一样,上面创建的publicbusiness.java在com.ldw.remoteService里面,因此调用的时候也要创建一个一样的包把AIDL放进去,里面也会生产一个publicbusiness.java

代码:

APP1:

清单文件

        <service android:name="com.ldw.remoteService.remoteService">
            <intent-filter >
                <action android:name="com.ldw.remote"/>
            </intent-filter>
        </service>

publicbusiness.aidl

package com.ldw.remoteService;

interface publicbusiness {
	void diao();
}

remoteService.java

package com.ldw.remoteService;


import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

import com.ldw.remoteService.publicbusiness.Stub;

public class remoteService extends Service {

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		System.out.println("onBind方法");
		return new zhongjian();
	}
	
	class zhongjian extends Stub{
		public void diao(){
			beidiaoyong();
		}
	}
	
	public void beidiaoyong(){
		System.out.println("beidiaoyong方法被调用");
	}
	
}

APP 2:

activity_main.xml中

<LinearLayout 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=".MainActivity" 
    android:orientation="vertical"
    >
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="调用服务的方法" 
        android:onClick="diaoyong"
        />
</LinearLayout>

MainActivity.java

package com.ldw.startservice;

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.view.View;

import com.ldw.remoteService.publicbusiness;
import com.ldw.remoteService.publicbusiness.Stub;

public class MainActivity extends Activity {

	private MyserviceConn conn;
	publicbusiness pb;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        conn = new MyserviceConn();
    }
    
    public void start(View v){
    	Intent intent = new Intent();
    	intent.setAction("com.ldw.remote");
    	startService(intent);
    }
    
    public void stop(View v){
    	Intent intent = new Intent();
    	intent.setAction("com.ldw.remote");
    	stopService(intent);
    }
    
    public void bind(View v){
    	Intent intent = new Intent();
    	intent.setAction("com.ldw.remote");
    	bindService(intent, conn, BIND_AUTO_CREATE);
    }
    
    public void unbind(View v){
    	unbindService(conn);
    }
    
    public void diaoyong(View v){
    	try {
			pb.diao();
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
    
    class MyserviceConn implements ServiceConnection{

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			// TODO Auto-generated method stub
			//吧中间人对象强转成publicbusiness
			pb = Stub.asInterface(service);
		}

		@Override
		public void onServiceDisconnected(ComponentName name) {
			// TODO Auto-generated method stub
			
		}
    	
    }
    
}

Alipay

app1创建一个service,来提供调用

Manifist.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.ldw.alipay"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.ldw.alipay.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name="com.ldw.alipay.payService">
            <intent-filter >
                <action android:name="com.ldw.pay"/>
            </intent-filter>
        </service>
    </application>

</manifest>

publicbusiness.aidl

package com.ldw.alipay;

interface publicbusiness {
	void pay();
}

MainActivity.java

package com.ldw.alipay;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
}

服务payService.java

package com.ldw.alipay;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.view.View;

import com.ldw.alipay.publicbusiness.Stub;

public class payService extends Service {

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return new zhongjian();
	}
	
	class zhongjian extends Stub{

		@Override
		public void pay() throws RemoteException {
			// TODO Auto-generated method stub
			//调用服务的pay方法
			payService.this.pay();
		}
		
	}
	
	public void pay(){
		System.out.println("pay支付");
	}

}

app2调用服务中的方法MainActivity.java

package com.ldw.usepay;

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.view.View;

import com.ldw.alipay.publicbusiness;
import com.ldw.alipay.publicbusiness.Stub;

public class MainActivity extends Activity {

	publicbusiness pb;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent = new Intent();
        intent.setAction("com.ldw.pay");
        //这次用匿名的内部类来实现
        bindService(intent, new ServiceConnection(){

			@Override
			public void onServiceConnected(ComponentName name, IBinder service) {
				// TODO Auto-generated method stub
				pb = Stub.asInterface(service);
			}

			@Override
			public void onServiceDisconnected(ComponentName name) {
				// TODO Auto-generated method stub
				
			}
        	
        }, BIND_AUTO_CREATE);
    }

    //调用远程服务的支付方法
    public void click(View v){
	   try {
		pb.pay();
	} catch (RemoteException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
    }
    
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值