IPC解决方案之 AIDL

android interface define language

跨进程通信前提:2个进程均已启动

1,跨进程启动Service

Intent intent = new Intent();
//OTHER_SERVICE 另一进程Service包名+ClassNameintent.setComponent(new ComponentName(OTHER_PACKAGE, OTHER_SERVICE));
startService(intent);

2,跨进程绑定Service

2.1 Service进程创建aidl

2.2 onBind返回绑定对象

 @Override
    public IBinder onBind(Intent intent) {
        return new IMyAidlInterface.Stub() {
            @Override
            public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {

            }
        };
    }

2.3 在第1个进程调用bindService与unbindService

package com.example.superleeq.myapplication;

public class MainActivity extends Activity implements ServiceConnection {

    final static String OTHER_PACKAGE = "com.example.superleeq.myapplication2";
    final static String OTHER_SERVICE = "com.example.superleeq.myapplication2.MyService";
    boolean isbinded;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
    }

    private void initView() {
        findViewById(R.id.activity_main_button1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setComponent(new ComponentName(OTHER_PACKAGE, OTHER_SERVICE));

                isbinded = bindService(intent, MainActivity.this, Context.BIND_AUTO_CREATE);
            }
        });

        findViewById(R.id.activity_main_button2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (isbinded) {
                    unbindService(MainActivity.this);
                    isbinded = false;
                } else {
                    LogUtil.log("already unbindservice");
                }

            }
        });

    }

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        LogUtil.log("onServiceConnected ComponentName name =  " + name + " , IBinder service = " + service);

    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        LogUtil.log("onServiceDisconnected ComponentName name = " + name);
    }
}

3,跨进程与Service通信

3.1 aidl folder + package + class必须两个工程完全一致

3.2 app2 Service

package com.example.superleeq.myapplication2;

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 {

    private String mData = "default data";
    private boolean running;

    public MyService() {
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.e("lq", "MyService.onCreate");

        new Thread(new Runnable() {
            @Override
            public void run() {
                running = true;

                while (running){
                    Log.e("lq", "MyService.mdata=" + mData);

                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();

    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.e("lq", "MyService.onDestroy");
        running = false;
    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.e("lq", "MyService.onBind Intent intent=" + intent);

        return new IMyAidlInterface.Stub() {
            @Override
            public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {

            }

            @Override
            public void setData(String data) throws RemoteException {
                mData = data;
            }
        };
    }

}

3.3 app1 mainActivity

package com.example.superleeq.myapplication;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.EditText;

import com.example.superleeq.myapplication.util.LogUtil;
import com.example.superleeq.myapplication2.IMyAidlInterface;

public class MainActivity extends Activity implements ServiceConnection {

    final static String OTHER_PACKAGE = "com.example.superleeq.myapplication2";
    final static String OTHER_SERVICE = "com.example.superleeq.myapplication2.MyService";
    boolean isbinded;
    IMyAidlInterface binder = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
    }

    private void initView() {
        findViewById(R.id.activity_main_button1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                //android5.0以后仅支持显示意图启动
                intent.setComponent(new ComponentName(OTHER_PACKAGE, OTHER_SERVICE));
                isbinded = bindService(intent, MainActivity.this, Context.BIND_AUTO_CREATE);
            }
        });

        findViewById(R.id.activity_main_button2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                binder = null;

                if (isbinded) {
                    unbindService(MainActivity.this);
                    isbinded = false;
                } else {
                    LogUtil.log("already unbindservice");
                }

            }
        });

        final EditText editText = (EditText) findViewById(R.id.mInput);

        editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {
                if (binder != null) {
                    try {
                        binder.setData(s.toString());
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

        findViewById(R.id.setdata).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (binder != null) {
                    try {
                        binder.setData(editText.getText().toString());
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

    }

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        LogUtil.log("onServiceConnected ComponentName name =  " + name + " , IBinder service = " + service);
        //不能强制转换,否则报错
        binder = IMyAidlInterface.Stub.asInterface(service);

    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        //onServiceDisconnected()方法在正常情况下即使unbindService是不被调用的,它的调用时机是当Service服务被异外销毁时,例如内存的资源不足时
        LogUtil.log("onServiceDisconnected ComponentName name = " + name);
    }
}
    
时间: 2024-12-17 19:59:45

IPC解决方案之 AIDL的相关文章

Android IPC通信以及AIDL技术运用

首先我们了解一下 IPC和AIDL IPC:进程间通信 AIDL:Android Interface Definition Language,即Android接口定义语言. 为什么使用: Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信. 为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现.与很多其他的基于RPC的解决方案一样,Android使用一种接

初涉IPC,了解AIDL的工作原理及用法

初涉IPC,了解AIDL的工作原理及用法 今天来讲讲AIDL.这个神奇的AIDL,也是近期在学习的,看了某课大神的解说写下的blog,希望结合自己的看法给各位同价通俗易懂的解说 官方文档:http://developer.android.com/guide/components/aidl.html 一.What is AIDL?(什么是AIDL) AIDL:Android Interface Definition Language (Android接口定义语言) 首先,我们要知道.进程1和进程2

Android进程间通信(IPC)的AIDL机制:Hello World示例

Android实现IPC可使用Android本身提供的AIDL机制.网上也有很多相关文章,但写的过于繁琐和麻烦,重点也不突出.本文抽丝剥茧从工程角度给出一个最简单的Android AIDL例程关键代码,以最简单的形式说明如何在代码中使用Android AIDL. AIDL首先在逻辑上可分为"服务端"和"客户端".在本示例中,则以两个完全不同.互相独立的Eclipse 项目代表. (1)server.一个Android App,即AIDL的服务端服务提供者. (2)c

【Android - IPC】之AIDL简介

参考资料: 1.<Android开发艺术探索>第二章2.4.4 2.Android AIDL Binder框架解析:http://blog.csdn.net/lmj623565791/article/details/38461079 3.你真的理解AIDL中的in.out.inoutm么:http://www.open-open.com/lib/view/open1469494342021.html 4.慕课网<AIDL-小白成长记> 1. AIDL简介 Android系统规定:每

IPC轻量级实现——AIDL

我们从三个方面来对AIDL进行了解: 1)介绍 2)定义 3)实例 一 介绍 AIDI(Android接口定义语言),它是Android中用来解决进程间通信的一个桥梁,它的内部实现是binder,是IPC机制的一种轻量级的实现,在Android中提供了自动创建stub的工具. 二 定义 AIDL从它的名字就可以知道,它是一个接口类型的文件,但是它与java中定义的接口有不同的地方: 1)支持的类型不一样: AIDL支持的类型: 1,基本的数据类型(int.long.char等) 2,String

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

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

Android之——AIDL小结

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47071683 AIDL (Android Interface Definition Language ) AIDL 适用于 进程间通信,并且与Service端多个线程并发的情况,如果只是单个线程 可以使用 Messenger ,如果不需要IPC 可以使用Binder AIDL语法:基础数据类型都可以适用,List Map等有限适用.static field 不适用. AIDL基本

android ipc通信机制之二序列化接口和Binder

IPC的一些基本概念,Serializable接口,Parcelable接口,已经Binder.此核心为最后的IBookManager.java类!!! Serializable接口,Parcelable接口都是可以完成对象的序列化过程. 序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象. 两者均可以实现序列化并且都可以用于Intent数

AIDL的工作原理

初涉IPC,了解AIDL的工作原理及使用方法 android开发之AIDL用法_进程间通信原理详解