Android 全局Dialog的简单实现方法

所属分类: 软件编程 / Android 阅读数: 52
收藏 0 赞 0 分享

前言:

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Android网络编程之获取网络上的Json数据实例

这篇文章主要介绍了Android网络编程之获取网络上的Json数据实例,本文用完整的代码实例讲解了在Android中读取网络中Json数据的方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中的windowSoftInputMode属性详解

这篇文章主要介绍了Android中的windowSoftInputMode属性详解,本文对windowSoftInputMode的9个属性做了详细总结,需要的朋友可以参考下
收藏 0 赞 0 分享

Android网络编程之UDP通信模型实例

这篇文章主要介绍了Android网络编程之UDP通信模型实例,本文给出了服务端代码和客户端代码,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中使用ListView实现漂亮的表格效果

这篇文章主要介绍了Android中使用ListView实现漂亮的表格效果,本文用详细的代码实例创建了一个股票行情表格,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中刷新界面的二种方法

这篇文章主要介绍了Android中刷新界面的二种方法,本文使用Handler、postInvalidate两种方法实现界面刷新,需要的朋友可以参考下
收藏 0 赞 0 分享

Android SDK三种更新失败及其解决方法

这篇文章主要介绍了Android SDK三种更新失败及其解决方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(一)

Android3.0(API level 11)开始,Android设备不再需要专门的菜单键。随着这种变化,Android app应该取消对传统6项菜单的依赖。取而代之的是提供anction bar来提供基本的用户功能
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(二)

这次将继续上一篇文章没有讲完的Menu的学习,上下文菜单(Context menu)和弹出菜单(Popup menu)
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(三)

今天继续昨天没有讲完的Menu的学习,主要是Popup Menu的学习,需要的朋友可以参考下
收藏 0 赞 0 分享

Android显示网络图片实例

这篇文章主要介绍了Android显示网络图片的方法,以实例形式展示了Android程序显示网络图片的方法,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多