• 简化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

  • 相关阅读:
    进程间通迅之消息队列
    进程间通讯之共享内存
    标准块CP功能实现
    标准字符cp功能
    文件cp功能
    jest 的 coverage 提示 unknown 的解决方案
    js中的相等
    getBoundingClientRect 和 requestAnimFrame 的polyfill
    设计模式(4): 给组件实现单独的store
    Vue项目移动端滚动穿透问题
  • 原文地址:https://www.cnblogs.com/jiezzy/p/3698090.html
Copyright © 2020-2023  润新知