AndroidStudio AIDL 세부 단계

AIDL (Android Interface Definition Language)은 Android 인터페이스 정의 언어입니다.

최근에 Binder의 원리를 살펴 보았는데, Android에서 AIDL은 Binder의 고전적인 구현입니다. 먼저 AIDL을 사용하는 단계를 기록해 두십시오.

1 서버 서비스

1.1 AndroidStudio를 사용하여 aidl 파일 생성

그러면 파일 이름을 수정할 수있는 페이지가 나타나고 파일 이름을 직접 가져올 수 있습니다.

마침을 클릭하면 aidl 파일 디렉토리는 다음과 같습니다.

그런 다음 aidl 폴더 디렉토리를 열고 방금 만든 OperateNumInterface.aidl 파일을 엽니 다.

그 중 NumBean은 새로 생성 된 Java 클래스로, 디렉토리는 다음과 같습니다.

NumBean은 Parcelable 인터페이스를 구현해야하며 전체 코드는 다음과 같습니다.

package com.sz.aidl_service_demo;

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

public class NumBean implements Parcelable {

    private String extraInfo;
    private int num1;
    private int num2;


    public NumBean(int num1, int num2, String extraInfo) {
        this.num1 = num1;
        this.num2 = num2;
        this.extraInfo = extraInfo;
    }

    protected NumBean(Parcel parcel) {
        num1 = parcel.readInt();
        num2 = parcel.readInt();
        extraInfo = parcel.readString();
    }

    public String getExtraInfo() {
        return extraInfo;
    }

    public void setExtraInfo(String extraInfo) {
        this.extraInfo = extraInfo;
    }

    public int getNum1() {
        return num1;
    }

    public void setNum1(int num1) {
        this.num1 = num1;
    }

    public int getNum2() {
        return num2;
    }

    public void setNum2(int num2) {
        this.num2 = num2;
    }

    public static final
    Creator<NumBean> CREATOR = new Creator<NumBean>() {

        @Override
        public NumBean createFromParcel(Parcel source) {
            return new NumBean(source);
        }

        @Override
        public NumBean[] newArray(int size) {
            return new NumBean[size];
        }
    };

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(num1);
        dest.writeInt(num2);  
        dest.writeString(extraInfo);
    }
}
그런 다음 그림과 같이 aidl 폴더에 NumBean.adil 파일을 만듭니다.

이때 OperateNumInterface.java 파일을 생성하려면 프로젝트를 재 구축해야합니다. 빌드가 성공하면 다음 디렉터리가 나타납니다.

​​

 

1.2 서비스 구현 클래스 생성

Service를 구현할 클래스를 생성합니다. 위치 디렉토리는 다음과 같습니다.

OperateNumService.java 자세한 코드 :

package com.sz.aidl_service_demo;

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

import androidx.annotation.Nullable;

public class OperateNumService extends Service {

                          注释1:一定要先ReBuild项目,否则找不到OperateNumInterface  
    private IBinder iBinder = new OperateNumInterface.Stub() {

        @Override
        public int operateNum(NumBean numBean) throws RemoteException {
                注释2:还记得aidl文件中我们自己定义的方法么,具体实现在这里
            Log.i("tag", "num1=" + numBean.getNum1() + ",num2=" + numBean.getNum2() + ",ExtraInfo=" + numBean.getExtraInfo());
            return numBean.getNum1() + numBean.getNum2();//我是将NumBean中两个数的和返回
        }
    };


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

그런 다음 Mainfest 파일에서 Service를 선언하는 것을 잊지 마십시오.

        <service android:name=".OperateNumService">
            <intent-filter>
                <action android:name="com.aidl_service_demo.my_flag" />
            </intent-filter>
        </service>

여기서 서버가 완성되었습니다.

2 클라이언트

2.1 서버의 aidl 폴더를 Client 디렉토리에 직접 복사합니다.

2.2 새로운 NumBean 클래스

NumBean 클래스의 디렉토리 구조는 서비스 측의 디렉토리 구조와 동일해야합니다.

프로젝트를 다시 빌드해야합니다.

2.3 서비스 바인딩 및 결과 수신 및 반환을위한 데이터 전송

이러한 작업은 MainActivity에서 수행되며 코드는 다음과 같습니다.

import androidx.appcompat.app.AppCompatActivity;

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.util.Log;
import android.view.View;
import android.widget.TextView;

import com.sz.aidl_service_demo.NumBean;
import com.sz.aidl_service_demo.OperateNumInterface;

public class MainActivity extends AppCompatActivity {

    private TextView tv_operate_num_result;
    private int operateResult = -1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_operate_num_result = findViewById(R.id.tv_operate_num_result);
    }
    
    注释1:按钮1 绑定Service
    public void bindService(View view) {
        Intent intentBind = new Intent();
        intentBind.setAction("com.aidl_service_demo.my_flag");
        intentBind.setPackage("com.sz.aidl_service_demo");
        bindService(intentBind, serviceConnection, Context.BIND_AUTO_CREATE);
    }

    注释2:按钮2 向Service发送数据并接收返回数据展示
    public void sendService(View view) {
        NumBean numBean = new NumBean(160, 8, "i'm extra info");
        if (operateNumInterface != null) {
            try {
                operateResult = operateNumInterface.operateNum(numBean);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
        tv_operate_num_result.setText("Service 返回操作结果为: " + operateResult);
    }

    private OperateNumInterface operateNumInterface;
    private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.i("tag", "onServiceConnected");
            注释3: 
            operateNumInterface = OperateNumInterface.Stub.asInterface(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            operateNumInterface = null;
        }
    };


}

1 먼저 Bind Service 버튼을 클릭하면 클라이언트가 다음과 같이 로그를 인쇄합니다.

2 그런 다음 서비스에 데이터 보내기 버튼을 클릭합니다.

서비스 로그는 다음과 같습니다.

클라이언트 인터페이스는 다음과 같이 표시됩니다.

 

추천

출처blog.csdn.net/u011288271/article/details/111173368