模拟一场景:比如集成后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();
}
}