10

幾年前,我編寫了一款適用於Android 2的鬧鐘應用程序,現在我正在嘗試將其升級到Android 4。三星Galaxy S4。Android Galaxy S4 - 在鎖定屏幕上可見的活動

在Android 2上,如果手機正在睡眠,它會喚醒手機並在鎖定屏幕上顯示「暫停或關閉」屏幕。

在Android 4上,它會喚醒手機,但您必須解鎖它,然後打開通知區域,然後單擊警報通知,然後才能點擊「關閉」。

我一直用這個代碼做清醒:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
      | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 
      | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
      | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 

我已閱讀在這個問題上8點不同的計算器的問題。他們中的大多數都提供了上面的代碼,這些代碼幾年前在Android 2中工作,但在Android 4中無效。但是他們都沒有幫助我解決這個問題。這裏有問題,我閱讀和嘗試:

Android: remove or disable programmatically the Lock Screen on Samsung Galaxy S2 device

How do I create an Activity that is visible on top of the lock screen

How to start a dialog (like alarm dimiss /snooze) that can be clicked without unlocking the screen

Android activity over default lock screen

android device locked, yet want alarm to sound and dialog to appear

Android dialog over lock screen

Show dialog with touch events over lockscreen in Android 2.3

沒有人有可能導致此什麼了Android 4改變任何想法?

編輯:這是我看到的一個最簡單的例子,它沒有出現「最小化」的報警對話框。它不會,因爲寫的,出現在鎖屏,但您可以修復與WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED

http://wptrafficanalyzer.in/blog/setting-up-alarm-using-alarmmanager-and-waking-up-screen-and-unlocking-keypad-on-alarm-goes-off-in-android/

它具有FragmentActivity和DialogFragment編寫的,但它仍然可以作爲一個活動。它使用一個AlertDialog.Builder來創建對話框,如果你嘗試使用XML佈局來實現,它將無法工作。爲什麼?

+0

你已經在清單中設置了此權限? - ><使用權限android:name =「android.permission.DISABLE_KEYGUARD」/> – bofredo

+0

是的,該權限一直設置,並用於Android 2上工作。 – howrad

+0

我嘗試了一些新的東西。我將Screen Lock設爲無,但我仍然看到問題。爲了給臺式計算機打個比方,就像對話框開始「最小化」 - 在出現對話框之前,您必須點擊警報通知。手機打開時,會彈出對話框,但手機處於關閉狀態時,對話框將開始最小化。這在Android 2.3中不是問題。 – howrad

回答

15

@Override 
public void onAttachedToWindow() { 
     Window window = getWindow(); 

     window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 
       | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
       | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
       | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 
       | WindowManager.LayoutParams.FLAG_FULLSCREEN); 

     super.onAttachedToWindow(); 
    } 

我也明確地在清單中的活動定義此聲明

我明白了,答案與我的預期完全不同。

這段代碼被包含在Android 2鬧鐘樣品中,在AlarmAlert.java活動:

@Override 
protected void onStop() { 
    super.onStop(); 
    // Don't hang around. 
    finish(); 
} 

作爲參考,則可以從在GIT中的過去right here示例代碼看到文件,包含上述onStop函數。它從來沒有造成Android 2的問題。

但是在Android 4中,如果手機關機,這個onStop會在手機醒來之前觸發,從而有效地「最小化」活動。一旦我刪除這個功能,它立即再次工作。

但我不知道,這是其他人喜歡@radley和@Guardanis所得到的是什麼問題?這似乎不太可能,但請讓我知道這是否也解決了您的問題。

如果您正在訪問的未來這個答案,你得到這個問題,我會嘗試是:

  1. 中取出onStop功能。

  2. 這個代碼添加到活動:

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
         | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 
         | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
         | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
    
  3. 確保您使用的是全屏幕主題,而不是一個對話的主題。

  4. 這並不有所作爲我,但你可以嘗試設置showOnLockScreen明確的清單:<activity android:name="com.example.MyActivity" android:showOnLockScreen="true"/>

  5. 未有所作爲,我的第二個事情,但你可以嘗試是加入國旗WindowManager.LayoutParams.FLAG_FULLSCREEN

我希望這可以幫助別人!

+4

特別是不使用對話主題有所作爲! – bk138

+0

