Android開發藝術探索之初探AIDL(一)
阿新 • • 發佈:2019-02-08
package service;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.support.annotation.Nullable;
import android.util.Log;
import com.example.weixiao.myaidldemo.Book;
import com.example.weixiao.myaidldemo.IBookManager;
import com.example.weixiao.myaidldemo.IOnBookListener;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* Created by weixiao on 2017/8/27.
*/
public class BookManagerService extends Service {
private static final String TAG = "BMS";
private AtomicBoolean mIsServiceDestoryed = new AtomicBoolean(false);//查了下,主要是保證原子性,就是多執行緒的情況下,只有一個執行緒操作
private CopyOnWriteArrayList<Book> mBookList = new CopyOnWriteArrayList<>(
);//CopyOnWriteArrayList支援併發讀寫,就是多個執行緒訪問
private RemoteCallbackList<IOnBookListener> mListenerList = new RemoteCallbackList<>();//保證關閉時取消新書訊息推送
private Binder mBinder = new IBookManager.Stub() {
@Override
public List<Book> getBookList() throws RemoteException {
return mBookList;
}
@Override
public void addBook(Book book) throws RemoteException {
mBookList.add(book);
}
@Override
public void registerListener(IOnBookListener listener) throws RemoteException {
mListenerList.register(listener);
}
@Override
public void unregisterListener(IOnBookListener listener) throws RemoteException {
mListenerList.unregister(listener);
}
};
@Override
public void onCreate() {
super.onCreate();
//服務端新增一些新書
mBookList.add(new Book(1, "Android"));
mBookList.add(new Book(2, "Ios"));
new Thread(new ServiceWorker()).start();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public void onDestroy() {
super.onDestroy();
mIsServiceDestoryed.set(true);
}
private void onNewBookArrived(Book book) throws RemoteException {
//新書到來了
mBookList.add(book);
final int N = mListenerList.beginBroadcast();
for (int i = 0; i < N; i++) {
IOnBookListener listener = mListenerList.getBroadcastItem(i);
if (listener!=null){
listener.NewBookArrived(book);//將新書訊息推給客戶端
}
Log.d(TAG, "onNewBookArrived,notify listener:" + listener);
}
mListenerList.finishBroadcast();
}
private class ServiceWorker implements Runnable {
@Override
public void run() {
//do background processing here
while (!mIsServiceDestoryed.get()) {
try {
Thread.sleep(5000);//5秒推送一次,5秒建立一本新書
int bookId = mBookList.size() + 1;
Book newBook = new Book(bookId, "new Book #" + bookId);
onNewBookArrived(newBook);//
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.support.annotation.Nullable;
import android.util.Log;
import com.example.weixiao.myaidldemo.Book;
import com.example.weixiao.myaidldemo.IBookManager;
import com.example.weixiao.myaidldemo.IOnBookListener;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* Created by weixiao on 2017/8/27.
*/
public class BookManagerService extends Service {
private static final String TAG = "BMS";
private AtomicBoolean mIsServiceDestoryed = new AtomicBoolean(false);//查了下,主要是保證原子性,就是多執行緒的情況下,只有一個執行緒操作
private CopyOnWriteArrayList<Book> mBookList = new CopyOnWriteArrayList<>(
);//CopyOnWriteArrayList支援併發讀寫,就是多個執行緒訪問
private RemoteCallbackList<IOnBookListener> mListenerList = new RemoteCallbackList<>();//保證關閉時取消新書訊息推送
private Binder mBinder = new IBookManager.Stub() {
@Override
public List<Book> getBookList() throws RemoteException {
return mBookList;
}
@Override
public void addBook(Book book) throws RemoteException {
mBookList.add(book);
}
@Override
public void registerListener(IOnBookListener listener) throws RemoteException {
mListenerList.register(listener);
}
@Override
public void unregisterListener(IOnBookListener listener) throws RemoteException {
mListenerList.unregister(listener);
}
};
@Override
public void onCreate() {
super.onCreate();
//服務端新增一些新書
mBookList.add(new Book(1, "Android"));
mBookList.add(new Book(2, "Ios"));
new Thread(new ServiceWorker()).start();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public void onDestroy() {
super.onDestroy();
mIsServiceDestoryed.set(true);
}
private void onNewBookArrived(Book book) throws RemoteException {
//新書到來了
mBookList.add(book);
final int N = mListenerList.beginBroadcast();
for (int i = 0; i < N; i++) {
IOnBookListener listener = mListenerList.getBroadcastItem(i);
if (listener!=null){
listener.NewBookArrived(book);//將新書訊息推給客戶端
}
Log.d(TAG, "onNewBookArrived,notify listener:" + listener);
}
mListenerList.finishBroadcast();
}
private class ServiceWorker implements Runnable {
@Override
public void run() {
//do background processing here
while (!mIsServiceDestoryed.get()) {
try {
Thread.sleep(5000);//5秒推送一次,5秒建立一本新書
int bookId = mBookList.size() + 1;
Book newBook = new Book(bookId, "new Book #" + bookId);
onNewBookArrived(newBook);//
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}