Android Framework基础之基于AIDL的Binder机制

参考android Binder 实现—— AIDL demo
纯纯是自己学习内容,别看

Code Struct

C:\Users\lenovo\AndroidStudioProjects\binder\app\src\main\java\com\example\binder
Book.java
MyService.java
MainActivity.java
C:\Users\lenovo\AndroidStudioProjects\binder\app\src\main\aidl\com\example\binder
Book.aidl
IBookManager.aidl

Book.java

package com.example.binder;

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

public class Book implements Parcelable {
    
    

    private int bookId;
    private String bootName;

    public Book(){
    
    
    }
    protected Book(Parcel in) {
    
    
        bookId = in.readInt();
        bootName = in.readString();
    }

    public int getBookIdO(){
    
    
        return bookId;
    }
    public void setBookId(int bookId){
    
    
        this.bookId = bookId;
    }
    public String getBookName(){
    
    
        return bootName;
    }
    public void setBookName(String bootName){
    
    
        this.bootName = bootName;
    }
    @Override
    public String toString(){
    
    
        return "Book{" + "bookid=" + bookId + ",bootName='" +'\''+'}';

    }
    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];
        }
    };

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

    @Override
    public void writeToParcel(Parcel parcel, int i) {
    
    
        parcel.writeInt(bookId);
        parcel.writeString(bootName);
    }
}

Book.aidl

// Book.aidl
package com.example.binder;

// Declare any non-default types here with import statements

parcelable Book;

IBookManager.aidl

// IBookManager.aidl
package com.example.binder;

import com.example.binder.Book;

// Declare any non-default types here with import statements

interface IBookManager {
    
    
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    List<Book> getBookList();
    void addBook(in Book book);
}

MyService.java

package com.example.binder;

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

import androidx.annotation.Nullable;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;

public class MyService extends Service {
    
    

    private final String TAG = "jerry";

    private ArrayList<Book> mBooks;
    private IBinder mIBinder = new IBookManager.Stub() {
    
    
        @Override
        public List<Book> getBookList() throws RemoteException {
    
    
            Log.e(TAG, "getBookList::");
            return mBooks;
        }

        @Override
        public void addBook(Book book) throws RemoteException {
    
    
            Log.e(TAG, "addBook::");
            mBooks.add(book);
        }
    };
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
    
    
        mBooks = new ArrayList<>();
        Log.e(TAG, "onBind::");
        return mIBinder;
    }
}

MainActivity.java

package com.example.binder;

import androidx.appcompat.app.AppCompatActivity;

import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import java.util.ArrayList;
import java.util.Random;

public class MainActivity extends AppCompatActivity {
    
    

    private static final String TAG = "jerry";
    private Button button;
    private Button button1;
    private IBookManager mIBookManager;
    private ServiceConnection mServiceConnection;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = findViewById(R.id.button);
        button1 = findViewById(R.id.button1);

        button1.setOnClickListener(new View.OnClickListener(){
    
    
            @Override
            public void onClick(View view) {
    
    
                 unbindService(mServiceConnection);
                 Log.e(TAG, "unbinder::");

            }
        });
        button.setOnClickListener(new View.OnClickListener(){
    
    
            @Override
            public void onClick(View view) {
    
    
                Log.e(TAG, "onClick");
                ComponentName cn = new ComponentName("com.example.binder",
                        "com.example.binder.MyService");
                Intent intent = new Intent();
                intent.setComponent(cn);
                //Log.e(TAG, "getApplicationContext  " + getApplicationContext() + " MyServiceclass  "+ MyService.class);
                //Intent intent = new Intent(getApplicationContext(), MyService.class);
                mServiceConnection = new ServiceConnection() {
    
    
                    @Override
                    public void onServiceConnected(ComponentName componentName, IBinder service) {
    
    
                        //binder transform to aidl
                        mIBookManager = IBookManager.Stub.asInterface(service);
                        Log.e(TAG, "onServiceConnected::");
                        try {
    
    
                            ArrayList<Book> mBooks = (ArrayList<Book>) mIBookManager.getBookList();
                            if(mBooks == null)
                                Log.e(TAG, "onBind error");
                            Book book = new Book();
                            book.setBookId(1);
                            book.setBookName("Math");
                            mIBookManager.addBook(book);

                        } catch (RemoteException e) {
    
    
                            e.printStackTrace();
                        }
                    }

                    @Override
                    public void onServiceDisconnected(ComponentName componentName) {
    
    
                        Log.e(TAG, "onServiceDisconnected::");
                        mIBookManager = null;
                    }
                };

                boolean mIsbind = bindService(intent, mServiceConnection,BIND_AUTO_CREATE);
                Log.e(TAG, "bindService::" + mIsbind);

//                Handler handler = new Handler();
//                handler.postDelayed(new Runnable() {
    
    
//                    @Override
//                    public void run() {
    
    
//                        // Do something after 5s = 5000ms
//                        // Add your function here which will be executed after 1 second
//                    }
//                }, 1000);

                //unbindService(mServiceConnection);

            }
        });
    }
}

AndroidManifest.xml

 	<service
        android:name=".MyService"
        android:enabled="true"
        android:exported="true"
        android:process=":aidl">
    </service>>

猜你喜欢

转载自blog.csdn.net/qq_40405527/article/details/130255358