Android中的跨进程回调
在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中的跨进程回调相关推荐
- Android中的跨进程通信方法实例及特点分析(二):ContentProvider
1.ContentProvider简单介绍 在Android中有些数据(如通讯录.音频.视频文件等)是要供非常多应用程序使用的.为了更好地对外提供数据,Android系统给我们提供了Content P ...
- Android中的跨进程调用技术AIDL
什么是AIDL Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信. 为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用 ...
- 微信小游戏直播在Android端的跨进程渲染推流实践
本文由微信开发团队工程师"virwu"分享. 1.引言 近期,微信小游戏支持了视频号一键开播,将微信升级到最新版本,打开腾讯系小游戏(如跳一跳.欢乐斗地主等),在右上角菜单就可以看 ...
- Android ContentProvider支持跨进程数据共享与互斥、同步 杂谈
在开发中,假如,A.B进程有部分信息需要同步,这个时候怎么处理呢?设想这么一个场景,有个业务复杂的Activity非常占用内存,并引发OOM,所以,想要把这个Activity放到单独进程,以保证OOM ...
- 小红书图片剪裁框架+微信图片选择器+超高清大图预览+图片自定义比例剪裁,支持 UI 自定义、支持跨进程回调
YImagePicker 项目地址:yangpeixing/YImagePicker 简介: 小红书图片剪裁框架+微信图片选择器+超高清大图预览+图片自定义比例剪裁,支持 UI 自定义.支持跨进程回调 ...
- Android之使用AIDL时的跨进程回调—Server回调Client
首先建立在server端建立两个aidl文件 ITaskCallback.aidl 用于存放要回调client端的方法 package com.cmcc.demo.server; interface ...
- Android组件化跨进程通信框架Andromeda解析
关于组件化 随着项目结构越来越庞大,模块与模块间的边界逐渐变得不清晰,代码维护越来越困难,甚至编译速度都成为影响开发效率的瓶颈. 组件化拆分是比较常见的解决方案,一方面解决模块间的耦合关系.将通用模块 ...
- android中线程和进程
当应用组件启动且没有运行其他组件时,Android系统会使用单个执行线程为应用启动新的Linux进程.默认情况下,同一应用的所有组件在主线程中运行.若某个应用组件启动且应用已存在进程,则该组件会在此进 ...
- Android开发之跨进程通讯-AIDL实现方法 (附源码)
先看效果图,下面是广播和AIDL跨进程的方法 我们先创建AIDL文件定义接口方法 定义好接口方法如下图: // ITokenAidlInterface.aidl package com.example ...
最新文章
- java报错-找不到或无法加载主类(Error: Could not find or load main class)
- IOS4.x下UIWebView的显示问题
- java jdk windows环境 下载安装配置环境变量
- 使用KubeKey 离线环境部署 KubeSphere v3.0.0
- 1.5 编程基础之循环控制 20 球弹跳高度的计算
- WHMCS v8.0 bate1开心版源码
- Netty 基本介绍与核心组件(EventLoop、ChannelPipeline、ChannelHandler)
- tab键怎么关闭_C/C++应用无障碍化如何支持Tab键浏览
- linux的文件权限前面的东西,linux 文件权限解析
- hive 如何将数组转成字符串_Hive函数大全(含例子)之字符串函数(String Functions)...
- 网易云音乐最新免费下载音乐的方法----update2019/09/17
- SVG—最简单的SVG动画
- 前端按字母搜索相关内容
- 关于日记账导入-外币
- json与xml的相互转换
- 从多个Word文件中取值到Excel中,整理文件的神器,Word精灵V7.3
- 如何把Kotlin代码转成Java代码、把Java代码转成Kotlin代码
- EasyExcel操作API与示例
- Unity 打包图集
- 我是怎么看friends练口语的(转贴)
热门文章
- 【Python 应用篇】输出炫彩颜色字体
- 焦点图(轮播图)的实现及详解
- 举例说明儿化音的作用_儿化音的作用是什么
- 关闭Mac顽固的开机启动程序
- Pikachu靶场通关笔记--Sql Inject(SQL注入)
- 多模态文本分类技术_CodingPark编程公园
- 【调剂】浙江师范大学机械工程需要调剂部分机械类、自动化类、材料加工类等学术研究生...
- 榕树下 全球中文原创文学 中文社区 文学论坛
- 诺诺电子发票对接 php,诺诺发票:电子发票开票常见问题及答疑
- leetcode算法题-390.消除游戏