说明:我没有写实例代码,直接拿项目中的代码,有点懒了,这里我省略贴出两个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. 浏览器的中的 XMLHttpRequest 对象的使用

    使用XMLHttpRequest浏览器对象(IE5.IE6中是ActiveXObject对象)可以实现异步请求,Ajax就是以此为基础进行的封装. 1.同步与异步: <script type=& ...

  2. Facebook内部高效工作PPT指南

    Facebook内部高效工作PPT指南 Facebook 内部分享:不论你如何富有,你都赚不到更多的时间,你也回不到过去.没有那么多的假如,只有指针滴答的时光飞逝和你应该好好把握的现在,以下25张PP ...

  3. dedecms首页调用栏目内容和单页内容的方法

    常用的需要调到首页来的单页内容,比如企业简介.联系我们等等内容,我们在首页可能都要进行体现.通过常规的方式,包括查阅dede官方论坛资料,都找不到比较合适的答案.今天我们就提供两种方式进行调用. 我们 ...

  4. IDS IPS WAF之安全剖析

    现在市场上的主流网络安全产品可以分为以下几个大类: 1.基础防火墙类,主要是可实现基本包过滤策略的防火墙,这类是有硬件处理.软件处理等,其主要功能实现是限制对IP:port的访问.基本上的实现都是默认 ...

  5. 转15个必须知道的chrome开发者技巧GIF

    在Web开发者中,Google Chrome是使用最广泛的浏览器.六周一次的发布周期和一套强大的不断扩大开发功能,使其成为了web开发者必备的工具.你可能已经熟悉了它的部分功能,如使用console和 ...

  6. 容易被忽略的CSS特性

    CSS初学感觉很简单,但随着学习的深入才感觉CSS的水由多深,平常总会遇到各种坑,先总结一些经常遇到的坑 大小写不敏感 虽然我们平时在写CSS的时候都是用小写,但其实CSS并不是大小写敏感的 .tes ...

  7. .net中SessionState相关配置

      web.config关于sessionState节点的配置方案,sessionState有四种模式:off,inProc,StateServer,SqlServer. 1.off模式 从字面上就可 ...

  8. SSRS匿名访问

    ---本人数据库是SqlServer2008 R2 匿名访问Reporting Service 2008 我想通过访问Url的方式,把部署到Sql Server  Reporting Service ...

  9. upc.2219: A^X mod P(打表 && 超越快速幂(in some ways))

    2219: A^X mod P Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 417  Solved: 68 [Submit][Status][Web ...

  10. ADF成长记1--认识ADF

    2014-07-08 近段时间由于公司项目需要,开始接触Oracle ADF.都说有事没事,上百度,但是对于IT技术而言,上百度还真是不一定好使,至于谷歌嘛,很不巧的进不去了.不过网上ADF的资料当真 ...