码迷,mamicode.com
首页 > 移动开发 > 详细

Android 四大组件学习之Service七

时间:2015-07-27 19:04:45      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:service远程服务   aidl实现远程服务   

本节学习Service的分类: 本地服务, 远程服务

本地服务: 指的是服务和启动服务的activity在同一个进程中

远程服务:指的是服务和启动服务的activity不在同一个进程中


我们以前使用的都是本地服务,今天我们学习远程服务。学习远程服务就必须要学习AIDL(Android Interface Definition Language)安卓接口定义语言。编译器通过AIDL文件的描述信息生成符合通信协议的JAVA代码。我们在进程间通信的时候只需要调用即可。


既然要实现远程服务,就需要一个服务端,一个客户端。

我们实现如下一例子。 游戏支付,一般游戏支付的话都会选择第三方的平台,比如支付宝。 而支付宝的支付接口不是会放到游戏进程中运行,那么支付宝支付服务就是个远程服务。而第三方游戏就是客户端


那我们先创建一个服务端:

public class ZhiFuBaoService extends Service {

	@Override
	public IBinder onBind(Intent arg0) {
		// TODO Auto-generated method stub
		return null;
	}
	
	/*中间人的支付方法*/
	class Pay extends Binder implements ZhiFuInterface
	{
		public void PayMoney()
		{
			ZhiFuBaoPay();
		}
	}
	
	/*支付宝的支付接口*/
	public void ZhiFuBaoPay()
	{
		Log.i("ZhiFuBaoService", "支付成功!");
	}

}
如果是本地服务,我们的Service就是如上的形式,但是如果是远程服务,就必须使用AIDL接口定义语言,对上面的代码改造。

第一步: 把远程服务的方法抽取成一个单独的接口java文件,也就是我们的PayMoney方法,这个已经为接口了

第二步: 把接口java文件的后缀名改成aidl

技术分享

注意: aidl文件中的方法全是public方法,如果有public就必须去掉,不然会报错

第三步: 在自动生成的ZhiFuInterface.java文件中,有一个静态类Stub,它已经继承了binder类,实现了ZhiFuInterface接口了。

技术分享

所以我们的中间人就改为:

	/*中间人的支付方法*/
	class Pay extends Stub
	{
		public void PayMoney()
		{
			ZhiFuBaoPay();
		}
	}
因为第四步是和客户端相关的,我们先创建一个某游戏客户端,客户端Activity中有一个支付按钮,用于支付

第四步: 把aidl文件复制粘贴到客户端项目,粘贴的时候注意,aidl文件所在的包名必须跟服务端项目中aidl所在的包名一致

技术分享

第五步: 在客户端项目中,强转中间人对象时,直接使用Stub.asInterface()

public class MainActivity extends Activity {

	private MyServiceConn conn;
	private Intent intent;
	ZhiFuInterface zhifu;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        intent = new Intent();
        conn = new MyServiceConn();
        //设置服务的action
        intent.setAction("com.demo.paymoney");
        //绑定远程服务
        bindService(intent, conn, BIND_AUTO_CREATE);
    }
    
    //支付游戏道具
    public void pay(View v)
    {
    	try {
			zhifu.PayMoney();
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
    
    class MyServiceConn implements ServiceConnection
    {

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

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

记得服务端的Service需要到配置文件中注册:

        <service android:name="com.demo.aidlservice.ZhiFuBaoService">
            <intent-filter >
                <action android:name="com.demo.paymoney"/>
            </intent-filter>
        </service>

一下是运行情况,当你点击支付时,会有如下打印:

技术分享

ok。 关于远程服务就说到这里



版权声明:本文为博主原创文章,未经博主允许不得转载。

Android 四大组件学习之Service七

标签:service远程服务   aidl实现远程服务   

原文地址:http://blog.csdn.net/longwang155069/article/details/47086023

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!