触发指令后在堆栈中最后一个压入的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