非侵入式無權(quán)限應(yīng)用內(nèi)懸浮窗的實(shí)現(xiàn)

前言

一般的懸浮窗實(shí)現(xiàn)方式到逊,需要申請(qǐng)權(quán)限宙攻,并還是要對(duì)部分機(jī)型進(jìn)行適配才能正常顯示辕近。那么這里拔恰,我們換一種思路,實(shí)現(xiàn)一個(gè)不一樣的懸浮窗闹获。

一、應(yīng)用內(nèi)懸浮窗實(shí)現(xiàn)思路

通常的懸浮窗是通過WindowManager直接添加的河哑,在不同的Android系統(tǒng)上需要做不同的適配避诽,在Android6.0以上的機(jī)型上,還需要引導(dǎo)用戶跳轉(zhuǎn)到設(shè)置界面手動(dòng)開啟懸浮窗權(quán)限璃谨。雖然這樣實(shí)現(xiàn)懸浮窗有完整的解決方案沙庐,但是開啟懸浮窗過程對(duì)用戶并不是很友好。下面佳吞,我們換一種思路拱雏,去使用一個(gè)應(yīng)用內(nèi)懸浮窗,避免機(jī)型適配和權(quán)限申請(qǐng)的坑底扳,讓懸浮窗像普通的View一樣顯示在界面上铸抑。

一般懸浮窗的實(shí)現(xiàn)方案是向系統(tǒng)window添加typeTYPE_PHONE或者TYPE_TOASTView,從而使懸浮窗可以作為一個(gè)獨(dú)立的View進(jìn)行展示衷模。Android對(duì)這一行為作了限制鹊汛,那我們可以考慮從比較常規(guī)的途徑添加View:向每一個(gè)展示界面蒲赂,即Activity,添加一個(gè)View作為懸浮窗刁憋。這樣滥嘴,我們使用懸浮窗時(shí)就可以避免適配和權(quán)限問題。那么至耻,怎么樣實(shí)現(xiàn)這樣的懸浮窗更好呢若皱?

要實(shí)現(xiàn)這樣一個(gè)懸浮窗,相當(dāng)于我們要在Activity加載完后將懸浮窗的View添加的Activity上尘颓,我們不想在原有的Activity上插入這段代碼走触,這時(shí)就可以利用ActivityLifecycleCallbacksfragment的加載特性來完成一個(gè)無侵入式的懸浮窗的顯示。

二泥耀、應(yīng)用內(nèi)懸浮窗的實(shí)現(xiàn)

  1. 首先饺汹,我們先自定義一個(gè)View用于顯示懸浮窗界面,就叫它FloatingWindow痰催。至于怎么實(shí)現(xiàn)兜辞,這個(gè)各位可以自由發(fā)揮。
  2. 接下來夸溶,我們要把FloatingWindow添加到每一個(gè)Activity上逸吵,這時(shí)就利用ActivityLifecycleCallbacksActivity的每個(gè)生命周期都能回調(diào)到ActivityLifecycleCallbacks缝裁,這時(shí)我們只要在onActivityCreated(Activity activity, Bundle savedInstanceState)中加上懸浮窗View扫皱。但是,onActivityCreated(Activity activity, Bundle savedInstanceState)方法是在onCreate(Bundle savedInstanceState)時(shí)被調(diào)用的捷绑,我們需要保證在setContentView()之后才添加懸浮窗韩脑,讓懸浮窗處于上層,所以我們插入一個(gè)空Fragment粹污,利用FragmentonActivityCreated(Bundle savedInstanceState)是在ActivityonCreate(Bundle savedInstanceState)之后的特性來加入懸浮窗段多。
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
    @Override
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
        super.onActivityCreated(activity, savedInstanceState);

        if (activity instanceof FragmentActivity) {
            FragmentManager fm = ((FragmentActivity) activity).getSupportFragmentManager();
            fm.beginTransaction().add(new SupportFragment(), FRAGMENT_TAG).commitAllowingStateLoss();
        }
    }
    ...
});

