触发指令后在堆栈中最后一个压入的Activity中弹框
来源:互联网 发布:电子菜谱软件下载 编辑:程序博客网 时间:2024/05/22 13:52
模拟一场景:比如集成后Jpush后,用户打开了App中的任意一个界面【Activity】,通过后台发送了一条通知消息,接收到消息后,需要弹出一个框来进行提示,解决办法如下:
1、创建一个BaseActivity为Activity的父类,在创建每一个Activity时都需要记录一次
2、使用EventBus(事件总线)来进行数据传送,在BaseActivity进行订阅
以上两点都是在oncreate中记录
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.mContext = this.mActivity = this; EventBus.getDefault().register(this); AppManager.getAppManager().addActivity(this); }
3、在接收方法中进行Dialog的初始化及弹框判断
@Subscribe(threadMode = ThreadMode.MAIN) public void receiver(MyModel model) { if (model != null) { Log.e(TAG, "收到推送消息"); //打开对话框 if (alertDialog != null && alertDialog.isShowing() == false) initDialog(); else if (alertDialog != null && alertDialog.isShowing()) { Log.e(TAG, "已经有activity打开了对话框 "); removeOtherActivity(); } else { initDialog(); removeOtherActivity(); } } }
注:如果不进行判断会出现一个问题,只要是继承了这个BaseActivity的子类在堆栈还没有被销毁就会弹框,具体可以去研究一个生命周期,我们的需求是只针对堆栈中最后一个压入的Activity做操作,所以要把在onPause和CurrentActivity之外的Activity的Dialog进行Dismiss掉
解决办法:
protected void removeOtherActivity() { List<Activity> list = AppManager.getActivityStack(); for (Activity activity : list) { if (activity != AppManager.getAppManager().currentActivity()) { if (((BaseActivity) activity).alertDialog != null) { ((BaseActivity) activity).alertDialog.dismiss(); } } else { break; } } } @Override protected void onPause() { super.onPause(); removeOtherActivity(); }
附上完整代码:
BaseActivity.class
package com.czb.mysdk.activity;import android.app.Activity;import android.app.AlertDialog;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.os.Bundle;import android.support.v4.app.Fragment;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.Gravity;import android.view.KeyEvent;import android.view.View;import android.view.Window;import android.view.WindowManager;import android.widget.ArrayAdapter;import org.greenrobot.eventbus.EventBus;import org.greenrobot.eventbus.Subscribe;import org.greenrobot.eventbus.ThreadMode;import java.util.List;import com.czb.mysdk.R;import com.czb.mysdk.model.SensorModel;/** * @#类 说 明:基础的Activity. * Created by AnmiLin on 2017/9/26. */public class BaseActivity extends AppCompatActivity { protected String TAG = getClass().getName(); protected Context mContext; protected Activity mActivity; protected AlertDialog alertDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.mContext = this.mActivity = this; EventBus.getDefault().register(this); AppManager.getAppManager().addActivity(this); } protected void initDialog() { AlertDialog.Builder normalDialog = new AlertDialog.Builder(this); normalDialog.setTitle("提示"); alertDialog = normalDialog.create(); alertDialog.setTitle("我是一个普通Dialog"); alertDialog.setMessage("你要点击哪一个按钮呢?"); alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { alertDialog.dismiss(); } }); alertDialog.show(); } @Override protected void onDestroy() { AppManager.getAppManager().removeActivity(this); EventBus.getDefault().unregister(this); if (alertDialog != null) alertDialog.dismiss(); super.onDestroy(); } /** * 跳转activity * * @param clazz 目标activity * @param bundle 携带信息 */ public static void go2Act(Context context, Class<? extends Activity> clazz, Bundle bundle) { Intent intent = new Intent(context, clazz); if (bundle != null) intent.putExtras(bundle); context.startActivity(intent); } /** * 跳转activity * * @param clazz */ public static void go2Act(Context context, Class<? extends Activity> clazz) { go2Act(context, clazz, null); } @Subscribe(threadMode = ThreadMode.MAIN) public void receiver(SensorModel model) { if (model != null) { Log.e(TAG, "收到推送消息"); //打开对话框 if (alertDialog != null && alertDialog.isShowing() == false) initDialog(); else if (alertDialog != null && alertDialog.isShowing()) { Log.e(TAG, "已经有activity打开了对话框 "); removeOtherActivity(); } else { initDialog(); removeOtherActivity(); } } } protected void removeOtherActivity() { List<Activity> list = AppManager.getActivityStack(); for (Activity activity : list) { if (activity != AppManager.getAppManager().currentActivity()) { if (((BaseActivity) activity).alertDialog != null) { ((BaseActivity) activity).alertDialog.dismiss(); } } else { break; } } } @Override protected void onPause() { super.onPause(); removeOtherActivity(); }}
用于记录Activity的管理类
AppManager.class
package com.czb.mysdk.activity;import android.app.Activity;import android.content.Context;import android.util.Log;import java.util.LinkedList;import java.util.List;import java.util.Stack;/** * @类名称:AppManager * @类描述: 应用程序Activity管理类:用于Activity管理和应用程序退出 * @创建人:AnmiLin */public class AppManager { private final static String TAG=AppManager.class.getSimpleName(); private static List<Activity> activityStack = new LinkedList<Activity>(); private static AppManager instance = new AppManager(); private AppManager() { } public static List<Activity> getActivityStack() { return activityStack; } /** * 单一实例 */ public static AppManager getAppManager() { return instance; } /** * 添加Activity到堆栈 */ public void addActivity(Activity activity) { if (activityStack == null) { activityStack = new Stack<Activity>(); } activityStack.add(activity); } /** * 获取当前Activity(堆栈中最后一个压入的) */ public Activity currentActivity() { Activity activity = null; try { Log.i(TAG,"当前Activity总数量=" + activityStack.size()); if (activityStack.size() > 0) { activity = activityStack.get(activityStack.size() - 1); Log.i(TAG,"当前的acitivity=" + activity); } } catch (Exception e) { e.printStackTrace(); } return activity; } /** * 结束当前Activity(堆栈中最后一个压入的) */ public void finishActivity() { if (activityStack.size() > 0) { Activity activity = activityStack.get(activityStack.size() - 1); if (activity != null) { removeActivity(activity); activity.finish(); } } } /** * 结束指定的Activity */ public void finishActivity(Activity activity) { if (activity != null) { removeActivity(activity); activity.finish(); } } /** * 结束指定类名的Activity */ public void finishActivity(Class<?> cls) { for (int i=activityStack.size()-1;i>=0;i--) { Activity activity = activityStack.get(i); if (activity.getClass().equals(cls)) { finishActivity(activity); } } } /** * 结束所有Activity */ public void finishAllActivity() { for (int i=activityStack.size()-1;i>=0;i--) { Activity activity = activityStack.get(i); finishActivity(activity); } } /** * @Title: finishOtherActivity * @说 明:结束除传如的Activity外其他的Activity * @参 数: @param mActivity 不结束的activity */ public void finishOtherActivity(Activity mActivity) { for (int i=activityStack.size()-1;i>=0;i--) { if (!activityStack.get(i).getClass().equals(mActivity.getClass())) { finishActivity(activityStack.get(i)); } } } /** * 结束除指定类名的Activity */ public void finishOtherActivity(Class<?> cls) { for (int i=activityStack.size()-1;i>=0;i--) { Activity activity = activityStack.get(i); if (!activity.getClass().equals(cls)) { finishActivity(activity); } } } /** * 从列表中移除插件activity,并没有finish * @param pluginActivity */ public void removeActivity(Activity pluginActivity){ boolean isremove = activityStack.remove(pluginActivity); Log.e(TAG, "removeActivity:" + pluginActivity + " --> " + isremove); } /** * 关闭这个activity上面的所有activity,并返回这个activity * @param activityName * @return */ public Activity finishThisUpActivity(String activityName){ for (int i=activityStack.size()-1;i>=0;i--) { Activity activity = activityStack.get(i); if (!activity.getClass().getName().equals(activityName)) { finishActivity(activity); }else{ return activity; } } return null; } /** * 退出应用程序 */ public void AppExit(Context context) { try { finishAllActivity(); android.os.Process.killProcess(android.os.Process.myPid()); System.exit(0); } catch (Exception e) { e.printStackTrace(); } } @Override public String toString() { return "AppManager [activityStack.size()="+activityStack.size(); }}
阅读全文
1 0
- 触发指令后在堆栈中最后一个压入的Activity中弹框
- C语言中的可变参数-printf的实现原理 在C/C++中,对函数参数的扫描是从后向前的。C/C++的函数参数是通过压入堆栈的方式来给函数传参数的(堆栈是一种先进后出的数据结构),最先压入的参数最后出
- android中在广播中弹出pop框的局限性
- 如何在ASP.net 中 在textbox中按下回车后,触发一个按扭的Click事件?
- 在onActivityResult中弹出DialogFragment的解决方案 activity和fragment
- Qt中在QLabel上载入图片后在上面画矩形框的方法
- 判断一个activity是否存在堆栈中
- 简单的在Servlet中弹出对话框,确定后返回
- 实现开启一个activity后,不出现在对应的recent列表中
- Android 中Activity的启动方式和Activity在堆栈情况分析
- skynet源码学习 - 从全局队列中弹出/压入一个消息队列过程
- 在网页中弹出一个小的警告小窗口
- 在服务中弹出alertDialog和activity
- 在一个Activity中启另一个Activity的方法
- 在一个Activity中 关闭指定的Activity
- 《如何在一个Activity的一部分中显示其他Activity》
- 在任意一个Activity中,怎么销毁指定的Activity?
- 在一个Activity中获取另一个Activity的上下文
- 友盟集成工具,解决双击无法运行的问题
- Pull is not possible because you have unmerged files.
- 第八周(2)项目2—对称矩阵压缩存储的实现与应用
- mysql5.7.18 修改密码
- 深度学习模型---卷积神经网络
- 触发指令后在堆栈中最后一个压入的Activity中弹框
- android 依赖
- VS2017(visual studio 2017)激活码
- mongo java调用示例
- Java 集合深入理解(3):Collection
- Map json list set 对象之间转换
- 关于 inc2l
- opencv学习——画线、圆、文字
- java读取配置文件(.properties)