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(); }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories