1:创建一个管理类ActivityManager,该类包含成员变量任务栈Stack<Activity>(大佬可自行查找资料),用于保存你所打开的Activity
2:在自定义的Receiver中,通过ActivityManager获取当前栈顶元素Activity作为Dialog的参数开启Dialog。
3:自定义MyFragmentDialog继承DialogFragment,便于管理生命周期。例如,我们打开下个Activity关闭dialog,可以在自定义Dialog 函数onPause()中执行dismiss();
遇到的问题:
(1)最开始直接使用了Receiver中的context。报错,提示dialog必须要在Activity中展示。
最开始解决方案:将DIalog提升到系统级别,不过被公司大佬排除了,因为APP退到后台应用时,弹窗还在显示。体验太差了。(TalkDialog是我自己定义的Dialog,继承的是AlertDialog。后面重写的MyFragmentDialog也是用的这个)
TalkDialog talkDialog = new TalkDialog(ActivityManager.getInstance().currentActivity(), msgItem);
if (Build.VERSION.SDK_INT >= 26) {//将弹窗设置为系统级别的talkDialog.getWindow().setType((WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY));
} else {talkDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
}
(2)体验太差,只能换一种方式了。跟大佬一阵交流之后,确定了两种方案。其中之一,就是最上面那一个了。实现代码不难,就不贴了。