android 中activity调用远程service中的方法之 aidl的使用

服务端:只有服务,没有界面

1.编写interface文件,复制到 .aidl 文件中,并去掉其中的public 等修饰符。系统会自动在gen目录下生成对应的java文件  (对应本地调用中的接口文件)

  

2.编写service,其中内部类的自定义bind 只需要继承Stub即可。(本地调用则需要继承Bind 并实现 interface接口)

 1 public class PayService extends Service {
 2
 3     @Override
 4     public IBinder onBind(Intent intent) {
 5         return new Pay();
 6     }
 7     public class Pay extends  Stub {
 8         @Override
 9         public void pay(String userName, String password, String sendToAccount, float money) throws RemoteException {
10             toPay(userName, password, sendToAccount, money);
11         }
12     }
13     public void toPay(String userName, String password, String sendToAccount, float money){
14         System.out.println(userName + "@" + password + "  to " + sendToAccount + "$" + money);
15     }
16
17 }

3.清单文件中注册,添加intent-filter 项,以便于被调用

  <service android:name="cn.pay.service.PayService" >
            <intent-filter>
                <action android:name="cn.pay.service.PayService" />
            </intent-filter>
        </service>

========================================================分隔线========================================================

客户端:

  在activity中自定义ServiceConnection的内部类。转化接口实例的方法用 接口类名.Stub.asInterface(service)  (本地调用是直接将service强转为接口实例)

 

 1 package com.example.aidlpayclient;
 2
 3 import cn.pay.aidl.IPayService;
 4 import android.os.Bundle;
 5 import android.os.IBinder;
 6 import android.os.RemoteException;
 7 import android.app.Activity;
 8 import android.content.ComponentName;
 9 import android.content.Context;
10 import android.content.Intent;
11 import android.content.ServiceConnection;
12 import android.view.Menu;
13 import android.view.View;
14
15 public class MainActivity extends Activity {
16
17     @Override
18     protected void onCreate(Bundle savedInstanceState) {
19         super.onCreate(savedInstanceState);
20         setContentView(R.layout.activity_main);
21
22         //绑定服务
23         conn=new MyServiceConnection();
24         bindService(new Intent("cn.pay.service.PayService"), conn, Context.BIND_AUTO_CREATE);
25     }
26
27     private MyServiceConnection conn = null;
28     private IPayService iPayService;
29
30     private class MyServiceConnection implements ServiceConnection {
31
32         @Override
33         public void onServiceConnected(ComponentName name, IBinder service) {
34             iPayService = IPayService.Stub.asInterface(service);
35             System.out.println("绑定成功");
36         }
37
38         @Override
39         public void onServiceDisconnected(ComponentName name) {
40             iPayService = null;
41         }
42
43     }
44
45     public void pay(View v) {
46         System.out.println("begin pay");
47         try {
48             //调用方法.
49             iPayService.pay("a", "b", "c", 100);
50         } catch (RemoteException e) {
51             e.printStackTrace();
52         }
53         System.out.println("end pay");
54     }
55
56 }
时间: 2024-10-10 17:22:28

android 中activity调用远程service中的方法之 aidl的使用的相关文章

Android Activity与远程Service的通信学习总结

当一个Service在androidManifest中被声明为 process=":remote", 或者是还有一个应用程序中的Service时,即为远程Service, 远程的意思是和当前程序不在同一个进程中执行. Activity和远程Service的跨进程通信(IPC)通过Binder机制,使用AIDL服务实现. 一.  定义远程服务端 1.新建一个project,project文件夹例如以下 2. 文件内容 aidl传递复杂对象时,须要该对象实现Parcelable或Seria

jsp中怎么调用java类中的方法

在jsp页面中先要,引入java类 例如: <%@page import="javabean.DbConn"%><!-- 引入包中的"类" --> <!--在用到的地方,直接对类实例化--> <% DbConn  DB=new  DbConn(); %> <!--然后就可以直接调用类中的方法--> <% Connection con=DB.conn(); %> jsp中怎么调用java类中的方法

Magento中,调用静态块的几种方法[magento 二次开发]

在后台创建一个order_form静态块 Block Title :Order Form Identifier :order_form Status :Enabled Content :自定义内容 1.如果要在.phtml文件中直接调用这个静态块,那可以采用以下方法 [php] view plaincopy <?php $block = Mage::getModel('cms/block') ->setStoreId(Mage::app()->getStore()->getId()

子窗体中如何调用父窗体里的方法

有两个窗体,一个子窗体,一个父窗体,当点击父窗体中的按钮,弹出子窗体,在子窗体中添加完数据,单击确定按钮后,数据在父窗体的数据显示控件中立即显示,实现其实很简单,同时方法也很多,我是利用了一种最简单的方法. 子窗体SubForm:protected void btnOk_Click(object sender,EventArgs arg){   //插入数据的代码   if(插入数据成功)      this.DialogResult=DialogResult.Ok;} 父窗体:protecte

【安卓面试题】在一个Activity启动另一个Activity和在Service中启动一个Activity有什么区别

在Activity中可以直接使用Intent启动另一个Activity 显式Intent intent = new Intent(context, activity.class) 隐式 Intent intent = new Intent(“com.aa.www.act”); startActivity(intent); 如果从Service中用同样方法启动Activity 的话,会报错: android.util.AndroidRuntimeException: Calling startAc

Android中Activity执行restart过程中涉及到的四种数据存储恢复的方法

我们知道,当Configuration Change发生的时候(比如横竖屏切换等),会导致Activity重启,即先destroy,然后会restart,一般情况下restart的时间比较短,为了保证一致的用户体验,我们应该在Activity重启前将一些数据存储下来,然后在restart的时候重新根据这些数据更新UI.当然你可能想将这些数据写到物理文件或数据库中,但是这样有缺点,因为IO操作时耗时操作,会影响restart的过程,甚至导致ANR程序无响应,本文将介绍几种将数据缓存在内存中以便re

C代码中如何调用C++ C++中如何调用C

1. 在C++中调用C:使用extern "C"则是告诉编译器依照C的方式来编译封装接口,当然接口函数里面的C++语法还是按C++方式编译. 包装(wrapper) 2. 在C中调用C++:extern "C" 的作用是:让C++连接器找调用函数的符号时采用C的方式 注意这里的C调用C++或者C++调用C意思是.c文件中调用.cpp文件中代码,或者相反. 集成开发环境如VC++6.0或者vs都是以文件后缀来区别当前要编译的是C代码还是C++代码,然后采用响应的编译.

项目中Ajax调用ashx页面中的Function的实战

前台页面: 使用几个display=none的空间存储DropdownList中的值,点击Search Button后刷新页面再次给DropdownList赋值使用 <%@ Page Language="c#" CodeBehind="MallListCAM.aspx.cs" AutoEventWireup="True" Inherits="PRCSales_internal.Mall.MallListCAM" Enab

Magento中,调用静态块的几种方法

在后台创建一个order_form静态块Block Title :Order FormIdentifier :order_formStatus :EnabledContent :自定义内容 1.如果要在.phtml文件中直接调用这个静态块,那可以采用以下方法 [php] view plaincopy <?php $block = Mage::getModel('cms/block') ->setStoreId(Mage::app()->getStore()->getId()) -&