Android 에서 AIDL 사용 에 대한 자세 한 설명
AIDL 은 뭐 하 는 거 예요?
AIDL 은 Android 에서 IPC(Inter-Process Communication)방식 중 하나 이 며,AIDL 은 Android Interface definition language 의 줄 임 말로,소 백 에 게 AIDL 의 역할 은 자신의 앱 에 다른 앱 의 서 비 스 를 연결 할 수 있 도록 하 는 것 이다.그러면 앱 이 다른 앱 과 상호작용 할 수 있다.
aidl 파일 이 지원 하 는 데이터 형식 은 다음 과 같 습 니 다.
8 가지 기본 데이터 유형:byte,char,short,int,long,float,double,boolean
adl 파일 은 두 가지 로 나 눌 수 있 습 니 다.하 나 는 Parcelable 인터페이스의 데이터 형식 을 설명 하 는 데 사 용 됩 니 다.다른 AIDL 파일 이 기본 지원 되 지 않 는 데이터 형식 을 사용 할 수 있 도록 합 니 다.또 하 나 는 인터페이스 방법 을 정의 하고 클 라 이언 트 에 어떤 인 터 페 이 스 를 노출 시 켜 야 하 는 지 설명 하 는 것 이다.
AIDL 의 구체 적 인 사용 절 차 는:
1.서버 프로젝트 만 들 기
1.만약 에 aidl 파일 에 Parcelable 인 터 페 이 스 를 실현 하 는 데이터 형식 이 관련 되 어 있다 면 이 aidl 파일 을 먼저 정의 합 니 다.src 폴 더 에서 오른쪽 단 추 를 누 르 고 새 aidl 파일 을 선택 하 십시오.북.aidl 파일 을 새로 만 들 었 습 니 다.
새로 만 든 후 main 파일 아래 에 adl 폴 더 를 생 성 합 니 다.adl 폴 더 의 디 렉 터 리 구 조 는 자바 폴 더 의 디 렉 터 리 구조 와 같 습 니 다.
Book.aidl 파일 에 기본 방법 이 있 습 니 다.
우 리 는 이 기본 방법 을 삭제 하고 parcelable 데이터 형식 만 설명 합 니 다.이 파일 은 Parcelable 데이터 형식 을 설명 하 는 AIDL 파일 이 됩 니 다.여기 있 는 parcelable 의 p 는 소문 자 입 니 다.
2.이 럴 때 우 리 는 Book 클래스 를 정의 하고 Parcelable 인 터 페 이 스 를 실현 합 니 다.Book 클래스 가 자바 폴 더 에 있 는 디 렉 터 리 와 Book.aidl 파일 이 aidl 폴 더 에 있 는 디 렉 터 리 와 일치 하 는 것 을 주의 하 십시오.
public class Book implements Parcelable {
private String name;
public Book(String name) {
this.name=name;
}
protected Book(Parcel in) {
this.name = 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 getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
}
/**
* ,
* in tag。 writeToParcel() 。
* out inout tag , readFromParcel() 。
* Parcelable , 。
*/
public void readFromParcel(Parcel dest){
name=dest.readString();
}
}
여기 서 주의해 야 할 것 은 out 이나 inout 의 방향 성 tag 를 지원 하려 면 readFromParcel()방법 을 손 으로 써 야 한 다 는 것 입 니 다.3.그 다음 에 저 희 는 BookController.aidl 파일 을 써 서 클 라 이언 트 가 호출 할 수 있 는 인 터 페 이 스 를 정의 하기 시 작 했 습 니 다.
package com.example.service;
import com.example.service.Book;
// Declare any non-default types here with import statements
interface BookController {
int getInt();//int
String getString();//String
List<Book> getBookList();//aidl
void addBook(inout Book book);//aidl
}
여기 서 주의해 야 할 것 은 북.aidl 파일 과 북 컨트롤 러.aidl 파일 이 같은 가방 에 있 지만 수 동 으로 가 져 와 야 한 다 는 것 입 니 다.4.이로써 우리 의 adl 파일 을 다 쓴 후에 우리 Rebuild procject 는 AIDL 파일 과 같은 이름 의 자바 파일 을 만 드 는 데 도움 을 줄 것 입 니 다.이 자바 파일 이 야 말로 우리 의 크로스 프로 세 스 통신 과 밀접 한 관 계 를 가 진 것 입 니 다.
5.Service 를 정의 하고 이 Service 를 통 해 인 터 페 이 스 를 외부 에 노출 합 니 다.
public class AIDLService extends Service {
private List<Book> bookList;
public AIDLService() {
}
@Override
public void onCreate() {
super.onCreate();
bookList = new ArrayList<>();
initData();
}
private void initData() {
Book book1 = new Book(" ");
Book book2 = new Book(" ");
Book book3 = new Book(" ");
Book book4 = new Book(" ");
Book book5 = new Book(" ");
Book book6 = new Book(" ");
Book book7 = new Book(" ");
Book book8 = new Book(" ");
bookList.add(book1);
bookList.add(book2);
bookList.add(book3);
bookList.add(book4);
bookList.add(book5);
bookList.add(book6);
bookList.add(book7);
bookList.add(book8);
}
private final BookController.Stub stub = new BookController.Stub() {
@Override
public int getInt() throws RemoteException {
return bookList == null ? 0 : bookList.size();
}
@Override
public String getString() throws RemoteException {
return bookList == null ? "" : bookList.get(0).getName();
}
@Override
public List<Book> getBookList() throws RemoteException {
return bookList;
}
@Override
public void addBook(Book book) throws RemoteException {
if (book != null) {
bookList.add(book);
} else {
Log.i("ruxing", " Inout");
}
}
};
@Nullable
@Override
public IBinder onBind(Intent intent) {
return stub;
}
}
6.리스트 파일 에 서 비 스 를 등록 합 니 다.
<service android:name=".AIDLService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.service.action"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</service>
이로써 서버 개발 이 완료 되 었 다.2.custom 프로젝트 만 들 기
1.custom 프로젝트 를 새로 만 들 고 서버 의 adl 폴 더 에 있 는 내용 을 모두 새 프로젝트 에 복사 합 니 다.만약 에 adl 에 bean 실체 류 가 있 으 면 실체 류 도 복사 한 다음 에 Rebuild Project.
2.클 라 이언 트 의 activity 에서 원 격 서 비 스 를 연결 하여 adl 통신 을 실현 합 니 다.
public class MainActivity extends AppCompatActivity {
private BookController bookController;
private boolean connected;
private List<Book> bookList;
private Button mBtnGetBookList;
private Button mBtnAddBook;
private Button mBtnGetBookSize;
private Button mBtnGetFirstBookName;
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
bookController = BookController.Stub.asInterface(service);
connected = true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
bookController = null;
connected = false;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtnGetBookList = findViewById(R.id.btn_get_book_list);
mBtnAddBook = findViewById(R.id.btn_add);
mBtnGetBookSize = findViewById(R.id.btn_get_book_size);
mBtnGetFirstBookName = findViewById(R.id.btn_first_book_name);
mBtnGetBookList.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (connected) {
try {
bookList = bookController.getBookList();
for (int i = 0; i < bookList.size(); i++) {
Log.i("ruxing", "name=" + bookList.get(i).getName());
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
});
mBtnAddBook.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (connected) {
Book book = new Book(" ");
try {
bookController.addBook(book);
Log.i("ruxing", " ==="+book.getName());
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
});
mBtnGetBookSize.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (connected) {
try {
int size = 0;
size = bookController.getInt();
Log.i("ruxing", " " + size + " ");
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
});
mBtnGetFirstBookName.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (connected) {
try {
String name = bookController.getString();
Log.i("ruxing", " :" + name);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
});
Intent intent = new Intent();
intent.setPackage("com.example.service");
intent.setAction("com.example.service.action");
bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (connected) {
unbindService(serviceConnection);
}
}
}
전체 코드 주소:https://github.com/ruxing1102/AIDL.git
안 드 로 이 드 에서 AIDL 의 사용 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 안 드 로 이 드 AIDL 의 사용 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.