前言:
这里所说的全局 Dialog 是指无论当前应用是处于哪一个页面上, 都能够及时弹出 Dialog 来提示用户一些信息, 用户体验不会很好, 一般应用于优先级非常高的通知
分析 :
想要实现无论当前应用是处于哪一个页面上, 都能够及时弹出 Dialog 功能其实很简单, 只要能获取到当前显示的 Activity 就行了, 也就是栈顶的 Activity
实现过程 :
一般项目中我们都会通过一个类来管理我们的 Activity, 即 AppManager
- /**
- * Activity 管理类
- * @author Donkor
- */
- public class AppManager {
- private static Stack < Activity > activityStack;
- private static AppManager instance;
- private AppManager() {}
- /**
- * 单一实例
- */
- public static AppManager getAppManager() {
- if (instance == null) {
- instance = new AppManager();
- }
- return instance;
- }
- /**
- * 添加 Activity 到堆栈
- */
- public void addActivity(Activity activity) {
- if (activityStack == null) {
- activityStack = new Stack < Activity > ();
- }
- activityStack.add(activity);
- }
- /**
- * 获取当前 Activity(堆栈中最后一个压入的)
- */
- public Activity currentActivity() {
- Activity activity = activityStack.lastElement();
- return activity;
- }
- /**
- * 结束当前 Activity(堆栈中最后一个压入的)
- */
- public void finishActivity() {
- Activity activity = activityStack.lastElement();
- if (activity != null) {
- activity.finish();
- activity = null;
- }
- }
- /**
- * 结束指定的 Activity
- */
- public void finishActivity(Activity activity) {
- if (activity != null) {
- activityStack.remove(activity);
- activity.finish();
- activity = null;
- }
- }
- /**
- * 结束指定类名的 Activity
- */
- public void finishActivity(Class < ?>cls) {
- for (Activity activity: activityStack) {
- if (activity.getClass().equals(cls)) {
- finishActivity(activity);
- }
- }
- }
- /**
- * 结束所有 Activity
- */
- public void finishAllActivity() {
- for (int i = 0, size = activityStack.size(); i < size; i++) {
- if (null != activityStack.get(i)) {
- activityStack.get(i).finish();
- }
- }
- activityStack.clear();
- }
- /**
- * 退出应用程序
- */
- public void AppExit(Context context) {
- try {
- finishAllActivity();
- ActivityManager activityMgr = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
- activityMgr.restartPackage(context.getPackageName());
- System.exit(0);
- } catch(Exception e) {
- e.printStackTrace();
- }
- }
- }
再封装一个 BaseActivity 类统一管理, 给各个 Activity 继承
- /**
- * Activity 基类
- * @author Donkor
- */
- public abstract class BaseActivity extends AppCompatActivity {
- @Override
- protected void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // 将 Activity 实例添加到 AppManager 的堆栈
- AppManager.getAppManager().addActivity(this);
- }
- @Override
- protected void onDestroy() {
- super.onDestroy();
- // 将 Activity 实例从 AppManager 的堆栈中移除
- AppManager.getAppManager().finishActivity(this);
- }
- }
最后需要 MainActivity(主页面主类) 或者 Service 中处理 Dialog 的显示问题, 通过 AppManager 获取到当前栈顶的 Activity, 用于构造 Dialog 就行了
Dialog myDialog = new Dialog(AppManager.getAppManager().currentActivity(), R.style.dialog_style);
Done (°°)ノ゙
来源: http://blog.csdn.net/donkor_/article/details/79303976