触发指令后在堆栈中最后一个压入的Activity中弹框

  模拟一场景:比如集成后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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值