在Android应用程序开发中,可能会遇到跨进程回调问题,比如,调用一个服务,但服务是异步的,服务完成后,需要给客户一个通知,这时就需要用到跨进程回调了。跨进程回调本质上用到了Binder机制,其过程如下:

1.定义aidl

ITest.aidl

package com.example.chirpdemo;
import com.example.chirpdemo.ITestListener;interface ITest {
int getValue();
void setValue(int value);
void listen(ITestListener listener);
}

ITestListener.aidl

package com.example.chirpdemo;interface ITestListener {
void onFinished(int result);
}

2.Service定义如下:

package com.example.chirpdemo;import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;public class MyService extends Service {final private static String TAG = "MyService";public class ServiceImpl extends ITest.Stub {private int mValue;private ITestListener mListener;public ServiceImpl() {mValue = 0;}@Overridepublic int getValue() throws RemoteException {return mValue;}@Overridepublic void setValue(int value) throws RemoteException {mValue = value;if (null != mListener) {mListener.onFinished(-1);}}@Overridepublic void listen(ITestListener listener) throws RemoteException {mListener = listener;}}@Overridepublic void onCreate() {Log.d(TAG, "onCreate");super.onCreate();}@Overridepublic void onDestroy() {Log.d(TAG, "onDestroy");super.onDestroy();}@Overridepublic void onStart(Intent intent, int startId) {Log.d(TAG, "onStart");super.onStart(intent, startId);}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.d(TAG, "onStartCommand");return super.onStartCommand(intent, flags, startId);}@Overridepublic boolean onUnbind(Intent intent) {Log.d(TAG, "onUnbind");return super.onUnbind(intent);}@Overridepublic void onRebind(Intent intent) {Log.d(TAG, "onRebind");super.onRebind(intent);}@Overridepublic IBinder onBind(Intent arg0) {return new ServiceImpl();}}

3.Client定义如下:

package com.example.easytabdemo;import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;import com.example.chirpdemo.ITest;
import com.example.chirpdemo.ITestListener;
import com.example.easytabdemo.SlideTabHost.TabSpec;public class MainActivity extends Activity {final private static String TAG = "MainActivity";final Intent myIntent = new Intent("com.pyk.les.IlongExistService");private boolean startedService = false;private ITest leservice = null;ServiceConnection myServiceConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {leservice = ITest.Stub.asInterface(service);try {leservice.listen(new ITestListener.Stub() {@Overridepublic void onFinished(int result) throws RemoteException {}});} catch (RemoteException e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Overridepublic void onServiceDisconnected(ComponentName name) {leservice = null;Log.i("aaaaaaaaaaaa", "onDisconnected:" + Thread.currentThread());}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);startedService = bindService(new Intent("com.my.IService"),myServiceConnection, BIND_AUTO_CREATE);Log.i("aaaaaaaaaaaa", "bindService:" + Thread.currentThread());Button bt = (Button)this.findViewById(R.id.bt1);bt.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {if ( startedService ) {if ( null != leservice ) {try {leservice.setValue(leservice.getValue() + 1);} catch (RemoteException e) {e.printStackTrace();}}}}});view.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {if ( startedService ) {if ( null != leservice ) {try {mEditText.setText(leservice.getValue() + "");} catch (RemoteException e) {e.printStackTrace();}}}}});}@Overridepublic void onStart() {super.onStart();Log.i("aaaaaaaa", "onStart");}@Overridepublic void onPause() {super.onPause();Log.i("aaaaaaaa", "onPause");}@Overridepublic void onResume() {super.onResume();Log.i("aaaaaaaa", "onResume");}@Overridepublic void onStop() {super.onStop();Log.i("aaaaaaaa", "onStop");}@Overrideprotected void onDestroy() {if (startedService) {unbindService(myServiceConnection);}Log.i(TAG, "onDestroy");super.onDestroy();}
}

在以上代码中ITestListener为跨进程回调接口

Android中的跨进程回调相关推荐

  1. Android中的跨进程通信方法实例及特点分析(二):ContentProvider

    1.ContentProvider简单介绍 在Android中有些数据(如通讯录.音频.视频文件等)是要供非常多应用程序使用的.为了更好地对外提供数据,Android系统给我们提供了Content P ...

  2. Android中的跨进程调用技术AIDL

    什么是AIDL Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信. 为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用 ...

  3. 微信小游戏直播在Android端的跨进程渲染推流实践

    本文由微信开发团队工程师"virwu"分享. 1.引言 近期,微信小游戏支持了视频号一键开播,将微信升级到最新版本,打开腾讯系小游戏(如跳一跳.欢乐斗地主等),在右上角菜单就可以看 ...

  4. Android ContentProvider支持跨进程数据共享与互斥、同步 杂谈

    在开发中,假如,A.B进程有部分信息需要同步,这个时候怎么处理呢?设想这么一个场景,有个业务复杂的Activity非常占用内存,并引发OOM,所以,想要把这个Activity放到单独进程,以保证OOM ...

  5. 小红书图片剪裁框架+微信图片选择器+超高清大图预览+图片自定义比例剪裁,支持 UI 自定义、支持跨进程回调

    YImagePicker 项目地址:yangpeixing/YImagePicker 简介: 小红书图片剪裁框架+微信图片选择器+超高清大图预览+图片自定义比例剪裁,支持 UI 自定义.支持跨进程回调 ...

  6. Android之使用AIDL时的跨进程回调—Server回调Client

    首先建立在server端建立两个aidl文件 ITaskCallback.aidl 用于存放要回调client端的方法 package com.cmcc.demo.server; interface ...

  7. Android组件化跨进程通信框架Andromeda解析

    关于组件化 随着项目结构越来越庞大,模块与模块间的边界逐渐变得不清晰,代码维护越来越困难,甚至编译速度都成为影响开发效率的瓶颈. 组件化拆分是比较常见的解决方案,一方面解决模块间的耦合关系.将通用模块 ...

  8. android中线程和进程

    当应用组件启动且没有运行其他组件时,Android系统会使用单个执行线程为应用启动新的Linux进程.默认情况下,同一应用的所有组件在主线程中运行.若某个应用组件启动且应用已存在进程,则该组件会在此进 ...

  9. Android开发之跨进程通讯-AIDL实现方法 (附源码)

    先看效果图,下面是广播和AIDL跨进程的方法 我们先创建AIDL文件定义接口方法 定义好接口方法如下图: // ITokenAidlInterface.aidl package com.example ...

最新文章

  1. java报错-找不到或无法加载主类(Error: Could not find or load main class)
  2. IOS4.x下UIWebView的显示问题
  3. java jdk windows环境 下载安装配置环境变量
  4. 使用KubeKey 离线环境部署 KubeSphere v3.0.0
  5. 1.5 编程基础之循环控制 20 球弹跳高度的计算
  6. WHMCS v8.0 bate1开心版源码
  7. Netty 基本介绍与核心组件(EventLoop、ChannelPipeline、ChannelHandler)
  8. tab键怎么关闭_C/C++应用无障碍化如何支持Tab键浏览
  9. linux的文件权限前面的东西,linux 文件权限解析
  10. hive 如何将数组转成字符串_Hive函数大全(含例子)之字符串函数(String Functions)...
  11. 网易云音乐最新免费下载音乐的方法----update2019/09/17
  12. SVG—最简单的SVG动画
  13. 前端按字母搜索相关内容
  14. 关于日记账导入-外币
  15. json与xml的相互转换
  16. 从多个Word文件中取值到Excel中,整理文件的神器,Word精灵V7.3
  17. 如何把Kotlin代码转成Java代码、把Java代码转成Kotlin代码
  18. EasyExcel操作API与示例
  19. Unity 打包图集
  20. 我是怎么看friends练口语的(转贴)

热门文章

  1. 【Python 应用篇】输出炫彩颜色字体
  2. 焦点图(轮播图)的实现及详解
  3. 举例说明儿化音的作用_儿化音的作用是什么
  4. 关闭Mac顽固的开机启动程序
  5. Pikachu靶场通关笔记--Sql Inject(SQL注入)
  6. 多模态文本分类技术_CodingPark编程公园
  7. 【调剂】浙江师范大学机械工程需要调剂部分机械类、自动化类、材料加工类等学术研究生...
  8. 榕树下 全球中文原创文学 中文社区 文学论坛
  9. 诺诺电子发票对接 php,诺诺发票:电子发票开票常见问题及答疑
  10. leetcode算法题-390.消除游戏