有沒有人知道爲什麼onStop()被稱爲活動時,手機出來睡覺?我也在觀察這一點,並且當我想要將活動放在鎖定屏幕前時會引發問題。任何更新將不勝感激! –

+0

有沒有其他的對話框主題?我想在鎖定的屏幕上顯示一個類似消息框的彈出窗口,並且我無法使用對話框主題,只能全屏顯示。 –

3

不確定這是否是所有情況下的問題,但ShowWhenLocked上的文檔說它僅適用於最上面的全屏窗口。我有一個以對話框爲主題的窗口,但它在我將其更改爲常規全屏窗口後運行良好。

+0

風格。xml,我設置了'android:Theme.DeviceDefault.Light.NoActionBar.Fullscreen'的父項,並添加了標記'WindowManager.LayoutParams.FLAG_FULLSCREEN',但它仍然不起作用。我還需要做些什麼來使其全屏幕和工作? – howrad

1

您鏈接的問題之一有一個似乎解決了這個問題的答案。

這是我使用這似乎是工作代碼:

<activity 
    android:name="com.example.MyActivity" 
    android:label="@string/app_name" 
    android:showOnLockScreen="true" 
    > 

Android activity over default lock screen

+0

當處理標誌列表時,使用+或者| _應該產生相同的結果。由於所有標誌都是2的冪,因此按位OR和加法是等效的,但使用按位OR會稍快。我也測試了這個特定的例子,它們都產生了6815872的整數值。他們都沒有在Galaxy S4上解決這個問題,對不起。 – howrad

+0

你說得對,我已經更新了我的答案。 –

+0

我嘗試了您的更新答案,但是如果屏幕關閉,活動仍會基本上「最小化」啓動。您必須打開通知欄並單擊通知才能看到它。關於我可能錯過的任何其他想法? – howrad

1

右鍵 - 所以我一直在與這一個,但最近有5.0.2的Galaxy Tab A.所有其他設備上毫不奇怪是什麼在起作用三星不工作(因爲第一三星Galaxy設備這一直是苦苦掙扎的情況下,他們打破新的東西發佈!)

用於顯示在鎖屏的大部分設備的活動一般的解決方法是

//wake up device and show even when on lock screen 
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | 
     WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
     WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | 
     WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | 
     WindowManager.LayoutParams.FLAG_FULLSCREEN); 

然而,這並不三星設備的工作。刪除FLAG_DISMISS_KEYGUARD然而這個技巧。

望着文檔此標誌,我們有

窗口標誌:設置窗口時將導致駁回了鍵盤鎖,只有當它是不是一個安全鎖鍵盤保護。由於安全性並不需要這樣的鍵盤保護,所以如果用戶導航到另一個窗口,它將不會再出現(與FLAG_SHOW_WHEN_LOCKED相反,這將僅暫時隱藏安全和非安全的鍵盤鎖,但確保它們在用戶移動到時重新出現另一個UI不會隱藏它們)。如果鍵盤鎖當前處於活動狀態並且安全(需要解鎖圖案),則在看到此窗口之前用戶仍然需要確認它,除非已設置FLAG_SHOW_WHEN_LOCKED。

FLAG_SHOW_WHEN_LOCKED我們有

窗口標誌:特殊標誌,讓當屏幕鎖定 窗口中顯示。這將使應用程序窗口優先於密鑰 警衛或任何其他鎖定屏幕。可以使用FLAG_KEEP_SCREEN_ON 直接打開屏幕並顯示窗口,然後顯示密鑰 保護窗口。 可與FLAG_DISMISS_KEYGUARD一起使用,以自動 充分駁回非安全鍵盤。該標誌僅適用於 最頂級的全屏窗口。

你可以看到,他們可以一起使用,但似乎如果設備被鎖定,FLAG_DISMISS_KEYGUARD存在三星不會打擾FLAG_SHOW_WHEN_LOCKED。我的應用程序需要設置鎖定屏幕,因此移除解除鎖定鍵盤標誌實際上允許我在鎖定屏幕上顯示全屏活動。對我來說,對於三星來說。

+0

你好,我試過你的解決方案,但它不起作用。如果我去解鎖我的屏幕,我會看到我的應用程序主頁已啓動,而不是應該顯示爲通知 –

+0

的活動,如果您根本沒有在鎖屏上方或下方看到新活動,則這表明你並不是首先開始這項活動。 – Dori

+0

礦是全屏接管 –

相關問題