一、远程服务主要代码

1.IService.aidl

  1. package com.shz.remoteservice;
  2.  
  3. interface IService {
  4. String getTicketInfoById(int id);
  5. }

编译aidl文件自动生成的IService.java文件(存在于gen目录下)

  1. /*
  2. * This file is auto-generated. DO NOT MODIFY.
  3. * Original file: E:\\Code\\Java\\远程服务\\src\\com\\shz\\remoteservice\\IService.aidl
  4. */
  5. package com.shz.remoteservice;
  6. public interface IService extends android.os.IInterface
  7. {
  8. /** Local-side IPC implementation stub class. */
  9. public static abstract class Stub extends android.os.Binder implements com.shz.remoteservice.IService
  10. {
  11. private static final java.lang.String DESCRIPTOR = "com.shz.remoteservice.IService";
  12. /** Construct the stub at attach it to the interface. */
  13. public Stub()
  14. {
  15. this.attachInterface(this, DESCRIPTOR);
  16. }
  17. /**
  18. * Cast an IBinder object into an com.shz.remoteservice.IService interface,
  19. * generating a proxy if needed.
  20. */
  21. public static com.shz.remoteservice.IService asInterface(android.os.IBinder obj)
  22. {
  23. if ((obj==null)) {
  24. return null;
  25. }
  26. android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
  27. if (((iin!=null)&&(iin instanceof com.shz.remoteservice.IService))) {
  28. return ((com.shz.remoteservice.IService)iin);
  29. }
  30. return new com.shz.remoteservice.IService.Stub.Proxy(obj);
  31. }
  32. @Override public android.os.IBinder asBinder()
  33. {
  34. return this;
  35. }
  36. @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
  37. {
  38. switch (code)
  39. {
  40. case INTERFACE_TRANSACTION:
  41. {
  42. reply.writeString(DESCRIPTOR);
  43. return true;
  44. }
  45. case TRANSACTION_getTicketInfoById:
  46. {
  47. data.enforceInterface(DESCRIPTOR);
  48. int _arg0;
  49. _arg0 = data.readInt();
  50. java.lang.String _result = this.getTicketInfoById(_arg0);
  51. reply.writeNoException();
  52. reply.writeString(_result);
  53. return true;
  54. }
  55. }
  56. return super.onTransact(code, data, reply, flags);
  57. }
  58. private static class Proxy implements com.shz.remoteservice.IService
  59. {
  60. private android.os.IBinder mRemote;
  61. Proxy(android.os.IBinder remote)
  62. {
  63. mRemote = remote;
  64. }
  65. @Override public android.os.IBinder asBinder()
  66. {
  67. return mRemote;
  68. }
  69. public java.lang.String getInterfaceDescriptor()
  70. {
  71. return DESCRIPTOR;
  72. }
  73. @Override public java.lang.String getTicketInfoById(int id) throws android.os.RemoteException
  74. {
  75. android.os.Parcel _data = android.os.Parcel.obtain();
  76. android.os.Parcel _reply = android.os.Parcel.obtain();
  77. java.lang.String _result;
  78. try {
  79. _data.writeInterfaceToken(DESCRIPTOR);
  80. _data.writeInt(id);
  81. mRemote.transact(Stub.TRANSACTION_getTicketInfoById, _data, _reply, 0);
  82. _reply.readException();
  83. _result = _reply.readString();
  84. }
  85. finally {
  86. _reply.recycle();
  87. _data.recycle();
  88. }
  89. return _result;
  90. }
  91. }
  92. static final int TRANSACTION_getTicketInfoById = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
  93. }
  94. public java.lang.String getTicketInfoById(int id) throws android.os.RemoteException;
  95. }

