Android 에서 AIDL 사용 에 대한 자세 한 설명

12366 단어 AndroidAIDL쓰다
AIDL,즉 Android Interface Definition Language,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
  • String、CharSequence
  • Parcelable 인터페이스의 데이터 형식 을 실현 했다
  • List 유형.List 에 탑 재 된 데 이 터 는 AIDL 이 지원 하 는 형식 이거 나 다른 성명 의 AIDL 대상 이 어야 합 니 다지도 유형Map 에 탑 재 된 데 이 터 는 AIDL 이 지원 하 는 형식 이거 나 다른 성명 의 AIDL 대상 이 어야 합 니 다다른 성명 의 AIDL 대상 을 사용 할 때 는 패 키 지 를 안내 해 야 합 니 다.사용 할 AIDL 대상 파일 과 현재 편집 중인 AIDL 파일 이 같은 폴 더 아래 에 있 더 라 도.
    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 의 사용 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

    좋은 웹페이지 즐겨찾기