Android 全局Dialog的简单实现

2019-06-04 21:32:05

参考地址 Android 全局Dialog的简单实现

▲ 前言:


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

        }

    }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

再封装一个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);

    }


}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

最后需要MainActivity(主页面、主类)或者Service中处理Dialog的显示问题,通过AppManager获取到当前栈顶的Activity,用于构造Dialog就行了。


Dialog myDialog = new Dialog(AppManager.getAppManager().currentActivity(), R.style.dialog_style);

1

Done ヾ(◍°∇°◍)ノ゙


  • 2020-05-06 14:43:53

    bootstrap @media尺寸

    超大屏,1100分辨率,880分辨率,720分辨率,440分辨率以下

  • 2020-05-06 22:23:15

    使用querySelector添加移除style和class

    document.querySelector(selector).style.styleName = 样式 使用这个方法可以对dom节点添加和移除style样式,其中的styleName可以为css样式的任何值,如:display、color

  • 2020-05-07 13:05:28

    JavaScript中批量设置Css样式

    setAttribute() 方法添加指定的属性,并为其赋指定的值。 如果这个指定的属性已存在,则仅设置/更改值

  • 2020-05-07 13:07:21

    scrollBox 跑马灯滚动js

    ​这个插件可以很好的实现跑马灯,以及轮播图等效果,scrollBox js