1. 程式人生 > >Android開發藝術探索之初探AIDL(一)

Android開發藝術探索之初探AIDL(一)

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();
                }
            }
        }
    }
}