2.TicketService.java

  1. package com.shz.remoteservice;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. import android.app.Service;
  7. import android.content.Intent;
  8. import android.os.Binder;
  9. import android.os.IBinder;
  10. import android.util.Log;
  11.  
  12. /**
  13. * 后台服务(组件),提供查询电影票相关信息
  14. * @author SHZ
  15. *
  16. */
  17. public class TicketService extends Service {
  18.  
  19. private final static String TAG = "TicketService";
  20. private List<Ticket> tickets;
  21.  
  22. @Override
  23. public IBinder onBind(Intent intent) {
  24. Log.i(TAG, "onBind 服务绑定成功");
  25. // 2.Activity绑定服务成功之后,服务返回给Activity一个IBinder类型的对象,
  26. // 通过该对象,Activity就可以和服务进行交互了,就像一个代理一样
  27. return new TicketBinder();
  28. }
  29.  
  30. @Override
  31. public void onCreate() {
  32. super.onCreate();
  33. Log.i(TAG, "onCreate 服务创建成功");
  34. this.tickets = new ArrayList<Ticket>();
  35. this.tickets.add(new Ticket(1, "变形金刚4", 103));
  36. this.tickets.add(new Ticket(2, "窃听风云3", 86));
  37. this.tickets.add(new Ticket(3, "反腐风暴", 75));
  38. }
  39.  
  40. @Override
  41. public void onStart(Intent intent, int startId) {
  42. Log.i(TAG, "onStart 服务启动");
  43. super.onStart(intent, startId);
  44. }
  45.  
  46. @Override
  47. public int onStartCommand(Intent intent, int flags, int startId) {
  48. Log.i(TAG, "onStartCommand 服务启动");
  49. return super.onStartCommand(intent, flags, startId);
  50. }
  51.  
  52. @Override
  53. public boolean onUnbind(Intent intent) {
  54. Log.i(TAG, "onUnbind 服务解绑成功");
  55. return super.onUnbind(intent);
  56. }
  57.  
  58. @Override
  59. public void onDestroy() {
  60. super.onDestroy();
  61. Log.i(TAG, "onDestroy 服务销毁成功");
  62. }
  63.  
  64. private Ticket getTicket(int id)
  65. {
  66. for(Ticket ticket:this.tickets)
  67. {
  68. if(ticket.Id == id)
  69. {
  70. return ticket;
  71. }
  72. }
  73.  
  74. return null;
  75. }
  76.  
  77. /**
  78. * 服务内部方法:查询电影票信息
  79. * @param id
  80. * @return
  81. */
  82. public String getTicketInfo(int id)
  83. {
  84. Ticket ticket = this.getTicket(id);
  85. if(ticket == null)
  86. {
  87. return "未查询到该电影票信息";
  88. }
  89. else
  90. {
  91. return ticket.toString();
  92. }
  93. }
  94.  
  95. /**
  96. * 服务内部方法(测试用,没有意义):更新电影票价格
  97. * @param id
  98. * @param newPrice
  99. */
  100. public void updateTicketPrice(int id, float newPrice)
  101. {
  102. Ticket ticket = this.getTicket(id);
  103. if(ticket != null)
  104. {
  105. ticket.Price = newPrice;
  106. }
  107. }
  108.  
  109. /**
  110. * 自定义一个代理类,继承Binder并实现IService接口。
  111. * 服务会返回该类的一个实例给调用者,调用者可通过该实例调用相应的类方法
  112. * @author SHZ
  113. *
  114. */
  115. private class TicketBinder extends IService.Stub
  116. {
  117. /**
  118. * 实现IService接口中的方法,调用服务内部的方法,这样调用服务的Activity就可以获取电影票信息了
  119. */
  120. @Override
  121. public String getTicketInfoById(int id) {
  122. return getTicketInfo(id);
  123. }
  124.  
  125. /**
  126. * 由于该方法并未在IService接口中定义,故调用者无法使用该方法
  127. * @param id
  128. * @param newPrice
  129. */
  130. public void updateTicketPrice(int id,float newPrice)
  131. {
  132. updateTicketPrice(id, newPrice);
  133. }
  134.  
  135. }
  136.  
  137. }

3.Ticket.java(实体类)

  1. package com.shz.remoteservice;
  2.  
  3. public class Ticket {
  4. public int Id;
  5. public String Name;
  6. public float Price;
  7.  
  8. public Ticket(int id, String name, float price) {
  9. Id = id;
  10. Name = name;
  11. Price = price;
  12. }
  13.  
  14. @Override
  15. public String toString() {
  16. return "您查询的电影是:"+this.Name+",票价为:"+this.Price;
  17. }
  18. }

4.清单配置文件AndroidManifest.xml

  1. <service android:name="com.shz.remoteservice.TicketService">
  2. <intent-filter>
  3. <!-- 如果用于远程服务,则需指定action -->
  4. <action android:name="com.shz.TICKETSERVICE"/>
  5. </intent-filter>
  6. </service>

二、调用远程服务的代码

1.把远程服务工程里面的IService.aidl文件(包括包名)拷贝到调用者的工程中

