参考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>>