public static class SupportFragment extends Fragment {

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        Activity activity = getActivity();
        if (activity != null) {
            FloatingWindow fw = new FloatingWindow(activity);
            activity.addContentView(fw, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        }
    }
}

通過這幾行核心代碼,我們便完成了一個(gè)不需要權(quán)限申請(qǐng)的懸浮窗壮吩。細(xì)節(jié)一點(diǎn)的實(shí)現(xiàn)可以參考我的demo:https://github.com/windinwork/floatingwindowdemo

三进苍、總結(jié)

像我們這樣的懸浮窗,有優(yōu)點(diǎn)也有缺點(diǎn)鸭叙。優(yōu)點(diǎn)顯而易見觉啊,它不需要向系統(tǒng)申請(qǐng)?zhí)厥獾臋?quán)限即可正常顯示;缺點(diǎn)的話即是每一個(gè)Activity都有一個(gè)懸浮窗沈贝,相互獨(dú)立存在杠人,當(dāng)然這個(gè)是可以優(yōu)化一下實(shí)現(xiàn)方式解決的,這里不細(xì)講,另一個(gè)缺點(diǎn)即是這樣的懸浮窗無法在應(yīng)用退到后臺(tái)的時(shí)候存在搜吧,當(dāng)然在在合適的應(yīng)用場(chǎng)景這也不是問題市俊。以上便是一個(gè)無侵入式無權(quán)限的懸浮窗實(shí)現(xiàn)方式,希望能為小伙伴提供不同的懸浮窗實(shí)現(xiàn)思路滤奈。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末摆昧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蜒程,更是在濱河造成了極大的恐慌绅你,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昭躺,死亡現(xiàn)場(chǎng)離奇詭異忌锯,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)领炫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門偶垮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人帝洪,你說我怎么就攤上這事似舵。” “怎么了葱峡?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵砚哗,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我砰奕,道長(zhǎng)蛛芥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任军援,我火速辦了婚禮仅淑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘胸哥。我一直安慰自己涯竟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布烘嘱。 她就那樣靜靜地躺著昆禽,像睡著了一般蝗蛙。 火紅的嫁衣襯著肌膚如雪蝇庭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天捡硅,我揣著相機(jī)與錄音哮内,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛北发,可吹牛的內(nèi)容都是我干的纹因。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼琳拨,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼瞭恰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起狱庇,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎颜启,沒想到半個(gè)月后浪讳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡口猜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年暮的,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了淌实。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡恨闪,死狀恐怖放坏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情淤年,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布溉苛,位于F島的核電站弄诲,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜塔插,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一拓哟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧断序,春花似錦、人聲如沸逢倍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亮蒋。三九已至扣典,卻和暖如春慎玖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背湿硝。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工关斜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铺浇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓丁稀,卻偏偏與公主長(zhǎng)得像倚聚,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子秉沼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,079評(píng)論 25 707
  • 懶得處理樣式了, 將就著看吧. 官網(wǎng)地址: https://developer.android.com/topic...
    Reddington_604e閱讀 1,659評(píng)論 0 1
  • 1矗积、懸浮窗的基本介紹 懸浮窗敞咧,大家應(yīng)該也不陌生,凌駕于應(yīng)用之上的一個(gè)小彈窗休建,實(shí)現(xiàn)上很簡(jiǎn)單乍恐,就是添加一個(gè)系統(tǒng)級(jí)別的窗...
    C6C閱讀 48,036評(píng)論 50 83
  • 湖北荊州公安金獅谷升寺,村人素強(qiáng)橫测砂,遠(yuǎn)近聞名茵烈。 有跑江湖的來賣藝砌些,一老一小呜投,一挑擔(dān)。老者團(tuán)團(tuán)作揖存璃,介紹:此為古彩戲...
    快樂的山地人閱讀 2,358評(píng)論 1 2
  • 伊娃格林是我的女神,所以我的昵稱就是我的女神纵东。 今年24歲粘招,大學(xué)專業(yè)是商務(wù)日語。畢業(yè)后由于專業(yè)不精又不清楚自己想干...
    吃了個(gè)西瓜閱讀 683評(píng)論 0 0