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/