android 多个activity同时更新数据,android activity之间数据传递更新UI(二)

第一句

剑走偏锋~

需求:实现下级页面回调更新上级页面

难点:无法获取上级页面的实例对象,通过上级页面的实例对象调用其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{

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 void PostChangeByModel(Class activityClass,T model){

// String key = keyByContext(activityClass);

// PostAction(model,key);

// }

// public static void PostChangeByModel(String activityName,T model) {

// PostAction(model,activityName);

// }

/**

* 下一级页面更新上级页面的函数

*

* @param model的范型

* @param context 当前页面的context

* @param model 回调更新的model

*/

public static void PostChangeByModel(Context context,T model){

String key = keyByContext(context);

PostAction(model,key);

}

public static void PostChangeByModel(String activityName,T model) {

PostAction(model,activityName);

}

/***************************************************************************************************/

/*********************************************下面都是私有方法 不用管的***********************************************/

/***************************************************************************************************/

/**

* 页面间消息传递

* 采用匿名累,超微量级别的,用于页面间回调更新

* 实时回调,startActivityForResult是等待上一个页面finish才会调用

* */

// 变量

private static KapActivityInfoTransferManager share = new KapActivityInfoTransferManager();

private KapActivityInfoTransferManager(){}//单利模式

private Map 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 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() {

@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() {

@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() {

@Override

public void changeUIByModel(KapPasswordSetActivity model) {

KapApplication.homeActivityChangeAction();//跳到主页

}

});

}

// 设置密码页面

private void okButtonAction(){

KapActivityInfoTransferManager.PostChangeByModel(this,"KapPasswordSetActivity");

}

更多使用:看你们需要了~

注意!!! 因为,我的这些操作都是在mainthread的,所以这个类没有处理线程

在主线程更新UI

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值