最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android如何實(shí)現(xiàn)鎖屏狀態(tài)下彈窗

 更新時(shí)間:2016年08月12日 17:52:18   作者:?jiǎn)蔚锻炼? 
在鎖屏狀態(tài)下彈窗的效果我們平時(shí)并不少見(jiàn),如QQ、微信和鬧鐘等,但是Android開發(fā)者要怎么實(shí)現(xiàn)這一功能呢?下面一起來(lái)看看。

前言

想在鎖屏上面實(shí)現(xiàn)彈窗,第一個(gè)想法就是利用 WindowManager 設(shè)置 Window Flag,通過(guò)設(shè)置 Flag 的顯示優(yōu)先級(jí)來(lái)讓窗口顯示在鎖屏的上面。

接下來(lái)就是試驗(yàn)可能相關(guān)的 Window Type 屬性,驗(yàn)證該方案是否可行。

在嘗試各個(gè) Window Type 屬性之前需要明確各個(gè) Type 所需要的權(quán)限,下面是 com.android.internal.policy.impl.PhoneWindowManager.checkAddPermission 的源碼:

public int checkAddPermission(WindowManager.LayoutParams attrs) {
  int type = attrs.type;

  if (type < WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW
      || type > WindowManager.LayoutParams.LAST_SYSTEM_WINDOW) {
    return WindowManagerImpl.ADD_OKAY;
  }
  String permission = null;
  switch (type) {
    case TYPE_TOAST:
      // XXX right now the app process has complete control over
      // this... should introduce a token to let the system
      // monitor/control what they are doing.
      break;
    case TYPE_INPUT_METHOD:
    case TYPE_WALLPAPER:
      // The window manager will check these.
      break;
    case TYPE_PHONE:
    case TYPE_PRIORITY_PHONE:
    case TYPE_SYSTEM_ALERT:
    case TYPE_SYSTEM_ERROR:
    case TYPE_SYSTEM_OVERLAY:
      permission = android.Manifest.permission.SYSTEM_ALERT_WINDOW;
      break;
    default:
      permission = android.Manifest.permission.INTERNAL_SYSTEM_WINDOW;
  }
  if (permission != null) {
    if (mContext.checkCallingOrSelfPermission(permission)
        != PackageManager.PERMISSION_GRANTED) {
      return WindowManagerImpl.ADD_PERMISSION_DENIED;
    }
  }
  return WindowManagerImpl.ADD_OKAY;
}

明顯不適合的 TypeTYPE_TOAST, TYPE_INPUT_METHOD, TYPE_WALLPAPER; 可能適合的 TypeTYPE_PHONE, TYPE_PRIORITY_PHONE, TYPE_SYSTEM_ALERT, TYPE_SYSTEM_ERROR, TYPE_SYSTEM_OVERLAY; 其它類型的 Type

需要系統(tǒng)簽名權(quán)限:

android.Manifest.permission.INTERNAL_SYSTEM_WINDOW

而申請(qǐng)?jiān)摍?quán)限需要系統(tǒng)簽名,所以我們是無(wú)法獲取權(quán)限的。

TYPE_PHONE

/**
 * Window type: phone. These are non-application windows providing
 * user interaction with the phone (in particular incoming calls).
 * These windows are normally placed above all applications, but behind
 * the status bar.
 * In multiuser systems shows on all users' windows.
 */
public static final int TYPE_PHONE       = FIRST_SYSTEM_WINDOW+2;

TYPE_PHONE 類型的窗口可以顯示在其它 APP 的上面,但不能顯示在鎖屏的上面,所以 PASS。

TYPE_PRIORITY_PHONE

/**
 * Window type: priority phone UI, which needs to be displayed even if
 * the keyguard is active. These windows must not take input
 * focus, or they will interfere with the keyguard.
 * In multiuser systems shows on all users' windows.
 */
public static final int TYPE_PRIORITY_PHONE   = FIRST_SYSTEM_WINDOW+7;

TYPE_PRIORITY_PHONE 類型的窗口可以顯示在其它 APP 的上面,但不能顯示在鎖屏的上面,所以 PASS。而且實(shí)際的行為和注釋并不相符,該類型的窗口是可以獲取交互事件的,具體原因待查。

TYPE_SYSTEM_ALERT

/**
 * Window type: system window, such as low power alert. These windows
 * are always on top of application windows.
 * In multiuser systems shows only on the owning user's window.
 */
public static final int TYPE_SYSTEM_ALERT = FIRST_SYSTEM_WINDOW+3;

