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