天天看點

Android Service中給其他的元件回傳資料。

1.簡單的方法,使用廣播。service中處理完資料後發送廣播,在需要接收的地方接收廣播。

2.使用回調接口。編寫回調的地方是往往是處理資料的地方,在這裡寫interface等。如下:

public class UpdateLiveDataService extends Service {

    private WriteToDbListener mWriteToDbListener;

    public interface WriteToDbListener {
        void onWriteFinish();
    }

    public void setWriteToDbListener(WriteToDbListener listener) {
        mWriteToDbListener = listener;
    }

    /**
     * 傳回一個Binder對象
     */
    @Override
    public IBinder onBind(Intent intent) {
        return new MsgBinder();
    }

    public class MsgBinder extends Binder {
        /**
         * 擷取目前Service的執行個體
         * @return
         */
        public UpdateLiveDataService getService(){
            return UpdateLiveDataService.this;
        }
    }

    ...在相關的地方回調
    LogUtil.i(this,"mWriteToDbListener="+mWriteToDbListener);
    if (mWriteToDbListener != null) {
        mWriteToDbListener.onWriteFinish();
    }
           

}

使用回調的地方:

private void registerWriteToDbListener() {
        //綁定Service,現在的service綁定在5.0之後要用顯示的綁定了
        Intent intent = new Intent();
        intent.setAction("lenovo.com.ismartvlive.UPDATE");
        intent.setPackage(getPackageName());
        bindService(intent, conn, Context.BIND_AUTO_CREATE);
    }

    ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceDisconnected(ComponentName name) {

        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //傳回一個MsgService對象
            mUpdateLiveDataService = ((UpdateLiveDataService.MsgBinder)service).getService();

            mUpdateLiveDataService.setWriteToDbListener(new UpdateLiveDataService.WriteToDbListener() {
                @Override
                public void onWriteFinish() {
                    LogUtil.i(this, "write to Db finish,isFirstTune:"+isFirstTune);
                    if (isFirstTune) {
                        startPlayLastTuneChannel();
                    }
                }
            });

        }
    };