TYPE_SYSTEM_ALERT 類型的窗口可以顯示在其它 APP 的上面,但不能顯示在鎖屏的上面,所以 PASS。

TYPE_SYSTEM_OVERLAY

/**
 * Window type: system overlay windows, which need to be displayed
 * on top of everything else. These windows must not take input
 * focus, or they will interfere with the keyguard.
 * In multiuser systems shows only on the owning user's window.
 */
public static final int TYPE_SYSTEM_OVERLAY = FIRST_SYSTEM_WINDOW+6;

TYPE_SYSTEM_OVERLAY 類型的窗口可以顯示在所有其它窗口的上面,包括鎖屏,而且不會(huì)影響它下面窗口的交互事件響應(yīng),但是該屬性窗口不能獲得焦點(diǎn),無(wú)法進(jìn)行交互(如果該窗口可以獲取焦點(diǎn),那么就可以用來(lái)抓取用戶的鎖屏密碼,出于安全考慮,系統(tǒng)是不會(huì)允許的),所以只能用來(lái)簡(jiǎn)單的展示內(nèi)容,如果需要交互的鎖屏彈窗,那么該屬性 PASS。

TYPE_SYSTEM_ERROR

/**
 * Window type: internal system error windows, appear on top of
 * everything they can.
 * In multiuser systems shows only on the owning user's window.
 */
public static final int TYPE_SYSTEM_ERROR = FIRST_SYSTEM_WINDOW+10;

在原生 ROM 5.1 下試驗(yàn)是可以顯示出來(lái)的,但根據(jù)注釋來(lái)看(appear on top of everything they can)不是在所有情況下都可以顯示在鎖屏上面的,而且像 MIUI 和 Flyme 等 ROM 默認(rèn)是屏蔽浮窗權(quán)限的,考慮到這點(diǎn),利用 WindowManager 添加浮窗的方式實(shí)現(xiàn)鎖屏彈窗的方案基本 PASS。

使用 Activity 的方式實(shí)現(xiàn)

首先需要對(duì) Activity 進(jìn)行如下設(shè)置

protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState); 
  final Window win = getWindow(); 
  win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
      | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 
      | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
      | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
}

其中最主要也是必須要設(shè)置的就是:FLAG_SHOW_WHEN_LOCKED,顧名思義就是鎖屏下顯示該 Activity。而其它幾個(gè) Flag 包括:解鎖、保持屏幕常亮、點(diǎn)亮屏幕可以根據(jù)具體的需求選擇設(shè)置。

在 AndroidManifest.xml 中聲明 Activity

同樣該 Activity 也需要在 AndroidManifest.xml 中聲明,聲明時(shí)需注意添加 android:excludeFromRecents="true" 屬性,是為了將該 Activity 從最近任務(wù)列表中去除,否則用戶會(huì)覺(jué)得很奇怪。還有因?yàn)檫@個(gè) Activity 會(huì)整個(gè)蓋在鎖屏上面,而且就算設(shè)置成背景透明,鎖屏界面也不會(huì)顯示在下面(系統(tǒng)主要是出于安全考慮),所以需要考慮下該 Activity 的背景,這里為了顯示不要太突兀將主題設(shè)為壁紙。

<activity android:name=".LockScreenActivity" 
     android:launchMode="singleInstance" 
     android:excludeFromRecents="true" 
     android:theme="@android:style/Theme.Wallpaper.NoTitleBar"/>

啟動(dòng) Activity

由于該 Activity 是為了在鎖屏的情況下顯示的,所以啟動(dòng) Activity 時(shí)不要忘了判斷手機(jī)是否處于鎖屏狀態(tài),可以通過(guò)下面這種方式判斷鎖屏狀態(tài):

KeyguardManager km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
if (km.inKeyguardRestrictedInputMode()) {
  // 處于鎖屏狀態(tài)
}

總結(jié)

以上就是在Android中實(shí)現(xiàn)鎖屏狀態(tài)下彈窗效果的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家開發(fā)Android的時(shí)候能有所幫助,如果有疑問(wèn)歡迎大家留言討論。

