跨进程调用Service(AIDL服务)

在过去的技术中,Corba可以实现跨进程的调用;在Java技术中,RMI也可以实现跨进程的调用;在Android中类似可以使用AIDL服务跨进程调用Service。

Android的远程Service调用与Java的RMI基本相似,一样都是先定义一个远程调用接口,然后为该接口提供一个实现类即可。与RMI不同的是,客户端访问Service时,Android并不是直接返回Service对象给客户端。

在Android中绑定本地Service时,返回的是一个IBinder对象;而访问远程Service时,是将IBinder的代理返回给客户端,当客户端获得IBinder对象的代理后,就可以通过IBinder对象去回调远程Service的属性和方法了。

示例如下:

创建AIDL文件:

AIDL:指Android Interface Definition Language

注意:AIDL定义接口的源代码必须以.aidl结尾;

AIDL接口中用到的数据类型,除了基本类型、String、List 、Map、CharSequence之外,其他类型都需要导包,即使在同一包中也需导包。

在Service端和客户端都需要为该接口提供实现。使用ADT工具进行开发,会自动为AIDL接口生成实现。

这是AIDL源代码的一个简单例子:

package com.lovo.service;
interface IMessage{
	int getFlag();
	String getMessage(String msg);
}

自动生成的AIDL实现,在此不给出。


远程的Service:

package com.lovo.service;

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

public class RemoteService extends Service {

	@Override
	public IBinder onBind(Intent intent) {
		MyMessage message = new MyMessage();
		return message;
	}
}

MyMessage类(IMessage的实现类):

package com.lovo.service;

public class MyMessage extends IMessage.Stub {
	@Override
	public int getFlag() {
		return 100;
	}

	@Override
	public String getMessage(String msg) {
		return msg + "Android!";
	}
}

客户端的Activity:

package com.lovo.activity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

import com.lovo.conn.RemoteServiceConnection;
import com.lovo.lesson10.R;

public class StartRemoteActivity extends Activity {
	private Button startServiceBtn;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.remote_main);
		startServiceBtn = (Button) findViewById(R.id.remote_main_btn_startserver);
		startServiceBtn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				Intent intent = new Intent();
				intent.setAction("com.lovo.service.REMOTE_SERVICE");
				bindService(intent, new RemoteServiceConnection(),
						BIND_AUTO_CREATE);
			}
		});
	}
}


客户端的ServiceConnection的实现类(RemoteServiceConnection):

package com.lovo.conn;

import com.lovo.service.IMessage;

import android.content.ComponentName;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;

public class RemoteServiceConnection implements ServiceConnection {

	@Override
	public void onServiceConnected(ComponentName name, IBinder service) {
		// 将远程的代理对象转换成真实对象
		IMessage message = IMessage.Stub.asInterface(service);
		try {
			Log.i("访问远程方法:",
					message.getFlag() + " " + message.getMessage("I like "));
		} catch (RemoteException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void onServiceDisconnected(ComponentName name) {

	}

}

布局文件只有一个按钮在此省略不写。本文只是简单地调用了远程的方法,在实际中可以使用AIDL传递复杂数据。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Android 中实现进程调用 Toast,您需要使用 AIDL(Android 接口定义语言)来定义一个接口,该接口将允许其他应用程序与您的应用程序进行通信。然后,您可以在您的应用程序中实现此接口,并将其公开为服务。其他应用程序可以绑定到您的服务,并使用该接口调用 Toast 方法,从而在您的应用程序中显示 Toast。 以下是一个简单的示例代码: 1. 在您的应用程序中创建一个 AIDL 文件,例如 IToast.aidl,其中包含以下内容: ``` interface IToast { void showToast(String message); } ``` 2. 实现该接口并将其公开为服务: ``` public class ToastService extends Service { private final IBinder mBinder = new ToastBinder(); @Override public IBinder onBind(Intent intent) { return mBinder; } private void showToast(String message) { Toast.makeText(this, message, Toast.LENGTH_SHORT).show(); } private class ToastBinder extends IToast.Stub { @Override public void showToast(String message) { ToastService.this.showToast(message); } } } ``` 3. 在您的应用程序中启动服务: ``` Intent intent = new Intent(this, ToastService.class); startService(intent); ``` 4. 在其他应用程序中绑定到您的服务,并使用 AIDL 接口调用 showToast 方法: ``` private IToast mToastService; private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mToastService = IToast.Stub.asInterface(service); } @Override public void onServiceDisconnected(ComponentName name) { mToastService = null; } }; private void showToast(String message) { try { if (mToastService != null) { mToastService.showToast(message); } } catch (RemoteException e) { e.printStackTrace(); } } ``` 请注意,为了使此代码正常工作,您需要确保您的应用程序和其他应用程序都具有相应的权限。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值