Android获取界面的返回结果

Android获取界面的返回结果

异步获取界面的返回结果,不需要使用onActivityResult,去接收界面的返回数据,如果接入过QQ 微博的账号系统,会知道他们会将登陆结果返回在onResult onError onCanel方法中。原理就是aidl 下文介绍如何实现。

  • aidl接口

1.实现aidl回调接口

/**
 * The interface used to return responses from activity
 */
oneway interface IActivityResponse {
    /**
     * onResult
     */
    void onResult(in Bundle value);

    /**
     * onError
     */
    void onError(int error, String message);

    /**
     * onCancel
     */
    void onCancel();
}

2.实现ActivityResponse

public class ActivityResponse implements Parcelable {
    // creator
    public static final Creator<ActivityResponse> CREATOR = new Creator<ActivityResponse>() {
        public ActivityResponse createFromParcel(Parcel source) {
            return new ActivityResponse(source);
        }

        public ActivityResponse[] newArray(int size) {
            return new ActivityResponse[size];
        }
    };
    /**
     * 日志
     */
    private static final String TAG = "ActivityResponse";
    /**
     * 响应接口对象
     */
    private IActivityResponse response = null;

    /**
     * 构造函数
     *
     * @param response IAccountResponse对象
     */
    public ActivityResponse(IActivityResponse response) {
        this.response = response;
    }

    /**
     * 构造函数
     *
     * @param parcel Parcel对象
     */
    public ActivityResponse(Parcel parcel) {
        response = IActivityResponse.Stub.asInterface(parcel.readStrongBinder());
    }

    /**
     * 回调并返回结果
     *
     * @param result 数据结果
     */
    public void onResult(Bundle result) {
        try {
            response.onResult(result);
        } catch (DeadObjectException e) {
            LOG.e(TAG, "[result:" + result
                    + "] on result failed(DeadObjectException)", e);
        } catch (RemoteException e) {
            LOG.e(TAG, "[result:" + result
                    + "] on result failed(RemoteException)", e);
        } catch (Throwable e) {
            LOG.e(TAG, "[result:" + result
                    + "] on result failed(Throwable)", e);
        }
    }

    /**
     * 发生错误时的回调
     *
     * @param error   错误码
     * @param message 错误信息
     */
    public void onError(int error, String message) {
        try {
            response.onError(error, message);
        } catch (DeadObjectException e) {
            LOG.e(TAG, "[error:" + error + "][message:" + message
                    + "] on error failed(DeadObjectException)", e);
        } catch (RemoteException e) {
            LOG.e(TAG, "[error:" + error + "][message:" + message
                    + "] on error failed(RemoteException)", e);
        } catch (Throwable e) {
            LOG.e(TAG, "[error:" + error + "][message:" + message
                    + "] on error failed(Throwable)", e);
        }
    }

    /**
     * 发生取消时的回调
     */
    public void onCancel() {
        try {
            response.onCancel();
        } catch (DeadObjectException e) {
            LOG.e(TAG, "on cancel failed(DeadObjectException)", e);
        } catch (RemoteException e) {
            LOG.e(TAG, "on cancel failed(RemoteException)", e);
        } catch (Throwable e) {
            LOG.e(TAG, "on cancel failed(Throwable)", e);
        }
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeStrongBinder(response.asBinder());
    }

3.将IActivityResponse.Stub传入Activity,并实现回调方法

i.putExtra("activityResponse", 
        new ActivityResponse(new IActivityResponse.Stub(){
            @Override 
            public void onResult(Bundle value) throws RemoteException {

            }

            @Override 
            public void onError(int error, String message) throws RemoteException {

            }

            @Override
            public void onCancel() throws RemoteException {

            }
        }));

3.在Activity中调用

        ActivityResponse response = getIntent().getParcelableExtra("activityResponse");

        if (null != response) {
            response.onError(error, message);
        }

        ActivityResponse response = getIntent().getParcelableExtra("activityResponse");

        if (null != response) {
            response.onResult(result);
        }

        ActivityResponse response = getIntent().getParcelableExtra("activityResponse");

        if (null != response) {
            response.onCancel();
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值