Android桌面彈框?qū)崿F(xiàn)

在開發(fā)過程中汞扎,會(huì)遇到需要在桌面顯示彈框的需求,這個(gè)與app在前臺(tái)既棺,在應(yīng)用中彈框還是有寫區(qū)別的康二。

既然需求中是要彈出一個(gè)彈框,那就有兩種方式可以實(shí)現(xiàn):一是在桌面上彈出一個(gè)真正的Dialog递沪;另外還可以創(chuàng)建一個(gè)dialog樣式的Activity豺鼻。本篇文章主要介紹如何在開發(fā)中彈出系統(tǒng)級的Dialog。

閑話少說款慨,還是切入正題儒飒,談一談今天要說的桌面彈框的實(shí)現(xiàn)。

這個(gè)例子是在app收到推送的時(shí)候檩奠,如果app在前臺(tái)運(yùn)行桩了,不管是在哪任何一個(gè)Activity都可以彈框,如果在后臺(tái)運(yùn)行就在桌面彈框埠戳,這就使得開發(fā)者在開發(fā)過程中井誉,不可能在某一個(gè)Activity中寫入彈窗的代碼,那樣子只會(huì)在某一個(gè)Activity可見時(shí)彈出整胃。并不能實(shí)現(xiàn)需求颗圣。

1:在AndroidManifest.xml清單文件中添加懸浮窗權(quán)限


<use-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

2:在接收到推送的時(shí)候,不建議直接彈出懸浮框,因?yàn)檫€有可能用戶并沒有授權(quán)該權(quán)限在岂,因?yàn)樯暾堅(jiān)摍?quán)限授權(quán)要調(diào)到設(shè)置頁面荚藻,并在Activity的OnActivityResult中獲取是否獲得權(quán)限,所以還是發(fā)個(gè)廣播洁段,給BasicActivity应狱,在BasicActivity中判斷是否授權(quán)允許,是否可以直接彈框祠丝。但是因?yàn)槭窃贐asicActivity中申請的權(quán)限疾呻,所以每一個(gè)Activity都會(huì)收到廣播,這就需要在彈出框之后写半,標(biāo)記一下岸蜗,以免按返回鍵到上一個(gè)Activity時(shí)多次彈框。

public void showDialg(Context context) {
        HintDialog hintDialog = new HintDialog(context, "在桌面彈框", new String[]{"同意", "同意"});
        hintDialog.setCanceledOnTouchOutside(false);
        hintDialog.setCallback(new HintDialog.Callback() {
            @Override
            public void callback() {

            }

            @Override
            public void cancle() {

            }
        });
//記得這句話不要忘了
        hintDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
        hintDialog.setTiShiText("審核申請");
        hintDialog.show();
    }

這種方法就可以實(shí)現(xiàn)此功能叠蝇。


但是要記得這句話璃岳,一定要給Dialog加上去,這是讓Dialog悔捶,變成系統(tǒng)彈框铃慷。
3:不過在安卓6.0發(fā)布以后,權(quán)限機(jī)制發(fā)生了一些改變蜕该,在6.0以后犁柜,當(dāng)app需要我們授予某些權(quán)限時(shí),是需要去詢問用戶是否開啟權(quán)限的堂淡。權(quán)限分為兩種馋缅,一種是Normal Permissions,這類權(quán)限一般不涉及用戶隱私绢淀,不需要用戶授權(quán)萤悴。另一種是Dangerous Permission,這些一般都是涉及到用戶隱私皆的,需要用戶授權(quán)覆履。
同樣,在6.0以上祭务,如果想實(shí)現(xiàn)這個(gè)需求内狗,同樣需要用戶授權(quán)該權(quán)限。
但是申請?jiān)摍?quán)限和申請其他的如打電話權(quán)限等有些不同义锥,這個(gè)權(quán)限需要調(diào)到該應(yīng)用的權(quán)限設(shè)置頁面,讓用戶自己去授權(quán)岩灭。
實(shí)現(xiàn)方法如下:

if(Build.VERSION.SDK_INT>=23) {
insertDummyContactWrapper();
}

檢查版本是否大于23拌倍,如果大于23,就需要申請?jiān)摍?quán)限
下面代碼是在BasicActivity中檢查申請權(quán)限的。

