远程Servie通信AIDL
不可以直接通过binder了。
1、先编写一个aidl文件,里边包含我们要通信的方法。(Android studio 有直接新建AIDL选项)
interface myInterface {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
double aDouble, String aString);
//sayHello
String sayHello(String name);
}
编译器会帮我们生成相应的java文件,不过现在在AS里面看不到。
接口中的抽象内部类Stub继承android.os.Binder类并实现myInterface接口,比较重要的方法是asInterface(IBinder)方法,该方法会将IBinder类型的对象转换成myInterface类型。
使用的时候我们只要定义好接口,再使用自动生成的Stub类即可。
2、实现Service
public class MyService extends Service{
//实现Stub类,其实就是之前的自定义Binder
myInterface.Stub stub = new myInterface.Stub(){
@Override
public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {
}
//重写adil文件的通信方法
@Override
public String sayHello(String name) throws RemoteException {
//Toast.makeText(MyService.this,"hello"+","+name,Toast.LENGTH_SHORT).show();
//Toast只能在UI线程
return "hello"+","+name;
}
};
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.d("TAG","onBind");
//返回自定义的binder
return stub;
}
@Override
public void onCreate() {
super.onCreate();
Log.d("TAG","onCreate");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("TAG","onDestory");
}
}
manifest.xml
<service android:name=".MyService"
android:process=":remote">
<intent-filter>
<action android:name="android.intent.action.MyService" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</service>
3、Activity
这跟之前不一样,不需要binder而是要一个接口的引用,绑定之后会将Service返回的binder转换为一个接口的实例。同样,需要自己实现ServiceConnection。
public class MainActivity extends AppCompatActivity {
//这里用的是接口哦
private myInterface myinterface;
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
//将服务的stub(Binder)实例化我们的接口
myinterface = myInterface.Stub.asInterface(iBinder);
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
};
//两个按钮
Button hello,bind;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bind = (Button)findViewById(R.id.bind);
hello = (Button)findViewById(R.id.say);
bind.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//绑定
Intent intent = new Intent(MainActivity.this,MyService.class);
startService(intent);
bindService(intent,conn,BIND_AUTO_CREATE);
}
});
hello.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
//通信,在UI线程Toast
String temp = myinterface.sayHello("小明");
Toast.makeText(MainActivity.this,temp,Toast.LENGTH_SHORT).show();
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
}
}
没做特别说明的话,Service和Activity我猜测是运行在同一进程的同一线程中的,并且还是UI线程。因为可以在Service里面直接Toast。定义了远程Service后,他们就运行在不不同的进程中了,可以自己写一个sleep在service里面看看app有没有卡死来验证。还想用Toast的话,就要用消息队列了,发消息到UI线程里面来Toast
远程Servie通信AIDL的更多相关文章
- 远程kafka通信实例,各种bug解决----虚拟机+本地电脑
为了实现远程kafka通信,我可谓是呕心沥血.期间各种bug各种调,太煎熬了 (T.T) 介绍: 我用一台虚拟机作为远程消息的发送方,用本地电脑主机作为消息的接收方 虚拟机:安装java,kafka, ...
- android92 aidl远程进程通信
05项目RemoteService.java package com.itheima.remoteservice; //05项目 import com.itheima.remoteservice.Pu ...
- android 远程Service以及AIDL的跨进程通信
在Android中,Service是运行在主线程中的,如果在Service中处理一些耗时的操作,就会导致程序出现ANR. 但如果将本地的Service转换成一个远程的Service,就不会出现这样的问 ...
- Android初级教程进程间的通信AIDL
在介绍跨程序进程间通信AIDL前,先看一下本程序activity与某个服务是怎么绑定在一起进行交互的. 需求:服务有两个方法.分别是播放音乐与停止播放音乐.该程序的活动要访问这两个方法,在activi ...
- 一个简单的demo学习Android远程Service(AIDL的使用)
这是milo很早之前写在论坛上的一个帖子,现在整理出来,milo也复习一下一般来说Android 的四大组件都是运行在同一个进程中的,但远程Service运行在不同的进程里.这进程间的通信是使用了An ...
- Android——进程通信/ AIDL/Message相关知识总结贴
Android多进程通信 http://www.apkbus.com/android-83462-1-1.html Android 跨进程通信(一) http://www.apkbus.com/and ...
- 进程之间的通信AIDL
远程端: package cn.itcast.aidl; //AIDL //首先建立AIDL文件,有点和接口类似,建立好AIDL文件后, //会在gen文件夹下自动生成用于远程通信的类 //文件的后缀 ...
- Android跨进程通信AIDL服务
服务(Service)是android系统中非常重要的组件.Service可以脱离应用程序运行.也就是说,应用程序只起到一个启动Service的作用.一但Service被启动,就算应用程序关闭,Ser ...
- ng $http 和远程服务器通信的一个服务。
$http({url:'',method:''}).success().error() 简洁写法:$http.get()$http.post()... 注意事项:①要求返回的数据格式是json格式②在 ...
随机推荐
- Python源码分析(二) - List对象
python中的高级特性之一就是内置了list,dict等.今天就先围绕列表(List)进行源码分析. Python中的List对象(PyListObject) Python中的的PyListObje ...
- SimpliciTI无线开发 — 快速搭建低功耗、低成本无线传感器网络
一.初闻SimpliciTI SimpliciTI是TI在2007年宣布推出的针对小型简单RF网络的专有低功耗协议,因其简化了具体的实施操作,降低对微控制器资源的占用,故基于SimpliciTI的RF ...
- 使用python处理selenium中的窗口切换问题
# 获取当前页面的句柄 ch = self.driver.current_window_handle # 获取所有句柄 ah = self.driver.window_handles # 切换句柄 s ...
- git 第一次提交至仓库
可以打开Idea 的 terminal直接进行命令操作 1.git init 2.git add src(这个src意思是添加src目录下的所有文件,有些会说add .. 那就是提交工程下的所有 ...
- MSDN中回调函数的讲解及其C#例子:用委托实现回调函数
转自:http://blog.csdn.net/sizheng0320/article/details/1615777 ms-help://MS.MSDNQTR.2003FEB.2052/cpguid ...
- ldo的一些参数理解
psrr是衡量ldo抑制外来信号噪声的能力,而内部噪声是由基准电压和误差放大器引入的.通常器件手册说的输出噪声指的就是内部噪声. ldo的暂态响应也是一个重要指标
- C#通过StreamWriter对象实现把数值内容写到记事本
本文介绍下,用C#实现将数组内容写到txt文件中的一例代码,有需要的朋友,参考下吧. 代码示例:StreamWriter sw=new StreamWriter("F:\\ex.txt&qu ...
- [MEF]第02篇 MEF的导入导出契约
一.演示概述此演示介绍了如何为Export指定导出的协议名和类型,以及如何为Import指定导入的协议名和类型,只有确保导出和导入的协议名和类型相匹配了,才能注入成功,否则注入就会失败.相关下载(屏幕 ...
- 【Oracle】OGG单向复制配置
实验环境: 源端: Ip:192.168.40.10 DataBase:Oracle 11.2.0.1.0 ORCL OS:OEL5.6 OGG:fbo_ggs_Linux_x86_ora11g_32 ...
- Metaweblog博客分发体验
在8月份OpenLiveWriter 这篇文章使用博客客户端撰写做了metaweblog的个人服务,支持通过OpenLiveWriter发博客到本站(OurJS),然后再分发到其他博客平台(目前就os ...