ActivityResult 讓你優(yōu)雅的獲取Activity的返回值

github https://github.com/lwugang/ActivityResult

allprojects {
    repositories {
        maven { url 'https://www.jitpack.io' }
    }
}
dependencies {
    compile 'com.github.lwugang:ActivityResult:ef8a6afcaf'
}

大家都知道在一個APP中,Activity之間的數(shù)據(jù)交互是經(jīng)常的,

傳統(tǒng)方式獲取Activity返回值,這種方式需要操作多個方法,可讀性很差

 startActivityForResult(new Intent(),1);
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    //獲取數(shù)據(jù)
  }

ActivityResult方式 只需關(guān)注一個方法,實現(xiàn)方法的鏈式調(diào)用,可讀性強,對代碼無侵入,只需修改打開方式,另一個界面的邏輯無需特殊處理

ActivityResult.of(this)
        .className(TestActivity.class)//目標Activity類名
        //綠色通道,不走任何攔截器,直接打開目標
        .greenChannel()
        //transition 動畫
        .options(ActivityOptionsCompat.makeScaleUpAnimation(v,(int)v.getX(),(int)v.getY(),
            v.getWidth()/2,v.getHeight()/2).toBundle())
        //攔截器,在startActivity之前執(zhí)行
        .intercept(new Intercept() {
          @Override public boolean onIntercept(Activity activity, ActivityResult activityResult) {
            Log.e(TAG, "onIntercept: test" );
            //攔截器,return true 表示攔截,之后的攔截器都不會執(zhí)行
            //activityResult.onContinue(); 繼續(xù)執(zhí)行之后的邏輯
            return false;
          }
        }).forResult(new ActivityResultListener() {
      @Override public void onReceiveResult(int resultCode, Intent data) {
          // 結(jié)果處理,也就是onActivityResult方法一樣
      }
    });

Application 中提前加入攔截器(可選)

//注冊攔截器
ActivityResultManager.get()
        .registerIntercept(new Intercept() {
          @Override public boolean onIntercept(Activity activity,final ActivityResult activityResult) {
            Log.e(TAG, "onIntercept: " );
            new Thread(){
              @Override public void run() {
                super.run();
                SystemClock.sleep(2000);
                activityResult.onContinue();
              }
            }.start();
            return true;
          }
        // true 表示使用一次之后就自動移除,下一次不會在執(zhí)行此攔截器
        },true).registerIntercept(new Intercept() {
      @Override public boolean onIntercept(Activity activity, ActivityResult activityResult) {
        //可以判斷是否登錄成功,返回對應(yīng)的值
        Log.e(TAG, "onIntercept2222222222: " );
        return false;
      }
    },true);

實現(xiàn)分析

參考 RxPermissions 的實現(xiàn)方式
Activity的結(jié)果獲取總是離不開系統(tǒng)的方式的,ActivityResult只是對系統(tǒng)的方式進行了一層包裝,通過使用Fragment來代理,在fragment的 startActivityForResult方法來實現(xiàn)Activity的跳轉(zhuǎn),在fragment中的onActivityResult方法,來回調(diào)我們的接口

ActivityResult.java 核心邏輯

 /**
   * 通過TAG查找ActivityResultFragment
   */
  Fragment findActivityResultFragment(Activity activity) {
    return activity.getFragmentManager().findFragmentByTag(TAG_ACTIVITY_RESULT_FRAGMENT);
  }

  private ActivityResultFragment getActivityResultFragment(Activity activity) {
    Fragment activityResultFragment = findActivityResultFragment(activity);
  //等于null表示,我們沒有在當前Activity加入fragment,
    if (activityResultFragment == null) {
      //創(chuàng)建一個ActivityResultFragment對象,通過FragmentManager#add方法添加到當前Activity中
      FragmentManager fragmentManager = activity.getFragmentManager();
      activityResultFragment = new ActivityResultFragment();
      fragmentManager.beginTransaction()
          .add(activityResultFragment, TAG_ACTIVITY_RESULT_FRAGMENT)
          .commitAllowingStateLoss();
      fragmentManager.executePendingTransactions();
    }
    return (ActivityResultFragment) activityResultFragment;
  }
/**
   * 以返回值方式打開對應(yīng)的界面
   * @param activityResultListener 可以為 null,null表示不需要處理返回值
   */
  public void forResult(@Nullable ActivityResultListener activityResultListener) {
    //給fragment設(shè)置我們的回調(diào)監(jiān)聽
    resultFragment.setActivityResultListener(activityResultListener);
  //綠色通道不走攔截器
    if (!greenChannel) {
      execIntercepts();
    } else {
      startActivity();
    }
  }

ActivityResultFragment.java

/**
 * @author lwg
 * @e-mail 13480020053@163.com
 * @time 1/4/18
 * @desc activity 結(jié)果代理fragment
 */

public class ActivityResultFragment extends Fragment {

  private ActivityResultListener activityResultListener;

  public ActivityResultFragment() {
  }

  public void setActivityResultListener(ActivityResultListener activityResultListener) {
    this.activityResultListener = activityResultListener;
  }

  @Override public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    //回調(diào)我們的結(jié)果監(jiān)聽
    if(activityResultListener!=null)
      activityResultListener.onReceiveResult(resultCode, data);
  }
}

更多博客內(nèi)容請關(guān)注:http://boke.liwg.top/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容