说明:我没有写实例代码,直接拿项目中的代码,有点懒了,这里我省略贴出两个aidl文件。

TtsService extends Service

  1. private final RemoteCallbackList<ITtsCallback> mCallbacks
  2. = new RemoteCallbackList<ITtsCallback>();
  1. private final android.speech.tts.ITts.Stub mBinder = new Stub() {
  2. public int registerCallback(String packageName, ITtsCallback cb) {
  3. if (cb != null) {
  4. mCallbacks.register(cb);
  5. mCallbacksMap.put(packageName, cb);
  6. return TextToSpeech.SUCCESS;
  7. }
  8. return TextToSpeech.ERROR;
  9. }
  10. public int unregisterCallback(String packageName, ITtsCallback cb) {
  11. if (cb != null) {
  12. mCallbacksMap.remove(packageName);
  13. mCallbacks.unregister(cb);
  14. return TextToSpeech.SUCCESS;
  15. }
  16. return TextToSpeech.ERROR;
  17. }
  18. public int speak(String callingApp, String text, int queueMode, String[] params) {
  19. ArrayList<String> speakingParams = new ArrayList<String>();
  20. if (params != null) {
  21. speakingParams = new ArrayList<String>(Arrays.asList(params));
  22. }
  23. return this.speak(callingApp, text, queueMode, speakingParams);
  24. }
  1. private void dispatchProcessingCompletedCallback(String packageName) {
  2. ITtsCallback cb = mCallbacksMap.get(packageName);
  3. if (cb == null){
  4. return;
  5. }
  6. //Log.i("TtsService", "TTS callback: dispatch started");
  7. // Broadcast to all clients the new value.
  8. final int N = mCallbacks.beginBroadcast();
  9. try {
  10. cb.processingCompleted();
  11. } catch (RemoteException e) {
  12. // The RemoteCallbackList will take care of removing
  13. // the dead object for us.
  14. }
  15. mCallbacks.finishBroadcast();
  16. //Log.i("TtsService", "TTS callback: dispatch completed to " + N);
  17. }
  1. @Override
  2. public void onDestroy() {
  3. super.onDestroy();
  4. // TODO replace the call to stopAll() with a method to clear absolutely all upcoming
  5. // uses of the native synth, including synthesis to a file, and delete files for which
  6. // synthesis was not complete.
  7. stopAll();
  8. // Unregister all callbacks.
  9. mCallbacks.kill();
  10. }

在activity中

  1. mITtscallback = new ITtsCallback.Stub() {
  2. public void processingCompleted() throws RemoteException {
  3. if (listener != null) {
  4. listener.onProcessingCompleted();
  5. }
  6. }
  7. };
  8. result = mITts.registerCallback(mPackageName, mITtscallback);

上面只是一个贴代码没有做任何说明,基本的意思我想大家也能通过代码来看懂。

  1. // int N = mCallbacks.beginBroadcast();
  2. // try {
  3. // for (int i = 0; i < N; i++) {
  4. // mCallbacks.getBroadcastItem(i).showResult(mSlot);
  5. // }
  6. // } catch (RemoteException e) {
  7. // Log("" + e);
  8. // }
  9. // mCallbacks.finishBroadcast();

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

上传一个写的工作中用到的demo

  1. package com.pateo.aidl;
  2. interface ICallback {
  3. void showResult(String result);
  4. }
  5. package com.pateo.aidl;
  6. import com.pateo.aidl.ICallback;
  7. interface IMyService {
  8. void init(String packageName,String slot);
  9. void registerCallback(String packageName,ICallback cb);
  10. void unregisterCallback(String packageName,ICallback cb);
  11. }
  1. package com.pateo.service;
  2. import java.util.HashMap;
  3. import android.app.Service;
  4. import android.content.Intent;
  5. import android.os.Handler;
  6. import android.os.IBinder;
  7. import android.os.Message;
  8. import android.os.RemoteCallbackList;
  9. import android.os.RemoteException;
  10. import com.pateo.aidl.ICallback;
  11. import com.pateo.aidl.IMyService;
  12. public class VuiService extends Service {
  13. private RemoteCallbackList<ICallback> mCallbacks = new RemoteCallbackList<ICallback>();
  14. private HashMap<String, ICallback> mCallbacksMap = new HashMap<String, ICallback>();
  15. private String mSlot = "";
  16. private String mPackageName = "";
  17. @Override
  18. public void onStart(Intent intent, int startId) {
  19. super.onStart(intent, startId);
  20. }
  21. @Override
  22. public IBinder onBind(Intent intent) {
  23. return remoteBinder;
  24. }
  25. @Override
  26. public void onDestroy() {
  27. mHandler.removeMessages(0);
  28. mCallbacks.kill();
  29. super.onDestroy();
  30. }
  31. @Override
  32. public boolean onUnbind(Intent intent) {
  33. return super.onUnbind(intent);
  34. }
  35. public void onRebind(Intent intent) {
  36. super.onRebind(intent);
  37. }
  38. private IMyService.Stub remoteBinder = new IMyService.Stub() {
  39. @Override
  40. public void init(String packageName,String slot) throws RemoteException {
  41. mSlot = slot;
  42. mPackageName = packageName;
  43. //Ä£Ä⿪ʌÆô¶¯Ê¶±ð£¬ÕâÀïµÄ4000ºÁÃëÏ൱ÓÚžøÓèµÄʶ±ð¹ý³ÌµÄʱŒä£¬Õâžö¿ÉÒÔÔÚʶ±ðœá¹ûÀïÃæÈ¥µ÷ÓÃ
  44. mHandler.sendEmptyMessageDelayed(0, 4000);
  45. }
  46. @Override
  47. public void unregisterCallback(String packageName, ICallback cb) {
  48. if (cb != null) {
  49. mCallbacks.unregister(cb);
  50. mCallbacksMap.remove(packageName);
  51. }
  52. }
  53. //°üÃû×¢²áµÄ·œÊœ£¬ÕâÑùŸÍ±ÜÃâÁ˺ܶàÓŠÓÃ×¢²á¶ŒÈ¥»Øµ÷£¬ÕâÀïÍš¹ýÓŠÓÞøÓèµÄpackageNameÀŽÆ¥ÅäŸßÌ廨µ÷ÄÄÒ»žöÓŠÓõÄcallback
  54. @Override
  55. public void registerCallback(String packageName, ICallback cb) {
  56. if (cb != null) {
  57. mCallbacks.register(cb);
  58. mCallbacksMap.put(packageName, cb);
  59. }
  60. }
  61. };
  62. //ÕâÀïÍš¹ýÓŠÓÞøÓèµÄpackageNameÀŽÆ¥ÅäŸßÌ廨µ÷ÄÄÒ»žöÓŠÓõÄcallback
  63. private void dispatchProcessingCompletedCallback() {
  64. ICallback cb = mCallbacksMap.get(mPackageName);
  65. if (cb == null){
  66. return;
  67. }
  68. final int N = mCallbacks.beginBroadcast();
  69. try {
  70. cb.showResult(mSlot);
  71. } catch (RemoteException e) {
  72. }
  73. mCallbacks.finishBroadcast();
  74. }
  75. private Handler mHandler = new Handler() {
  76. @Override
  77. public void handleMessage(Message msg) {
  78. dispatchProcessingCompletedCallback();
  79. super.handleMessage(msg);
  80. }
  81. };
  82. }
    1. package com.pateo;
    2. import com.pateo.service.VuiService;
    3. import com.pateo.aidl.ICallback;
    4. import com.pateo.aidl.IMyService;
    5. import com.pateo.R;
    6. import android.app.Activity;
    7. import android.content.ComponentName;
    8. import android.content.Context;
    9. import android.content.Intent;
    10. import android.content.ServiceConnection;
    11. import android.os.Bundle;
    12. import android.os.Handler;
    13. import android.os.IBinder;
    14. import android.os.Message;
    15. import android.os.RemoteException;
    16. import android.view.View;
    17. import android.view.View.OnClickListener;
    18. import android.widget.Button;
    19. import android.widget.TextView;
    20. public class AppActivity extends Activity {
    21. TextView tv;
    22. IMyService myservice ;
    23. String mResult ;
    24. @Override
    25. public void onCreate(Bundle savedInstanceState) {
    26. super.onCreate(savedInstanceState);
    27. setContentView(R.layout.main);
    28. tv = (TextView) findViewById(R.id.tv);
    29. //Ä£Äâ°ŽmodeŒü
    30. Button btn =  (Button) findViewById(R.id.startBtn);
    31. btn.setOnClickListener(new OnClickListener() {
    32. @Override
    33. public void onClick(View v) {
    34. Intent intent = new Intent(AppActivity.this,VuiService.class);
    35. bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
    36. }
    37. });
    38. }
    39. private ServiceConnection serviceConnection = new ServiceConnection() {
    40. @Override
    41. public void onServiceDisconnected(ComponentName name) {
    42. myservice = null;
    43. }
    44. @Override
    45. public void onServiceConnected(ComponentName name, IBinder service) {
    46. myservice = IMyService.Stub.asInterface(service);
    47. try {
    48. if(myservice != null){
    49. myservice.registerCallback("com.pateo",mCallback);
    50. myservice.init("com.pateo","ÖØÌý|»ØžŽ");//ΪÁËÓïÒô¿òŒÜœÓÊÕµœÕâЩŽÊºó°ÑÕâÁœžöŽÊ²åÈë²å²Û£¬ÕâÑùŸÍ¿ÉÒÔ·¶Î§Ð¡Ìážßʶ±ð
    51. //ÕâÀﻹ¿ÉÒÔ×ö°ÑÒ»Œ¶ŽÊÌõÒ²·¢¹ýÈ¥£¬²åÈë²å²Û¡£
    52. }
    53. } catch (RemoteException e) {
    54. }
    55. }
    56. };
    57. /**
    58. * serviceµÄ»Øµ÷·œ·š
    59. */
    60. private ICallback.Stub mCallback = new ICallback.Stub() {
    61. //µÈŽýʶ±ðœá¹ûÈ»ºóshow³öÀŽ
    62. @Override
    63. public void showResult(String result) {
    64. try {
    65. mResult = result;
    66. Message msgget = Message.obtain();
    67. msgget.what = 1;
    68. mHandler.sendMessage(msgget);
    69. } catch (Exception e) {
    70. }
    71. }
    72. };
    73. private Handler mHandler = new Handler() {
    74. @Override
    75. public void handleMessage(Message msg) {
    76. super.handleMessage(msg);
    77. switch (msg.what) {
    78. case 1:
    79. tv.setText("result : " + mResult);
    80. break;
    81. }
    82. }
    83. };
    84. @Override
    85. protected void onDestroy() {
    86. unbindService(serviceConnection);
    87. super.onDestroy();
    88. }
    89. }

aidl 中通过RemoteCallbackList 运用到的回调机制: service回调activity的方法的更多相关文章

  1. Android开发学习之路-回调实现Service向activity传递数据

    开启服务的时候,如果我们是通过bindService来绑定服务并且要向服务传递数据,可以直接在Intent中设置bundle来达到效果,但是如果是我们需要从服务中返回一些数据到Activity中的时候 ...

  2. 【java回调】同步/异步回调机制的原理和使用方法

    回调(callback)在我们做工程过程中经常会使用到,今天想整理一下回调的原理和使用方法. 回调的原理可以简单理解为:A发送消息给B,B处理完后告诉A处理结果.再简单点就是A调用B,B调用A. 那么 ...

  3. JAVA回调机制解析

    一.回调机制概述     回调机制在JAVA代码中一直遇到,但之前不懂其原理,几乎都是绕着走.俗话说做不愿意做的事情叫做突破,故诞生了该文章,算是新年的新气象,新突破!     回调机制是什么?其实回 ...

  4. java模板和回调机制学习总结

    最近看spring的JDBCTemplete的模板方式调用时,对模板和回调产生了浓厚兴趣,查询了一些资料,做一些总结. 回调函数: 所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个 ...

  5. 《编程导论(Java)·9.3.1回调·3》回调的实现

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/yqj2065/article/details/31441221 接<9.3.1Java回调 · ...

  6. [译]在AngularJS中何时应该使用Directives,Controllers或者Service

    原文: http://kirkbushell.me/when-to-use-directives-controllers-or-services-in-angular/ Services Servic ...

  7. 【移动开发】AIDL中callback的实现

    AIDL实现就可以在客户端中调用服务端的方法,并传递数据到服务端,也可以服务端传递数据过来:但是如果要从服务端去调用客户端的方法,那么就需要注册callback! 抄自和源码:http://zxl-o ...

  8. js中的回调函数的理解和使用方法

    js中的回调函数的理解和使用方法 一. 回调函数的作用 js代码会至上而下一条线执行下去,但是有时候我们需要等到一个操作结束之后再进行下一个操作,这时候就需要用到回调函数. 二. 回调函数的解释 因为 ...

  9. Binder AIDL中自定义类型传递的源码分析

    binder机制实现的IPC和共享内存的方式不同,它采取的是值拷贝的方式,即进程间传递的实体遵循Parcelable协议, Bp端负责向Parcel里写东西,Bn端负责从Parcel里读取还原,顺序是 ...

随机推荐

  1. js校验表单后提交表单的三种方法总结

    第一种: 复制代码 代码如下: <script type="text/javascript">         function check(form) { if(fo ...

  2. latin1

    Latin1是ISO-8859-1的别名,有些环境下写作Latin-1.ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII ...

  3. tableView左滑删除功能

    实现三个代理方法即可 -(NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtI ...

  4. win7打开网页老是提示下载网页解决办法

    方法:我的系统是windows 7 旗舰版, 解决方法可以自己手动去修复,方法是进入命令窗口. 开始--运行--cmd--sfc.exe--sfc/scannow   修复一下!

  5. WPF 检测管理员权限

    // 检查是否是管理员身份 private static void CheckAdministrator() { WindowsIdentity wi = null; try { wi = Windo ...

  6. Linux的一些基础

    想要知道你的 Linux 支持的文件系统有哪些,可以察看底下这个目录: [root@www ~]# ls -l /lib/modules/$(uname -r)/kernel/fs 系统目前已加载到内 ...

  7. sql 联合查询并更新

    update sales set sales.adminId = t.adminIdfrom (select a.adminId,a.realName from sales ,admin_admini ...

  8. C#中跨线程访问控件问题解决方案

    net 原则上禁止跨线程访问控件,因为这样可能造成错误的发生,推荐的解决方法是采用代理,用代理方法来间接操作不是同一线程创建的控件. 第二种方法是禁止编译器对跨线程访问作检查,可以实现访问,但是出不出 ...

  9. Json数据

    <title>无标题文档</title>//使用 jquery 必须的先加载 <script src="jquery-2.1.1.min.js"> ...

  10. 修改Capfile,在正式环境不再使用migration修改数据库

    原因是这样的,运维不开放正式环境数据库的alter权限,所以每次都要给他们把sql语句发过去, 由他们来操作. https://github.com/capistrano/rails Require ...