Android开发怎么实现Application跳出dialog
导读:本文共1905字符,通常情况下阅读需要6分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 实践过程场景还原线程中监测和硬件的连接,在任何断开的话需要弹出框给用户选择是否重新连接。所以我们的思路就是不使用依托于Activity的Dialog,而是使用依托于Aplication的Dialog。开始首先是动态申请权限<!--这行代码必须存在,否则点击不了系统设置中的按钮--><uses-permissionandroid:name=&q... ...
目录
(为您整理了一些要点),点击可以直达。实践过程
场景还原
线程中监测和硬件的连接,在任何断开的话需要弹出框给用户选择是否重新连接。
所以我们的思路就是不使用依托于Activity的Dialog,而是使用依托于Aplication的Dialog。
开始
首先是动态申请权限
<!--这行代码必须存在,否则点击不了系统设置中的按钮--><uses-permissionandroid:name="android.permission.SYSTEM_ALERT_WINDOW"/><uses-permissionandroid:name="android.permission.SYSTEM_OVERLAY_WINDOW"/>
用户不同意?那就用不了App就行了,我们一般都是如果没给权限直接退出应用。
现在哪个App不是必须要权限,看似允许用户自主同意,但哪个不是拒绝后无法使用功能。
所以不用太纠结。
接着在硬件设备断开连接的回调中处理
//设备断开连接的回调 isAutoConnectDlg是个dialog弹框
overridefunonClientRemove(address:String?,alias:String?){//禁止外部点击取消isAutoConnectDlg!!.setCanceledOnTouchOutside(false)isAutoConnectDlg!!.setCancelable(false)dlgWindows.setWindowAnimations(R.style.DialogRight)//重要设置弹框类型if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){dlgWindows.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY)}else{dlgWindows.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)}dlgWindows.setLayout(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT)isAutoConnectDlg!!.show()}
之后在连接成功的回调中取消该弹框即可。
至此基本就可以了。但是还有个特殊情况,就是弹出框后用户按下了Home也就是回到了桌面,或者是Android的后台杀进程界面 都会造成该弹框显示,影响不太好。
这时候就需要我们自定义Application,然后实现ActivityLifecycleCallbacks接口即可,该接口在Android 4.0 就已经退出了,注册后,所有的Activity生命周期都会回调,方便监听处理业务。
因为进入后台页面,Activity的pause和stop这些就会执行,我们每个Activity去监听不太合适,所以ActivityLifecycleCallbacks是很好的选择。
classMyApp:Application(),Application.ActivityLifecycleCallbacks{overridefunonCreate(){super.onCreate()registerActivityLifecycleCallbacks(this)}overridefunonActivityCreated(activity:Activity,savedInstanceState:Bundle?){TODO("Notyetimplemented")}overridefunonActivityStarted(activity:Activity){TODO("Notyetimplemented")}overridefunonActivityResumed(activity:Activity){TODO("Notyetimplemented")}overridefunonActivityPaused(activity:Activity){//在这进行弹框处理}overridefunonActivityStopped(activity:Activity){//在这进行弹框处理}overridefunonActivitySaveInstanceState(activity:Activity,outState:Bundle){TODO("Notyetimplemented")}overridefunonActivityDestroyed(activity:Activity){TODO("Notyetimplemented")}}
可能会遇见的bug
permission denied for window type 2003
就是没有动态申请权限导致的问题。
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
Android开发怎么实现Application跳出dialog的详细内容,希望对您有所帮助,信息来源于网络。