首页 > 代码库 > 简化Android的startActivityForResult调用

简化Android的startActivityForResult调用

一个是解决在onActivityResult
中判断requestCode的问题,第二个是让调用代码的地方就知道我是如何处理对方activity
的返回的。 首先我们有一个ResultActivityAdaptor,这个就封装了我的主要的逻辑

public class ResultActivityAdaptor {

    /**
     * 起始requestCode,用于兼容有一些老的逻辑,不让request code冲突
     */
    private final static int REQUEST_CODE_START=20000;

    //记录每一次请求的回调方法
    private SparseArray<ResultActivityListener> requests=new SparseArray<ResultActivityListener>();

    private Activity mActivity;

    //记录下一个请求的时候会生成的REQUEST_CODE
    private int currentReqCode=REQUEST_CODE_START;

    /**
     * 测试
     */
    public ResultActivityAdaptor(Activity activity) {
        this.mActivity = activity;
    }

    /**
     * @param i
     * @param listener
     */
    public void startActivityForResult(Intent i, ResultActivityListener listener){
        currentReqCode++;
        requests.put(currentReqCode,listener);
        mActivity.startActivityForResult(i,currentReqCode);
    }

    /**
     * 调用
     * @param requestCode
     * @param resultCode
     * @param data
     */
    public boolean onResult(int requestCode,int resultCode,Intent data){
        ResultActivityListener listener=requests.get(requestCode);
            if(listener!=null) {
                listener.onResult(requestCode, resultCode, data);
                //请求完就清除掉
                requests.remove(requestCode);
                return true;
            }
            return false;
    }
}

public interface ResultActivityListener {
    public void onResult(int requestCode,int resultCode,Intent data)
}

然后我们可以对我们的activity做如下的封装

/**
*   BaseActivity
*/
public class BaseActivity extends Activity {

    protected ResultActivityAdaptor mResultActivityAdaptor=new ResultActivityAdaptor(this);

    protected void startActivityWithCallback(Intent intent, ResultActivityListener listener) {
         mResultActivityAdaptor.startActivityForResult(intent, listener);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        mResultActivityAdaptor.onResult(requestCode,resultCode,data);
    }

    /**
     * 打开系统的图片选择
     */
    protected void openSystemImageGallary(ResultActivityListener listener){
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("image/*");
        startActivityWithCallback(intent, listener);
    }
}

这样封装之后,我们可以看到,我们在BaseActivity中调用代码的时候会轻松很多了,
一个是我们给用户隐藏了REQUEST_CODE的这种概念,第二个是我们把我们的调用操作
和我们的回调操作绑定到了一起,在代码阅读和重构/copy的时候带来了很大的便利性

 

http://www.fanjun.me/?p=582