远程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

时间: 2024-10-11 00:49:45

远程Servie通信AIDL的相关文章

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

在Android中,Service是运行在主线程中的,如果在Service中处理一些耗时的操作,就会导致程序出现ANR. 但如果将本地的Service转换成一个远程的Service,就不会出现这样的问题了. 转换成远程Service非常简单,只需要在注册Service的时候将他的android:process的属性制定成 :remote就可以了. 重新运行项目,你会发现,不会出现ANR了. 为什么将MyService转换成远程Service后就不会导致程序ANR了呢?这是由于,使用了远程Serv

android92 aidl远程进程通信

05项目RemoteService.java package com.itheima.remoteservice; //05项目 import com.itheima.remoteservice.PublicBusiness.Stub; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; public class Remote

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

在介绍跨程序进程间通信AIDL前,先看一下本程序activity与某个服务是怎么绑定在一起进行交互的. 需求:服务有两个方法.分别是播放音乐与停止播放音乐.该程序的活动要访问这两个方法,在activity中控制服务的这两个方法,通过点击按钮的方式实现停止与播放音乐. 对同一个程序服务与活动交互的方式,先给出一张图片: 给出代码(案例为模拟音乐播放器): 一.定义一个服务类MusicService: package com.ydl.music; import android.app.Service

016_03浅谈远程Service和AIDL

 如果需要访问不同进程间service中的数据或者方法,需要使用AIDL(android interface description language)工具,可以通过如下方法: public boolean bindService(Intent intent, ServiceConnection conn, int flags) :         public void unbindService(ServiceConnection conn); intent是跳转到service的inten

Android跨进程通信AIDL服务

服务(Service)是android系统中非常重要的组件.Service可以脱离应用程序运行.也就是说,应用程序只起到一个启动Service的作用.一但Service被启动,就算应用程序关闭,Service仍然会在后台运行. android系统中的Service主要有两个作用:后台运行和跨进程通讯.后台运行就不用说了,当Service启动后,就可以在Service对象中 运行相应的业务代码,而这一切用户并不会察觉.而跨进程通讯是这一节的主题.如果想让应用程序可以跨进程通讯,就要使用我们这节讲的

Android进程间的通信之AIDL

Android服务被设计用来执行很多操作,比如说,可以执行运行时间长的耗时操作,比较耗时的网络操作,甚至是在一个单独进程中的永不会结束的操作.实现这些操作之一是通过Android接口定义语言(AIDL)来完成的.AIDL被设计用来执行进程间通信,另一种实现方式见博文Android进程间的通信之Messenger.本文我们将学习如何创建AIDL文件实现Android进程间通信.在正式学习之前,我们先澄清一些"事实". 关于Android Service 1.Android服务不是后台任务

Android:远程服务Service(含AIDL &amp; IPC讲解)

前言 Service作为Android四大组件之一,应用非常广泛 本文将介绍Service其中一种常见用法:远程Service 如果你对Service还未了解,建议先阅读我写的另外一篇文章: Android四大组件:Service史上最全面解析 目录 1. 远程服务与本地服务的区别 远程服务与本地服务最大的区别是:远程Service与调用者不在同一个进程里(即远程Service是运行在另外一个进程):而本地服务则是与调用者运行在同一个进程里 二者区别的详细区别如下图: 2. 使用场景 多个应用程

对Binder的浅显分析及AIDL的使用

通常情况下,作为一个android开发者不会直接接触到Binder,但Binder作为ipc机制最关键的一个环节,我们很有必要去了解他.其实在不知不觉中,大家肯定和Binder打过交道,比如我们bindService的时候,客户端会获取到一个远程服务器发送回来的Binder对象,通过操作这个对象我们可以获取服务端的数据或者执行某些服务端的操作.再比如,我么在获取各种系统服务的时候,Binder是作为serviceManager连接各种manager(windowManager.....)的桥梁.

大仙说道之Android studio实现Service AIDL

今天要开发过程中要用到AIDL的调用,之前用的eclipse有大量教程,用起来很方便,现在刚换了Android studio,不可否认studio真的很强大,只是很多功能还需要摸索. AIDL(Android Interface Definition Language)是Android接口定义语言的意思,它可以用于让某个Service与多个应用程序组件之间进行跨进程通信,从而可以实现多个应用程序共享同一个Service的功能. 言归正传,今天的主题是远程Service建立AIDL进行通信,通过一