相關(guān)文章

  • Android使用SQLite數(shù)據(jù)庫(kù)的示例

    Android使用SQLite數(shù)據(jù)庫(kù)的示例

    本篇文章主要介紹了Android使用SQLite數(shù)據(jù)庫(kù)的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • Android Studio真機(jī)無(wú)線連接USB設(shè)備調(diào)試運(yùn)行詳解流程

    Android Studio真機(jī)無(wú)線連接USB設(shè)備調(diào)試運(yùn)行詳解流程

    你在Android Studio寫app時(shí)是否也有想過(guò)如果可以不用數(shù)據(jù)線連接手機(jī)調(diào)試運(yùn)行就好了?如果需要取出數(shù)據(jù)線插接的話我肯定是嫌麻煩的,但是模擬器有時(shí)候需要測(cè)試一些需要硬件支持的功能時(shí)又不管用,所以最好的測(cè)試還是在真機(jī)上,本篇教你扔掉數(shù)據(jù)線來(lái)無(wú)線調(diào)試
    2021-11-11
  • android Textview文字監(jiān)控(Textview使用方法)

    android Textview文字監(jiān)控(Textview使用方法)

    以手機(jī)號(hào)充值為例,當(dāng)用戶輸入最后一位數(shù)時(shí)候,進(jìn)行匯率的變換,本文就實(shí)現(xiàn)類似這樣的功能
    2013-11-11
  • Android item長(zhǎng)按刪除功能

    Android item長(zhǎng)按刪除功能

    這篇文章主要介紹了Android item長(zhǎng)按刪除功能,在文章底部給大家介紹了android 長(zhǎng)按刪除listview的item的實(shí)例代碼,需要的的朋友參考下
    2017-07-07
  • 一起動(dòng)手編寫Android圖片加載框架

    一起動(dòng)手編寫Android圖片加載框架

    這篇文章主要和大家一起動(dòng)手編寫Android圖片加載框架,從內(nèi)部原理到具體實(shí)現(xiàn)來(lái)詳細(xì)介紹如何開發(fā)一個(gè)簡(jiǎn)潔而實(shí)用的Android圖片加載緩存框架,感興趣的小伙伴們可以參考一下
    2016-04-04
  • Flutter控件之實(shí)現(xiàn)Widget基類的封裝

    Flutter控件之實(shí)現(xiàn)Widget基類的封裝

    在實(shí)際的開發(fā)中,Widget的基類還是很有必要存在的,不然就會(huì)存在很多的冗余嵌套代碼,本文為大家介紹了Flutter中基類是如何封裝的,需要的可以收藏一下
    2023-05-05
  • Android使用原生組件WebView加載網(wǎng)頁(yè)和數(shù)據(jù)的方法

    Android使用原生組件WebView加載網(wǎng)頁(yè)和數(shù)據(jù)的方法

    這篇文章主要介紹了Android使用原生組件WebView加載網(wǎng)頁(yè)和數(shù)據(jù)的方法的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • Android實(shí)現(xiàn)藍(lán)牙客戶端與服務(wù)器端通信示例

    Android實(shí)現(xiàn)藍(lán)牙客戶端與服務(wù)器端通信示例

    這篇文章主要介紹了Android實(shí)現(xiàn)藍(lán)牙客戶端與服務(wù)器端通信示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-01-01
  • Android ADB簡(jiǎn)介、安裝及使用詳解

    Android ADB簡(jiǎn)介、安裝及使用詳解

    ADB 全稱為 Android Debug Bridge,起到調(diào)試橋的作用,是一個(gè)客戶端-服務(wù)器端程序,其中客戶端是用來(lái)操作的電腦,服務(wù)端是 Android 設(shè)備,這篇文章介紹Android ADB簡(jiǎn)介、安裝及使用,感興趣的朋友跟隨小編一起看看吧
    2024-01-01
  • Android自定義布局實(shí)現(xiàn)仿qq側(cè)滑部分代碼

    Android自定義布局實(shí)現(xiàn)仿qq側(cè)滑部分代碼

    這篇文章主要為大家詳細(xì)介紹了自定義布局實(shí)現(xiàn)仿qq側(cè)滑Android部分代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03

最新評(píng)論

台东县| 广东省| 新晃| 西平县| 囊谦县| 武城县| 沭阳县| 儋州市| 红安县| 错那县| 龙山县| 清丰县| 宿松县| 涪陵区| 泾阳县| 蕉岭县| 深圳市| 东城区| 巴青县| 湘西| 小金县| 平果县| 新密市| 兴国县| 青冈县| 江孜县| 琼中| 安阳市| 锡林郭勒盟| 顺义区| 温宿县| 江阴市| 格尔木市| 浏阳市| 宜州市| 昌吉市| 缙云县| 潼南县| 东安县| 岚皋县| 贡嘎县|