不可以直接通过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的更多相关文章

  1. 远程kafka通信实例,各种bug解决----虚拟机+本地电脑

    为了实现远程kafka通信,我可谓是呕心沥血.期间各种bug各种调,太煎熬了 (T.T) 介绍: 我用一台虚拟机作为远程消息的发送方,用本地电脑主机作为消息的接收方 虚拟机:安装java,kafka, ...

  2. android92 aidl远程进程通信

    05项目RemoteService.java package com.itheima.remoteservice; //05项目 import com.itheima.remoteservice.Pu ...

  3. android 远程Service以及AIDL的跨进程通信

    在Android中,Service是运行在主线程中的,如果在Service中处理一些耗时的操作,就会导致程序出现ANR. 但如果将本地的Service转换成一个远程的Service,就不会出现这样的问 ...

  4. Android初级教程进程间的通信AIDL

    在介绍跨程序进程间通信AIDL前,先看一下本程序activity与某个服务是怎么绑定在一起进行交互的. 需求:服务有两个方法.分别是播放音乐与停止播放音乐.该程序的活动要访问这两个方法,在activi ...

  5. 一个简单的demo学习Android远程Service(AIDL的使用)

    这是milo很早之前写在论坛上的一个帖子,现在整理出来,milo也复习一下一般来说Android 的四大组件都是运行在同一个进程中的,但远程Service运行在不同的进程里.这进程间的通信是使用了An ...

  6. Android——进程通信/ AIDL/Message相关知识总结贴

    Android多进程通信 http://www.apkbus.com/android-83462-1-1.html Android 跨进程通信(一) http://www.apkbus.com/and ...

  7. 进程之间的通信AIDL

    远程端: package cn.itcast.aidl; //AIDL //首先建立AIDL文件,有点和接口类似,建立好AIDL文件后, //会在gen文件夹下自动生成用于远程通信的类 //文件的后缀 ...

  8. Android跨进程通信AIDL服务

    服务(Service)是android系统中非常重要的组件.Service可以脱离应用程序运行.也就是说,应用程序只起到一个启动Service的作用.一但Service被启动,就算应用程序关闭,Ser ...

  9. ng $http 和远程服务器通信的一个服务。

    $http({url:'',method:''}).success().error() 简洁写法:$http.get()$http.post()... 注意事项:①要求返回的数据格式是json格式②在 ...

随机推荐

  1. axios如何使用

    我们知道,vue2.0以后,vue就不再对vue-resource进行更新,而是推荐axios,而大型项目都会使用 Vuex 来管理数据,所以这篇博客将结合两者来发送请求 1.安装axios cnpm ...

  2. JPA无法删除对象【实际项目解决办法】

    并非通用, 根据自己实际情况来 不能删除前的dao方法 public void delete(CmsProjectNew bean); 可以删除后的dao方法 @Modifying @Query(&q ...

  3. docker学习(一)在centos7上安装与启动docker

    CentOS Docker 安装 1.Docker支持以下的CentOS版本: CentOS 7 (64-bit) CentOS 6.5 (64-bit) 或更高的版本 前提条件 目前,CentOS ...

  4. 一款直接时空处理分析的开源数据库---geomesa

    一款直接时空处理分析的开源数据库---geomesa,可用于交通轨迹数据存储分析等相关领域, 在分布式列数据库的基础上进行扩展,目前支持Accumulo, HBase, Cassandra, and ...

  5. drill 试用

    1. 下载 http://drill.apache.org/ 2. 启动本地模式 bin/sqlline -u jdbc:drill:zk=local 3. 查询数据 select c.r_name ...

  6. Exce信息提取

    Exce信息提取 Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Sub 信息汇总( ...

  7. 适配:px与dp转换

    public class DensityUtil { /** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */ public static int dip2px(Context con ...

  8. ubuntu64,ndk-r9 编译 ffmpeg 2.1.1的config文件

    #!/bin/bash NDK_ROOT=/home/wjh/fox/android-ndk-r9c/ PREBUILT=${NDK_ROOT}toolchains/arm-linux-android ...

  9. LWIP在STM32实现

    http://www.openedv.com/posts/list/25178.htm

  10. java web 程序---登陆验证session。提示登陆

    loigin.jsp <%@ page language="java" import="java.util.*" pageEncoding="g ...