// MainActivity.java
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private IBookManager mBookManager;
private boolean mBound = false;
// 服务连接回调
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mBookManager = IBookManager.Stub.asInterface(service);
mBound = true;
// 绑定死亡代理
try {
service.linkToDeath(mDeathRecipient, 0);
} catch (RemoteException e) {
e.printStackTrace();
}
// 注册监听器
try {
mBookManager.registerListener(mOnNewBookListener);
} catch (RemoteException e) {
e.printStackTrace();
}
Log.d(TAG, "Service connected");
fetchBooks();
}
@Override
public void onServiceDisconnected(ComponentName name) {
mBound = false;
Log.e(TAG, "Service disconnected");
}
};
// 死亡代理
private IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() {
@Override
public void binderDied() {
Log.w(TAG, "Binder died, reconnecting...");
// 尝试重连
if (mBookManager != null) {
mBookManager.asBinder().unlinkToDeath(mDeathRecipient, 0);
mBookManager = null;
}
// 重新绑定
bindBookService();
}
};
// 回调监听器实现
private IOnNewBookListener mOnNewBookListener = new IOnNewBookListener.Stub() {
@Override
public void onNewBookArrived(Book newBook) throws RemoteException {
// 注意:这个方法在 Binder 线程池中执行,需要切换到主线程更新UI
runOnUiThread(() -> {
Toast.makeText(MainActivity.this,
"新书到达:" + newBook.getName(),
Toast.LENGTH_SHORT).show();
});
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 绑定服务
bindBookService();
// 初始化UI
Button btnGetBooks = findViewById(R.id.btn_get_books);
Button btnAddBook = findViewById(R.id.btn_add_book);
btnGetBooks.setOnClickListener(v -> fetchBooks());
btnAddBook.setOnClickListener(v -> addNewBook());
}
private void bindBookService() {
Intent intent = new Intent();
intent.setAction("com.example.aidl.BOOK_SERVICE");
intent.setPackage(getPackageName()); // Android 5.0+ 需要显式声明
intent.setComponent(new ComponentName("com.example.aidl",
"com.example.aidl.BookManagerService"));
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
private void fetchBooks() {
if (!mBound || mBookManager == null) {
Toast.makeText(this, "服务未连接", Toast.LENGTH_SHORT).show();
return;
}
// 异步调用,避免阻塞UI线程
new Thread(() -> {
try {
List<Book> books = mBookManager.getAllBooks();
// 切换到主线程更新UI
runOnUiThread(() -> {
// 更新列表显示
updateBookList(books);
});
} catch (RemoteException e) {
e.printStackTrace();
runOnUiThread(() -> {
Toast.makeText(MainActivity.this,
"获取书籍失败: " + e.getMessage(),
Toast.LENGTH_SHORT).show();
});
}
}).start();
}
private void addNewBook() {
if (!mBound || mBookManager == null) {
Toast.makeText(this, "服务未连接", Toast.LENGTH_SHORT).show();
return;
}
new Thread(() -> {
try {
int newId = mBookManager.getBookCount() + 1;
Book newBook = new Book(newId, "新书" + newId, 50.0);
mBookManager.addBook(newBook);
runOnUiThread(() -> {
Toast.makeText(MainActivity.this,
"添加成功",
Toast.LENGTH_SHORT).show();
});
} catch (RemoteException e) {
e.printStackTrace();
}
}).start();
}
private void updateBookList(List<Book> books) {
// 更新UI显示
StringBuilder sb = new StringBuilder();
for (Book book : books) {
sb.append(book.getName()).append("\n");
}
TextView tvBooks = findViewById(R.id.tv_books);
tvBooks.setText(sb.toString());
}
@Override
protected void onDestroy() {
super.onDestroy();
// 解绑服务和监听器
if (mBound) {
if (mBookManager != null && mOnNewBookListener != null) {
try {
mBookManager.unregisterListener(mOnNewBookListener);
} catch (RemoteException e) {
e.printStackTrace();
}
}
unbindService(mConnection);
mBound = false;
}
}
}