2.调用代码

  1. package com.shz.callremoteservice;
  2.  
  3. import android.app.Activity;
  4. import android.content.ComponentName;
  5. import android.content.Intent;
  6. import android.content.ServiceConnection;
  7. import android.os.Bundle;
  8. import android.os.IBinder;
  9. import android.os.RemoteException;
  10. import android.text.TextUtils;
  11. import android.view.View;
  12. import android.widget.EditText;
  13. import android.widget.TextView;
  14. import android.widget.Toast;
  15.  
  16. import com.shz.remoteservice.IService;
  17.  
  18. public class MainActivity extends Activity {
  19.  
  20. private TicketServiceConnection conn;
  21. private IService ticketBinder;
  22. private EditText txtTicketId;
  23. private TextView lblTicketInfo;
  24.  
  25. @Override
  26. protected void onCreate(Bundle savedInstanceState) {
  27. super.onCreate(savedInstanceState);
  28. setContentView(R.layout.activity_main);
  29.  
  30. txtTicketId = (EditText) findViewById(R.id.txtTicketId);
  31. lblTicketInfo = (TextView) findViewById(R.id.lblTicketInfo);
  32.  
  33. }
  34.  
  35. private class TicketServiceConnection implements ServiceConnection
  36. {
  37.  
  38. @Override
  39. public void onServiceConnected(ComponentName name, IBinder service) {
  40. // 2.绑定服务成功之后,后台服务会返回IBinder类型的 service 对象,通过该对象可以间接调用后台服务的方法
  41. ticketBinder = IService.Stub.asInterface(service);
  42. }
  43.  
  44. @Override
  45. public void onServiceDisconnected(ComponentName name) {
  46.  
  47. }
  48.  
  49. }
  50.  
  51. /**
  52. * 绑定服务
  53. * @param view
  54. */
  55. public void bindService(View view) {
  56. Intent service = new Intent();
  57. service.setAction("com.shz.TICKETSERVICE"); // 通过action指定要调用的服务
  58. // 1.绑定服务
  59. // service:服务意图
  60. // new TicketServiceConnection():与后台服务连接的对象,接收后台服务信息
  61. // BIND_AUTO_CREATE:如果服务没有被创建,则自动创建并绑定
  62. conn = new TicketServiceConnection();
  63. bindService(service, conn, BIND_AUTO_CREATE);
  64. }
  65.  
  66. @Override
  67. protected void onDestroy() {
  68. try {
  69. unbindService(conn);
  70. } catch (Exception e) {
  71. }
  72. super.onDestroy();
  73. }
  74.  
  75. public void callServiceMethod(View view) {
  76. if(this.ticketBinder == null)
  77. {
  78. Toast.makeText(this, "请先绑定服务", 1).show();
  79. }
  80. else
  81. {
  82. String strTicketId = this.txtTicketId.getText().toString().trim();
  83. if(TextUtils.isEmpty(strTicketId))
  84. {
  85. Toast.makeText(this, "请输入电影票Id", 1).show();
  86. return;
  87. }
  88.  
  89. try {
  90. // 3.调用IBinder对象的方法
  91. String ticketInfo = this.ticketBinder.getTicketInfoById(Integer.parseInt(strTicketId));
  92. this.lblTicketInfo.setText(ticketInfo);
  93. } catch (NumberFormatException e) {
  94. e.printStackTrace();
  95. } catch (RemoteException e) {
  96. e.printStackTrace();
  97. }
  98. }
  99. }
  100.  
  101. }

3.前台UI布局代码

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:id="@+id/container"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:orientation="vertical"
  7. tools:context="com.shz.localservice.MainActivity"
  8. tools:ignore="MergeRootFrame" >
  9.  
  10. <Button
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"
  13. android:onClick="bindService"
  14. android:text="绑定服务" />
  15.  
  16. <EditText
  17. android:layout_width="match_parent"
  18. android:layout_height="wrap_content"
  19. android:hint="请输入电影票Id"
  20. android:id="@+id/txtTicketId"/>
  21. <Button
  22. android:layout_width="wrap_content"
  23. android:layout_height="wrap_content"
  24. android:onClick="callServiceMethod"
  25. android:text="查询" />
  26.  
  27. <TextView
  28. android:layout_width="match_parent"
  29. android:layout_height="wrap_content"
  30. android:id="@+id/lblTicketInfo"
  31. android:textColor="#ff0000"/>
  32.  
  33. </LinearLayout>

调用服务前必须先绑定服务(当然了,远程服务必须首先启动起来)

调用结果截图:

Android远程服务的更多相关文章

  1. Android远程服务AIDL开发过程中容易遇见的两个问题

    问题 一 JavaBinder: Uncaught remote exception! (Exceptions are not yet supported across processes.) jav ...

  2. Android远程服务(AIDL)实现步骤

    AIDL是安卓接口定义语言的缩写 由于笔者使用的是android studio所以建立AIDL文件的位置也需要注意,要在APPNAME->main->aidl->packagenam ...

  3. Android中利用AIDL机制调用远程服务

    服务端: //CalculateInterface.aidl package com.itheima.aidl.calculate; interface CalculateInterface { do ...

  4. Android 中的AIDL,Parcelable和远程服务

    Android 中的AIDL,Parcelable和远程服务      早期在学习期间便接触到AIDL,当时对此的运用也是一撇而过.只到近日在项目中接触到AIDL,才开始仔细深入.AIDL的作用    ...

  5. android Service Activity交互之传递复杂数据类型的远程服务

    远程服务往往不只是传递java基本数据类型.这时需要注意android的一些限制和规定: android支持String和CharSequence 如果需要在aidl中使用其他aidl接口类型,需要i ...

  6. Android(java)学习笔记233: 远程服务的应用场景(移动支付案例)

    一. 移动支付:       用户需要在移动终端提交账号.密码以及金额等数据 到 远端服务器.然后远端服务器匹配这些信息,进行逻辑判断,进而完成交易,返回交易成功或失败的信息给移动终端.用户提交账号. ...

  7. Android学习笔记--远程服务的使用

    1.AIDL和Binder Android系统四大组件Activity, Content Provider, Broadcast和Service均可以进行跨进程数据传输. Activity可以隐式调用 ...

  8. [android] 采用aidl绑定远程服务

    aidl:android interface definition language 安卓接口定义语言 在两个不同的应用程序里面使用同一个接口 使用场景:调用支付宝服务进行支付 先写远程服务端Seri ...

  9. Android -- service的开启方式, start开启和绑定开启服务,调用服务的的方法, aidl调用远程服务

    1. 概述 bindService() 绑定服务  可以得到服务的代理人对象,间接调用服务里面的方法. 绑定服务: 间接调用服务里面的方法.           如果调用者activity被销毁了, ...

随机推荐

  1. 原创:四种Linux系统开机启动项优命令超给力超详细详解

    老葵花哥哥又开课了 接下来是你们的齐天大圣孙悟空给你们带来的详细版Linux系统开机启动优化四种命令 第一种方法是很正常的 第二种有点难理解 第三种来自我的一个奇思妙想 本文档秉承 不要钱也不要臀部的 ...

  2. Gym - 100676G Training Camp (状压dp)

    G. Training Camp[ Color: Yellow ]Montaser is planning to train very hard for ACM JCPC 2015; he has p ...

  3. Python3简明教程(九)—— 文件处理

    文件是保存在计算机存储设备上的一些信息或数据.你已经知道了一些不同的文件类型,比如你的音乐文件,视频文件,文本文件.Linux 有一个思想是“一切皆文件”,这在实验最后的 lscpu 的实现中得到了体 ...

  4. axios 里面 then 默认写的function里面没有this,改成箭头函数后就可以用this了

    ,methods:{ loadJson:function(){ //this.jsonTest = "jjj" this.$http.get('http://localhost:3 ...

  5. 激活函数:Swish: a Self-Gated Activation Function

    今天看到google brain 关于激活函数在2017年提出了一个新的Swish 激活函数. 叫swish,地址:https://arxiv.org/abs/1710.05941v1 pytorch ...

  6. windwos .bat脚本大全

    记录一个很有用比较全面的windows .bat脚本网站 https://www.cnblogs.com/zhaoqingqing/p/4620402.html

  7. DNS查询过程

    DNS查询过程 假设www.abc.com的主机要查询www.xyz.abc.com的服务器ip地址. 知识点 1.hosts文件:以静态映射的方式提供IP地址与主机名的对照表,类似ARP表 2.域: ...

  8. LayuiAdmin退出模块报错解决

    将layuiAdmin/src/controller目录下的common.js中 logout方法的url中logout.js的路径修改为自己目录的路径: 我这里修改为绝对路径:

  9. 02numpy

    一. Numpy定义 一个在Python中做科学计算的基础库,重在数值计算,也是大部分PYTHON科学计算库的基础库,多用于在大型.多维数组上执行数值运算 二. Numpy使用 1.创建数组 2.nu ...

  10. 【2018 CCPC网络赛】1003 - 费马小定理

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6440 这题主要是理解题意: 题意:定义一个加法和乘法,使得 (m+n)p = mp+np; 其中给定 ...