溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android開(kāi)發(fā)怎么實(shí)現(xiàn)Application跳出dialog

發(fā)布時(shí)間:2022-06-09 09:31:47 來(lái)源:億速云 閱讀:706 作者:zzz 欄目:開(kāi)發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“Android開(kāi)發(fā)怎么實(shí)現(xiàn)Application跳出dialog”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Android開(kāi)發(fā)怎么實(shí)現(xiàn)Application跳出dialog”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

實(shí)踐過(guò)程

場(chǎng)景還原

線程中監(jiān)測(cè)和硬件的連接,在任何斷開(kāi)的話需要彈出框給用戶選擇是否重新連接。

所以我們的思路就是不使用依托于Activity的Dialog,而是使用依托于Aplication的Dialog。

Android開(kāi)發(fā)怎么實(shí)現(xiàn)Application跳出dialog

開(kāi)始

首先是動(dòng)態(tài)申請(qǐng)權(quán)限

<!--這行代碼必須存在,否則點(diǎn)擊不了系統(tǒng)設(shè)置中的按鈕-->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>  
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />

用戶不同意?那就用不了App就行了,我們一般都是如果沒(méi)給權(quán)限直接退出應(yīng)用。

現(xiàn)在哪個(gè)App不是必須要權(quán)限,看似允許用戶自主同意,但哪個(gè)不是拒絕后無(wú)法使用功能。

所以不用太糾結(jié)。

接著在硬件設(shè)備斷開(kāi)連接的回調(diào)中處理

//設(shè)備斷開(kāi)連接的回調(diào)  isAutoConnectDlg是個(gè)dialog彈框

override fun onClientRemove(address: String?, alias: String?) {
    //禁止外部點(diǎn)擊取消
    isAutoConnectDlg!!.setCanceledOnTouchOutside(false)
    isAutoConnectDlg!!.setCancelable(false)
    dlgWindows.setWindowAnimations(R.style.DialogRight)
    //重要 設(shè)置彈框類型
    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()
}

之后在連接成功的回調(diào)中取消該彈框即可。

至此基本就可以了。但是還有個(gè)特殊情況,就是彈出框后用戶按下了Home也就是回到了桌面,或者是Android的后臺(tái)殺進(jìn)程界面 都會(huì)造成該彈框顯示,影響不太好。

這時(shí)候就需要我們自定義Application,然后實(shí)現(xiàn)ActivityLifecycleCallbacks接口即可,該接口在Android 4.0 就已經(jīng)退出了,注冊(cè)后,所有的Activity生命周期都會(huì)回調(diào),方便監(jiān)聽(tīng)處理業(yè)務(wù)。

因?yàn)檫M(jìn)入后臺(tái)頁(yè)面,Activity的pause和stop這些就會(huì)執(zhí)行,我們每個(gè)Activity去監(jiān)聽(tīng)不太合適,所以ActivityLifecycleCallbacks是很好的選擇。

class MyApp : Application(), Application.ActivityLifecycleCallbacks {
    override fun onCreate() {
        super.onCreate()
        registerActivityLifecycleCallbacks(this)
    }
    override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
        TODO("Not yet implemented")
    }
    override fun onActivityStarted(activity: Activity) {
        TODO("Not yet implemented")
    }
    override fun onActivityResumed(activity: Activity) {
        TODO("Not yet implemented")
    }
    override fun onActivityPaused(activity: Activity) {
        //在這進(jìn)行彈框處理
    }
    override fun onActivityStopped(activity: Activity) {
        //在這進(jìn)行彈框處理
    }
    override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
        TODO("Not yet implemented")
    }
    override fun onActivityDestroyed(activity: Activity) {
        TODO("Not yet implemented")
    }
}

可能會(huì)遇見(jiàn)的bug

permission denied for window type 2003

就是沒(méi)有動(dòng)態(tài)申請(qǐng)權(quán)限導(dǎo)致的問(wèn)題。

Android開(kāi)發(fā)怎么實(shí)現(xiàn)Application跳出dialog

讀到這里,這篇“Android開(kāi)發(fā)怎么實(shí)現(xiàn)Application跳出dialog”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI