59

Làm cách nào để hiển thị Activity hoặc Dialog hiển thị trên màn hình khóa?Hoạt động Android trên màn hình khóa mặc định

Tôi đã cố gắng hiển thị hoạt động khóa của tôi khi màn hình bật bằng cách thiết lập kiểu cửa sổ khác nhau trong Activity.onCreate() phương pháp:

TYPE_PRIORITY_PHONE
TYPE_SYSTEM_ALERT
TYPE_KEYGUARD

và những người khác cùng với SYSTEM_ALERT_WINDOWINTERNAL_SYSTEM_WINDOW quyền.

Hoạt động của tôi hiển thị sau khi tôi mở khóa thiết bị.

UPDATE:

Tôi thực sự đã được quản lý để hiển thị Hoạt động của riêng mình thay vì màn hình khóa mặc định. Nó hoạt động hoàn hảo trừ khi bạn sử dụng nút HOME.

+1

biết chính xác là bạn đang cố gắng để thực hiện? Bạn đang cố gắng để thực hiện màn hình khóa của riêng bạn hoặc bạn muốn cửa sổ cảnh báo của bạn được hiển thị trên màn hình khóa (bất cứ điều gì là) hoặc ...? –

+1

Thực ra tôi ước tôi có thể thực hiện cả hai: màn hình khóa riêng và hộp thoại trên màn hình khóa hiện tại. – plugmind

+0

Tôi có thể cho bạn biết về cách hiển thị cửa sổ trên màn hình khóa: xem http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_SHOW_WHEN_LOCKED –

Trả lời

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); 

thử sử dụng cờ này để tắt màn hình khóa khi bắt đầu hoạt động.

Sau mức API 17 bạn có thể sử dụng

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

showOnLockScreen như trong ví dụ ...

+2

điều này thậm chí không yêu cầu bất kỳ quyền nào. Thật ngạc nhiên. –

+4

không hoạt động trong trường hợp của tôi, có bất kỳ sự cho phép đặc biệt nào cần thiết cho việc này không? –

+5

Vấn đề là ít nhất trên 4.4 điều này không hoạt động khi có mật khẩu được đặt trên màn hình khóa. có ai biết làm thế nào để giữ cho màn hình khóa trên nhưng vẫn có thể hiển thị các cuộc đối thoại trên nó? –

17

Sử dụng này trong phương pháp 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(......); 

Hy vọng điều này sẽ làm việc Cảm ơn

+0

cách tránh hiển thị khi đang đổ chuông điện thoại. chuông báo thức vv .. – Subha

26

Không hoạt động vì android sẽ không hiển thị màn hình khóa đằng sau hoạt động của bạn vì lý do bảo mật, vì vậy hãy sử dụng dịch vụ thay vì Hoạt động.

Dưới đây là mã của tôi trong onStartCommand dịch vụ của tôi.

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); 

Và thêm <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> để biểu lộ

+2

Cảm ơn bạn rất nhiều! –

+1

Cảm ơn bạn RẤT NHIỀU người đàn ông ... –

+1

Tôi có thể sử dụng điều này để hiển thị bố cục trên đầu màn hình. Nhưng nó không nhận được sự kiện, ngay cả khi tôi thêm trình xử lý sự kiện. Làm cách nào để khắc phục vấn đề đó? – nagylzs

0

Bạn có thể sử dụng mã trong bất kỳ câu trả lời ở đây mà bạn nghĩ rằng nó làm việc. Sau đó, để ngăn chặn CHỦ nút để làm việc, thay đổi TYPE_SYSTEM_ALERT hoặc TYPE_SYSTEM_OVERLAY (phụ thuộc vào những gì bạn đang sử dụng) để 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);