final private intOVERLAY_PERMISSION_REQ_CODE=1234;//申請懸浮窗權(quán)限碼
 /**
     * 動(dòng)態(tài)權(quán)限檢查
     */
    @TargetApi(Build.VERSION_CODES.M)
    private void insertDummyContactWrapper() {
        if (!Settings.canDrawOverlays(MainActivity.this)) {
            showMessageOKCancel("請?jiān)趹?yīng)用權(quán)限中允許\n\t打開懸浮窗權(quán)限",
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            //申請?jiān)摍?quán)限時(shí)引導(dǎo)用戶跳轉(zhuǎn)到Setting中自己去開啟權(quán)限開關(guān)
                            Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,   Uri.parse("package:" + BasicActivity.this.getPackageName()));
                            startActivityForResult(intent, OVERLAY_PERMISSION_REQ_CODE);
                        }
                    });
        } else {
            // Already hold the SYSTEM_ALERT_WINDOW permission, do addview or something         
        }
    }
/**
*懸浮窗權(quán)限再?zèng)]有授權(quán)的情況下柱恤,彈框讓用戶選擇是否調(diào)到權(quán)限設(shè)置頁面去申請?jiān)摍?quán)限
*/
private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
        new AlertDialog.Builder(this)
                .setMessage(message)
                .setPositiveButton("確定", okListener)
                .setNegativeButton("拒絕", null)
                .create()
                .show();
    }

申請懸浮窗權(quán)限還有一點(diǎn)和申請其他權(quán)限不同数初,就是申請其他權(quán)限都是onRequestPermissionsResult 在這個(gè)里面監(jiān)測是否授權(quán),但是申請懸浮窗權(quán)限梗顺,需要在onActivityResult這里判斷用戶是否授權(quán)

 @TargetApi(Build.VERSION_CODES.M)
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == OVERLAY_PERMISSION_REQ_CODE) {
            if (!Settings.canDrawOverlays(this)) {//權(quán)限未被允許

            } else {//權(quán)限被允許
           //在這里可以彈出懸浮框
            }
        }
    }

到這里為止泡孩,申請懸浮窗和彈出懸浮窗就可以實(shí)現(xiàn)了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寺谤,一起剝皮案震驚了整個(gè)濱河市仑鸥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌变屁,老刑警劉巖眼俊,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異粟关,居然都是意外死亡疮胖,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門闷板,熙熙樓的掌柜王于貴愁眉苦臉地迎上來澎灸,“玉大人,你說我怎么就攤上這事遮晚』骱ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵鹏漆,是天一觀的道長巩梢。 經(jīng)常有香客問我,道長艺玲,這世上最難降的妖魔是什么括蝠? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮饭聚,結(jié)果婚禮上忌警,老公的妹妹穿的比我還像新娘。我一直安慰自己秒梳,他們只是感情好法绵,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著酪碘,像睡著了一般朋譬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上兴垦,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天徙赢,我揣著相機(jī)與錄音字柠,去河邊找鬼。 笑死狡赐,一個(gè)胖子當(dāng)著我的面吹牛窑业,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播枕屉,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼常柄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了搀擂?” 一聲冷哼從身側(cè)響起西潘,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哥倔,沒想到半個(gè)月后秸架,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咆蒿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年东抹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沃测。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缭黔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蒂破,到底是詐尸還是另有隱情馏谨,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布附迷,位于F島的核電站惧互,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏喇伯。R本人自食惡果不足惜喊儡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望稻据。 院中可真熱鬧艾猜,春花似錦、人聲如沸捻悯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽今缚。三九已至算柳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間荚斯,已是汗流浹背埠居。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工查牌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留事期,地道東北人滥壕。 一個(gè)月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像兽泣,于是被迫代替她去往敵國和親绎橘。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,756評論 25 707
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程唠倦,因...
    小菜c閱讀 6,365評論 0 17
  • 一称鳞、引言 隨著Android6.0發(fā)布,系統(tǒng)增加了一些新的特性和功能稠鼻。這次的發(fā)布介紹了一種新的權(quán)限機(jī)制冈止。用戶可以在...
    宇是我閱讀 7,394評論 7 41
  • 博文出處:Kotlin入入入門(二),歡迎大家關(guān)注我的博客候齿,謝謝熙暴! 找不同 之前在 Kotlin入入入門(一) 中...
    俞其榮閱讀 541評論 1 5
  • 你知道給喵星人找零食有多少種方法嗎? 看看我們班小朋友們的回答吧慌盯。 1. Trap 設(shè)一個(gè)陷阱周霉,擺個(gè)鼠夾,逮住老鼠...
    一只貓的旅行青島閱讀 851評論 0 0