第一句
剑走偏锋~
需求:实现下级页面回调更新上级页面
难点:无法获取上级页面的实例对象,通过上级页面的实例对象调用其public方法的路走不通了
实现:通过创建了一个manager来统一回调,整个app用同一份机制来同步UI
代码:
/**
* Created by jing on 2017/6/20.
* 页面间回调 以及传递~~
*/
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import java.util.HashMap;
import java.util.Map;
public class KapActivityInfoTransferManager {
/***************************************************************************************************/
/*********************************************回调更新***********************************************/
/***************************************************************************************************/
/**
* InfoTransferModelInterface 不带tag的回调
* InfoTransferTagModelInterface 带tag的回调
* */
public interface InfoTransferModelInterface<T>{
void changeUIByModel(T model);
}
// ************* 经过我的使用发现 想法有点错误,于是改了改,原因自己体会~~ **************
// /**
// * 上级页面绑定更新
// * BindChangeModel 上级页面注册回调
// * @param context 上级页面
// * */
// public static void BindChangeModel(Context context, InfoTransferModelInterface changeModel){
// String key = keyByContext(context);
// BindAction(key,changeModel);
// }
// public static void BindChangeModel(String activityName,InfoTransferModelInterface changeModel){
// BindAction(activityName,changeModel);
// }
/**
* 上级页面绑定更新
*
* @param activityClass 下级页面的activity Class
* @param changeModel 回调更新注册
*/
public static void BindChangeModel(Class activityClass, InfoTransferModelInterface changeModel){
String key = keyByContext(activityClass);
BindAction(key,changeModel);
}
public static void BindChangeModel(String activityName,InfoTransferModelInterface changeModel){
BindAction(activityName,changeModel);
}
public static void BindChangeModel(Intent activityIntent,InfoTransferModelInterface changeModel){
String key = activityIntent.getComponent().getClassName();
if (key == null) return;
BindAction("class " + key,changeModel);
}
// ************* 经过我的使用发现 想法有点错误,于是改了改,原因自己体会~~ **************
// /**
// * 下一级页面更新上级页面的函数
// *
// * PostChangeByModel 下级页面发起回调
// * @param activityClass 上级页面的class
// * */
// public static<T> void PostChangeByModel(Class activityClass,T model){
// String key = keyByContext(activityClass);
// PostAction(model,key);
// }
// public static<T> void PostChangeByModel(String activityName,T model) {
// PostAction(model,activityName);
// }
/**
* 下一级页面更新上级页面的函数
*
* @param <T> model的范型
* @param context 当前页面的context
* @param model 回调更新的model
*/
public static<T> void PostChangeByModel(Context context,T model){
String key = keyByContext(context);
PostAction(model,key);
}
public static<T> void PostChangeByModel(String activityName,T model) {
PostAction(model,activityName);
}
/***************************************************************************************************/
/*********************************************下面都是私有方法 不用管的***********************************************/
/***************************************************************************************************/
/**
* 页面间消息传递
* 采用匿名累,超微量级别的,用于页面间回调更新
* 实时回调,startActivityForResult是等待上一个页面finish才会调用
* */
// 变量
private static KapActivityInfoTransferManager share = new KapActivityInfoTransferManager();
private KapActivityInfoTransferManager(){}//单利模式
private Map<String,InfoTransferModelInterface> hashMap = new HashMap<>();
/**
* 下面都是私有方法了::::
*
* BindAction 上级页面注册回调
* PostAction 下级页面发起回调
* */
private static void BindAction(String key,InfoTransferModelInterface changeModel){
if (changeModel == null) return;
if (key == null) return;
share.hashMap.put(key,changeModel);
}
private static<T> void PostAction(T model,String key){
if (key == null) return;
InfoTransferModelInterface infoTransferModelInterface = share.hashMap.get(key);
if (infoTransferModelInterface == null) return;// 不存在
try {
infoTransferModelInterface.changeUIByModel(model);
}catch (Exception e){// 野指针
share.hashMap.remove(infoTransferModelInterface);
}
}
/**
* keyByContext 辅助方法,获取key
*/
private static String keyByContext(Context context){
if (context == null) return null;
return context.getClass().toString();
}
private static String keyByContext(Class activityClass){
if (activityClass == null) return null;
return activityClass.toString();
}
}
使用(一):
场景:a activity start b activity
b获取了一张图片 在 a的image上显示出来
a: KapMineCenterActivity
b: KapChangeImageActivity
// a 页面
KapActivityInfoTransferManager.BindChangeModel(KapChangeImageActivity.class, new KapActivityInfoTransferManager.InfoTransferModelInterface<Bitmap>() {
@Override
public void changeUIByModel(Bitmap model) {
KapMineCenterActivity.this.imageView.setImageBitmap(model);
}
});
// b页面
// KapMineCenterActivity.class 就是a的class(类名绑定的)
KapActivityInfoTransferManager.PostChangeByModel( this,bitmap);
使用(二):
场景:注册页面和忘记密码页面都跳转到设置密码页面,设置密码页面有个确定按钮。
当注册页面跳转到设置密码时候,点击确定跳到完善资料
当忘记密码跳转的设置密码时候,点击确定跳到主页
a:
b:KapPasswordSetActivity.class
代码:
// 注册页面
private void startPassWordSetingActivity(){
// 跳到设置密码
startActivity(new Intent(this, KapPasswordSetActivity.class));
KapActivityInfoTransferManager.BindChangeModel("KapPasswordSetActivity", new KapActivityInfoTransferManager.InfoTransferModelInterface<KapPasswordSetActivity>() {
@Override
public void changeUIByModel(KapPasswordSetActivity model) {
//跳到完成资料页面
startActivity(new Intent(model, KapCompleteMaterialActivity.class));
}
});
}
// 忘记密码页面
private void startPassWordSetingActivity(){
// 跳到设置密码
startActivity(new Intent(this, KapPasswordSetActivity.class));
KapActivityInfoTransferManager.BindChangeModel("KapPasswordSetActivity", new KapActivityInfoTransferManager.InfoTransferModelInterface<KapPasswordSetActivity>() {
@Override
public void changeUIByModel(KapPasswordSetActivity model) {
KapApplication.homeActivityChangeAction();//跳到主页
}
});
}
// 设置密码页面
private void okButtonAction(){
KapActivityInfoTransferManager.PostChangeByModel(this,"KapPasswordSetActivity");
}
更多使用:看你们需要了~