您的位置:首页 > 移动开发 > Android开发

Android获取界面的返回结果

2015-12-03 11:44 435 查看

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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android