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