Android實(shí)現(xiàn)類似qq微信消息懸浮窗通知功能
實(shí)現(xiàn)方法:(需要開(kāi)啟懸浮窗通知權(quán)限、允許應(yīng)用在其他應(yīng)用上顯示)
一.利用headsup
懸掛式Notification,他是5.0中新增的,也就是API中的Headsup的Notification,可以在不打斷用戶操作的時(shí)候,給用戶通知
二.使用Window創(chuàng)建懸浮窗
當(dāng)window屬性設(shè)置為FLAGE_NOT_FOCUSABLE
表示不需要獲取焦點(diǎn),也不需要接受各種輸入事件,此標(biāo)記會(huì)同時(shí)啟用FLAGE_NOT_TOUCH_MODEL,
最終事件會(huì)直接傳遞給下層具有焦點(diǎn)的Widow
FLAGE_NOT_TOUCH_MODE
在此模式下,系統(tǒng)會(huì)將當(dāng)前Window區(qū)域以外的單擊事件傳遞給底層的Window,當(dāng)前Window區(qū)域以內(nèi)的單擊事件則自己處理,如果不開(kāi)啟此標(biāo)記,其他Window將無(wú)法接收到單擊事件
FLAGE_SHOW_WHEN_LOCKED
開(kāi)啟此模式可以讓W(xué)indow顯示在鎖屏的桌面上(不是所有的rom都支持)
widow類型設(shè)置,每個(gè)window都有對(duì)應(yīng)的z-ordered,層級(jí)大的會(huì)覆蓋層級(jí)小的,Window有三種類型:應(yīng)用Window(1-99),子Window(1000-1999),系統(tǒng)Window(2000-2999),因此,桌面懸浮窗需要系統(tǒng)Window,設(shè)置系統(tǒng)級(jí)的type有很多值,經(jīng)常用的是TYPE_SYSTEM_ALERT,此設(shè)置需要添加權(quán)限<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
但是經(jīng)測(cè)試當(dāng)類型設(shè)置為TYPE_TOAST的時(shí)候是不需要添加權(quán)限的( 部分rom仍舊需要權(quán)限(比如小米?。。?!)小米真的是開(kāi)發(fā)人員的噩夢(mèng)! )
提示:6.0之后需要?jiǎng)討B(tài)權(quán)限
注意:在某些rom下使用headsup并不會(huì)顯示桌面懸浮窗,而是直接跳轉(zhuǎn)到相應(yīng)的界面,親測(cè)華為,小米都是這種情況,這種情況下需要自己實(shí)現(xiàn)懸浮窗
具體實(shí)現(xiàn):
利用headsup
manager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE); notification = new NotificationCompat.Builder(this) .setVisibility(Notification.VISIBILITY_PRIVATE) .setSmallIcon(R.mipmap.ic_launcher) .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher)) .setFullScreenIntent(pendingIntent, false) .setContentTitle("標(biāo)題") .setContentText("內(nèi)容") .build(); manager.notify(1, notification);
使用Window
``private void initWindowManager(){ wm = (WindowManager) getApplicationContext().getSystemService( Context.WINDOW_SERVICE); params = new WindowManager.LayoutParams(); // 設(shè)置window type params.type = WindowManager.LayoutParams.TYPE_PHONE; /* * 如果設(shè)置為params.type = WindowManager.LayoutParams.TYPE_PHONE; 那么優(yōu)先級(jí)會(huì)降低一些, * 即拉下通知欄不可見(jiàn) */ params.format = PixelFormat.RGBA_8888; // 設(shè)置圖片格式,效果為背景透明 // 設(shè)置Window flag params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED; /* * 下面的flags屬性的效果形同“鎖定”。 懸浮窗不可觸摸,不接受任何事件,同時(shí)不影響后面的事件響應(yīng)。 * wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL | * LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_NOT_TOUCHABLE; */ // 設(shè)置懸浮窗的長(zhǎng)得寬 params.width = wm.getDefaultDisplay().getWidth(); params.height = 200; params.gravity = Gravity.LEFT | Gravity.TOP;} private void createFloatView(String str) { if (btn_floatView == null){ btn_floatView = new Button(getApplicationContext()); wmTag = true; } btn_floatView.setText(str); Log.i(TAG, "createFloatView: "+str); // 設(shè)置懸浮窗的Touch監(jiān)聽(tīng) btn_floatView.setOnTouchListener(new View.OnTouchListener() { int lastX, lastY; int paramX, paramY; public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: if (MainActivity.lifeTag == 1) { Intent intent = new Intent(DataService.this, MainActivity.class); startActivity(intent); } wm.removeViewImmediate(btn_floatView); btn_floatView = null; break; case MotionEvent.ACTION_MOVE: break; } return true; } }); if (wmTag){ wm.addView(btn_floatView, params); wmTag = false; }else { wm.updateViewLayout(btn_floatView,params); } }```
效果圖
總結(jié)
以上所述是小編給大家介紹的Android實(shí)現(xiàn)類似qq微信消息懸浮窗通知功能,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- android 添加隨意拖動(dòng)的桌面懸浮窗口
- Android實(shí)現(xiàn)桌面懸浮窗、蒙板效果實(shí)例代碼
- 不依賴于Activity的Android全局懸浮窗的實(shí)現(xiàn)
- Android 懸浮窗權(quán)限各機(jī)型各系統(tǒng)適配大全(總結(jié))
- Android應(yīng)用內(nèi)懸浮窗的實(shí)現(xiàn)方案示例
- Android實(shí)現(xiàn)類似360,QQ管家那樣的懸浮窗
- Android 8.0如何完美適配全局dialog懸浮窗彈出
- Android懸浮窗屏蔽懸浮窗外部所有的點(diǎn)擊事件的實(shí)例代碼
- Android 獲取判斷是否有懸浮窗權(quán)限的方法
- android仿華為手機(jī)懸浮窗設(shè)計(jì)
相關(guān)文章
Android OpenGL ES 實(shí)現(xiàn)抖音傳送帶特效(原理解析)
這篇文章主要介紹了Android OpenGL ES 實(shí)現(xiàn)抖音傳送帶特效,抖音傳送帶特效推出已經(jīng)很長(zhǎng)一段時(shí)間了,前面也實(shí)現(xiàn)了下,最近把它整理出來(lái)了,如果你有仔細(xì)觀測(cè)傳送帶特效,就會(huì)發(fā)現(xiàn)它的實(shí)現(xiàn)原理其實(shí)很簡(jiǎn)單,需要的朋友可以參考下2022-07-07解析Android中View轉(zhuǎn)換為Bitmap及getDrawingCache=null的解決方法
在android中經(jīng)常會(huì)遇到View轉(zhuǎn)換為Bitmap的情形,本篇文章主要介紹了Android中View轉(zhuǎn)換為Bitmap及getDrawingCache=null的解決方法,有需要的可以了解一下。2016-11-11RecyclerView嵌套R(shí)ecyclerView滑動(dòng)卡頓的解決方法
這篇文章主要為大家詳細(xì)介紹了RecyclerView嵌套R(shí)ecyclerView滑動(dòng)卡頓的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12Android編程四大組件之BroadcastReceiver(廣播接收者)用法實(shí)例
這篇文章主要介紹了Android編程四大組件之BroadcastReceiver(廣播接收者)用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了BroadcastReceiver的功能.定義,用法及相關(guān)使用技巧,需要的朋友可以參考下2016-01-01Android編程實(shí)現(xiàn)調(diào)用系統(tǒng)圖庫(kù)與裁剪圖片功能
這篇文章主要介紹了Android編程實(shí)現(xiàn)調(diào)用系統(tǒng)圖庫(kù)與裁剪圖片功能,結(jié)合實(shí)例形式分析了Android針對(duì)圖形的旋轉(zhuǎn)與剪切等具體操作技巧,需要的朋友可以參考下2017-01-01實(shí)例詳解android studio如何導(dǎo)入.so文件的方法
通過(guò)實(shí)例給大家詳細(xì)講解了如何在android studio如何導(dǎo)入.so文件以及中間遇到的問(wèn)題解決辦法,需要的讀者們可以仔細(xì)學(xué)習(xí)一下。2017-12-12Android使用FontMetrics對(duì)象計(jì)算位置坐標(biāo)
這篇文章主要為大家詳細(xì)介紹了Android使用FontMetrics對(duì)象計(jì)算位置坐標(biāo),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12Android EditText隨輸入法一起移動(dòng)并懸浮在輸入法之上的示例代碼
這篇文章主要介紹了Android EditText隨輸入法一起移動(dòng)并懸浮在輸入法之上,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06