我有一個應用程序,它將從服務器接收消息並與用戶進行對話。因此,當手機處於鎖定屏幕時,我想要對話框將顯示在鎖屏的頂部,但不解鎖它。任何人都可以給我建議?Android:如何在鎖定屏幕上顯示對話框或活動[不解鎖屏幕]
回答
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);
}
最後我達到了同樣的效果。不要參加活動,因爲出於安全原因,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" />
體現
我解決了以下方式類似的東西。 創建服務,播放動作「ACTION_SCREEN_ON
& ACTION_USER_PRESENT
& ACTION_SCREEN_OFF
」,創建顯示窗口的功能WINDOW_SERVICE
。我爲我的需求使用服務,但它可以適應。
public class OverlayService extends Service {
private static final String TAG = OverlayService.class.getSimpleName();
WindowManager mWindowManager;
View mView;
Animation mAnimation;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
registerOverlayReceiver();
return super.onStartCommand(intent, flags, startId);
}
private void showDialog(String aTitle){
mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
mView = View.inflate(getApplicationContext(), R.layout.fragment_overlay, null);
mView.setTag(TAG);
int top = getApplicationContext().getResources().getDisplayMetrics().heightPixels/2;
RelativeLayout dialog = (RelativeLayout) mView.findViewById(R.id.dialog);
LayoutParams lp = (LayoutParams) dialog.getLayoutParams();
lp.topMargin = top;
lp.bottomMargin = top;
mView.setLayoutParams(lp);
ImageButton imageButton = (ImageButton) mView.findViewById(R.id.close);
lp = (LayoutParams) imageButton.getLayoutParams();
lp.topMargin = top - 58;
imageButton.setLayoutParams(lp);
imageButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mView.setVisibility(View.INVISIBLE);
}
});
TextView title = (TextView) mView.findViewById(R.id.Title);
title.setText(aTitle);
final WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT, 0, 0,
WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
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);
mView.setVisibility(View.VISIBLE);
mAnimation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.in);
mView.startAnimation(mAnimation);
mWindowManager.addView(mView, mLayoutParams);
}
private void hideDialog(){
if(mView != null && mWindowManager != null){
mWindowManager.removeView(mView);
mView = null;
}
}
@Override
public void onDestroy() {
unregisterOverlayReceiver();
super.onDestroy();
}
private void registerOverlayReceiver() {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_USER_PRESENT);
registerReceiver(overlayReceiver, filter);
}
private void unregisterOverlayReceiver() {
hideDialog();
unregisterReceiver(overlayReceiver);
}
private BroadcastReceiver overlayReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.d(TAG, "[onReceive]" + action);
if (action.equals(Intent.ACTION_SCREEN_ON)) {
showDialog("Esto es una prueba y se levanto desde");
}
else if (action.equals(Intent.ACTION_USER_PRESENT)) {
hideDialog();
}
else if (action.equals(Intent.ACTION_SCREEN_OFF)) {
hideDialog();
}
}
};
}
我希望它有用!
我正在尋找確切的解決方案,感謝gfirem和Unihedro。 –
你可以分享fragment_overlay嗎? –
謝謝!它的工作原理,但不與FLAG_DISMISS_KEYGUARD https://stackoverflow.com/a/32233473/4229910 – ashwinx
- 1. 在鎖定屏幕上切換活動顯示鎖定屏幕
- 2. 喚醒屏幕並在鎖定屏幕上顯示對話框
- 3. Android活動解鎖屏幕
- 4. 鎖定屏幕上的Android對話框
- 5. iPhone,如何在鎖定屏幕上顯示更改對話框?
- 6. 在鎖定的Android屏幕上顯示
- 7. UILocalNotification不顯示在鎖定屏幕上
- 8. android - 在沒有解鎖的情況下顯示鎖定屏幕上的對話框樣式的活動
- 9. Android:解鎖屏幕
- 10. AppleScript的解鎖屏幕對話框
- 11. 屏幕鎖定和解鎖
- 12. 在Android鎖定屏幕上顯示活動
- 13. 即使屏幕鎖定,如何顯示對話框?
- 14. 如何在viber或Line Messenger的鎖定屏幕上顯示對話框
- 15. 如何鎖定屏幕Android
- 16. 鎖定屏幕上的Android鎖定屏幕/媒體控件
- 17. 如何解鎖鎖定屏幕?
- 18. 在鎖定屏幕上顯示通知
- 19. 在鎖定屏幕上顯示警報?
- 20. 在iPhone鎖定屏幕上顯示CFUserNotification
- 21. 在鎖定屏幕上顯示文字
- 22. 在鎖定屏幕上顯示Dialogfragment
- 23. 在鎖定屏幕上顯示通知
- 24. 解鎖屏幕在通話中android
- 25. 鎖定屏幕上的活動
- 26. 試圖在顯示對話框時鎖定屏幕旋轉
- 27. 解鎖Android鎖屏活動
- 28. 如何在屏幕鎖定時顯示活動?
- 29. 如何在屏幕鎖定顯示之前調用活動?
- 30. 用戶解鎖屏幕後會顯示Android活動
謝謝,這對我有所不同,如果你想在鎖屏上顯示它並在背景上顯示鎖屏,請不要使用活動 –
@AdibFara那麼,我們使用什麼? – kadik
@kadik你可以使用服務,請檢查上面的答案 –