AIDL之两个app之间通信

本文详细介绍如何使用Android Interface Definition Language (AIDL)进行跨进程通信(IPC),包括创建AIDL文件、实现Parcelable序列化的Bean类、定义服务端和客户端交互过程,以及在AndroidManifest.xml中注册服务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

服务端

首先在main右键新建一个AIDL文件,建完之后clear一下

在这里插入图片描述

在这里插入代码片在这里插入图片描述

然后再新建一个Bean类和第一个键的AIDL文件名一样,一定先建AIDL不能先创建和AILD同名的java文件

Bean类 实现Parcelable序列化,再自己手写一个readFromParcel方法

package com.example.month2server;

import android.os.Parcel;
import android.os.Parcelable;

public class Book implements Parcelable {

    String mess;

    public Book(String mess) {
        this.mess = mess;
    }

    protected Book(Parcel in) {
        mess = in.readString();
    }
    public static final Creator<Book> CREATOR = new Creator<Book>() {
        @Override
        public Book createFromParcel(Parcel in) {
            return new Book(in);
        }

        @Override
        public Book[] newArray(int size) {
            return new Book[size];
        }
    };
    public String getMess() {
        return mess;
    }

    public void setMess(String mess) {
        this.mess = mess;
    }

    @Override
    public String toString() {
        return "Book{" +
                "mess='" + mess + '\'' +
                '}';
    }
    public void readFromParcel(Parcel parcel){
        mess=parcel.readString();
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(mess);

    }
}

再把我们一开始的建的AIDL文件修改一下,然后clear一下

在这里插入图片描述

再建第二个AIDl文件定义我们自己想要的方法,把我们Bean类的包名导过来,然后clear一下

在这里插入图片描述

绑定服务类

package com.example.month2server;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;

import java.util.ArrayList;
import java.util.List;

public class MyAIDLServer extends Service {
     List<Book>books=new ArrayList<>();
    MyAIDLInterface.Stub stub=new MyAIDLInterface.Stub() {
        @Override
        public List<Book> readMess() throws RemoteException {

            return books;
        }

        @Override
        public void wirteMess(Book book) throws RemoteException {

            if(book!=null){
                books.add(book);
                Log.e("##",""+book.toString());
            }
        }
    };


    @Override
    public void onCreate() {
        super.onCreate();
        Book book = new Book("今天遇见一只猴子");
        books.add(book);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return stub;
    }
}

清单注册文件注册

  <service android:name=".MyAIDLServer">
            <intent-filter>
                <action android:name="aldl"> </action>
                <category android:name="android.intent.category.DEFAULT"></category>
            </intent-filter>
        </service>

客户端 把服务端AIDL复制到客户端项目,clear一下,然后把服务端java包也给复制过来,放在同一级目录下,只留下Bean类

package com.example.month2;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import com.example.month2server.Book;
import com.example.month2server.MyAIDLInterface;

import java.util.List;

public class fragment3 extends Fragment {

    MyAIDLInterface myAIDLInterface;
    ServiceConnection serviceConnection=new ServiceConnection(){

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {

          myAIDLInterface=MyAIDLInterface.Stub.asInterface(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View view=inflater.inflate(R.layout.frag3,container,false);
        Button b_get=view.findViewById(R.id.get);
        final TextView t_get=view.findViewById(R.id.getText);
        Button b_post=view.findViewById(R.id.post);
        final EditText e_post=view.findViewById(R.id.post_mess);

        b_get.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                try {
                    List<Book> books = myAIDLInterface.readMess();
                    t_get.setText(books.toString());
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        });
        b_post.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String s = e_post.getText().toString();
                Book book = new Book(s);
                try {
                    myAIDLInterface.wirteMess(book);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        });
        BIND_Server();

        return view;
    }

    private void BIND_Server() {
        Intent intent = new Intent();
        intent.setPackage("com.example.month2server");
        intent.setAction("hhhh");
        getContext().bindService(intent,serviceConnection,getContext().BIND_AUTO_CREATE);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值