前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android 四大组件学习之Service七

Android 四大组件学习之Service七

作者头像
DragonKingZhu
发布2022-05-08 16:11:16
2080
发布2022-05-08 16:11:16
举报

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

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

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

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

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

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

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

代码语言:javascript
复制
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接口了。

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

代码语言:javascript
复制
	/*中间人的支付方法*/
	class Pay extends Stub
	{
		public void PayMoney()
		{
			ZhiFuBaoPay();
		}
	}

因为第四步是和客户端相关的,我们先创建一个某游戏客户端,客户端Activity中有一个支付按钮,用于支付

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

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

代码语言:javascript
复制
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需要到配置文件中注册:

代码语言:javascript
复制
        <service android:name="com.demo.aidlservice.ZhiFuBaoService">
            <intent-filter >
                <action android:name="com.demo.paymoney"/>
            </intent-filter>
        </service>

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-07-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档