59

如何顯示ActivityDialog在鎖定屏幕上可見?默認鎖定屏幕上的Android活動

我已經嘗試顯示我的鎖活動,當屏幕打開在Activity.onCreate()方法設置各種窗口類型:

TYPE_PRIORITY_PHONE
TYPE_SYSTEM_ALERT
TYPE_KEYGUARD

和其他人一起SYSTEM_ALERT_WINDOWINTERNAL_SYSTEM_WINDOW權限。

我解鎖設備後,我的活動可見。

UPDATE:

我其實已經成功地展示我自己的活動,而不是默認的鎖屏。除非您使用HOME按鈕,否則它會完美工作。

+1

究竟是你想實現什麼目標?你是否試圖實現自己的鎖定屏幕,或者你想讓你的警報窗口顯示在鎖定屏幕上(不管是什麼)或者......? – 2010-09-09 12:15:39

+1

其實我希望我能夠實現兩個:自己的鎖定屏幕和對話框在現有的鎖定屏幕上。 – plugmind 2010-09-09 14:27:54

+0

我可以告訴你有關在鎖屏上顯示一個窗口:請參閱http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_SHOW_WHEN_LOCKED – 2010-09-09 15:09:03

回答

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

嘗試使用此標誌在活動啓動時禁用鎖定屏幕。

API 17級後,你可以在例子中使用

<activity 
     android:name=".yourActivityName" 
     android:showOnLockScreen="true" 
     android:screenOrientation="sensorPortrait" > 

showOnLockScreen像...

+2

這甚至不需要任何權限。奇怪。 – 2014-04-27 07:22:09

+4

不適用於我的情況,是否需要特殊許可? – 2014-05-20 11:40:42

+5

問題是,至少在4.4上,當在鎖定屏幕上設置密碼時,這不起作用。有沒有人知道如何保持鎖定屏幕,但仍然能夠顯示它的對話? – 2014-09-04 14:19:34

17

使用此在onCreate方法

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
// This line should be before setContentView..  
setContentView(......); 

希望這會工作 謝謝

+0

如何避免在電話鈴響時顯示。鬧鈴等。 – Subha 2016-04-12 08:15:48

26

不要去參加活動,因爲出於安全原因,android不會在活動後面顯示鎖定屏幕,所以請使用服務而不是活動。

以下是我的服務onStartCommand中的代碼。

WindowManager mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 

View mView = mInflater.inflate(R.layout.score, null); 

WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT, 
ViewGroup.LayoutParams.WRAP_CONTENT, 0, 0, 
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, 
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
    | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 
    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 
/* | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON */, 
PixelFormat.RGBA_8888); 

mWindowManager.addView(mView, mLayoutParams); 

並添加<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />體現

+2

非常感謝! – 2015-05-12 21:25:52

+1

非常感謝你... – 2015-06-28 16:22:42

+1

我可以用它來顯示顯示屏上的佈局。但它不會收到事件,即使我添加了事件處理程序。如何克服這個問題? – nagylzs 2015-08-24 13:27:18

0

您可以在任何答案使用代碼在這裏,你認爲它的工作。然後,以防止HOME按鈕的工作,改變TYPE_SYSTEM_ALERTTYPE_SYSTEM_OVERLAY(取決於你目前使用的)來TYPE_SYSTEM_ERROR

params = new WindowManager.LayoutParams(
    WindowManager.LayoutParams.MATCH_PARENT, 
    WindowManager.LayoutParams.MATCH_PARENT, 
    WindowManager.LayoutParams.TYPE_SYSTEM_ERROR, 
    WindowManager.LayoutParams.FLAG_FULLSCREEN | 
    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
    WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD, 
    PixelFormat.TRANSLUCENT 
); 
params.gravity = Gravity.TOP; 
mOverlay = (RelativeLayout) inflater.inflate(R.layout.main, (ViewGroup) null); 
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 
mWindowManager.addView(mOverlay, params);