Android 全局Dialog的简单实现方法

作者:Donkor- 时间:2021-06-28 10:14:40 

前言:

这里所说的全局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);‘

来源:http://blog.csdn.net/donkor_/article/details/79303976

标签:Android,全局,Dialog
0
投稿

猜你喜欢

  • Spring如何利用@Value注解读取yml中的map配置

    2023-07-24 21:18:00
  • Java中常见的编码集问题总结

    2023-11-29 01:40:04
  • Android Studio安装配置方法图文详细教程

    2023-01-08 23:10:16
  • Java的“Goto”与标签及使用详解

    2023-11-11 03:56:09
  • Spring整合WebSocket应用示例(上)

    2023-05-05 10:09:21
  • C#中怎样从指定字符串中查找并替换字符串?

    2023-09-30 14:26:24
  • C#多线程实现异步接口

    2023-09-09 04:58:52
  • MyBatis Plus 入门使用详细教程

    2023-08-23 05:48:33
  • 详解Java数据库连接JDBC基础知识(操作数据库:增删改查)

    2023-08-22 23:47:37
  • Android 8.0实现蓝牙遥控器自动配对

    2021-08-05 08:24:16
  • Android自定义View详解

    2023-01-22 07:23:38
  • WindowsForm实现TextBox占位符Placeholder提示功能

    2023-03-18 12:57:44
  • 代码分析Android消息机制

    2023-07-26 09:44:44
  • c#使用DotNetZip封装类操作zip文件(创建/读取/更新)实例

    2023-04-08 02:00:19
  • C#中Lambda表达式的三种写法

    2022-03-27 02:50:27
  • 基于Java8实现提高Excel读写效率

    2023-11-25 10:01:37
  • C#实现添加多行文本水印到Word文档

    2023-03-22 07:45:33
  • C++实现LeetCode(159.最多有两个不同字符的最长子串)

    2023-06-20 22:39:46
  • Android实现底部状态栏切换的两种方式

    2022-03-11 02:46:47
  • C#使用foreach语句遍历堆栈(Stack)的方法

    2021-11-03 08:03:38
  • asp之家 软件编程 m.aspxhome.com