2017-06-20 64 views
0

短故事:顯示特定活動時隱藏我的對話框。當其他活動顯示時,對話框可以看到很好。AlertDialog被活動隱藏

長的故事:我有一個使用下列標誌的活動:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
    WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES); 

它還使用PROXIMITY_SCREEN_OFF_WAKE_LOCK爲了當你把手機對着你的臉關閉屏幕。

這項活動是在清單中定義如下:

<activity 
    android:name=".ui.MyHidingActivity" 
    android:configChanges="orientation|screenSize" 
    android:launchMode="singleInstance" 
    android:windowSoftInputMode="stateHidden"></activity> 

現在,當一個事件我想創建並顯示該對話框中的應用情況:

KeyguardManager km = (KeyguardManager) getSystemService(KEYGUARD_SERVICE); 
final KeyguardManager.KeyguardLock kl = km.newKeyguardLock("com.mycompany.myproject"); 
kl.disableKeyguard(); 

PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE); 
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.FULL_WAKE_LOCK, "My_App"); 
wl.acquire(); 

final AlertDialog alertDialog = new AlertDialog.Builder(tabActivity).create(); 
      alertDialog.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); 
alertDialog.setTitle("Incoming Event"); 
alertDialog.setMessage("You have an incoming event."); 
alertDialog.show(); 
wl.release(); 

對話框顯示罰款當任何其他活動顯示,,除了MyHidingActivity其中隱藏了出於任何原因的對話。任何想法可能是什麼問題?

+0

也許原因是android:launchMode =「singleInstance」。 「MyHidingActivity」打開後啓動新任務。在MyHidingActivity打開或移除android:launchMode =「singleInstance」後嘗試啓動對話框。 – fisher3421

+0

用於顯示MyHidingActivity中從哪個方法調用此對話框中的對話框。 – RameshJaga

+0

@Rameshbabu從我的應用程序中的一個監聽器。問題是對話框被附加到與顯示的不同的活動。我會很快回答我自己的問題,這將進一步解釋。 – Emmanuel

回答

1

好的我找到了解決方案。

問題出在我參加主要活動的new AlertDialog.Builder(tabActivity).create()。這不僅僅將這個活動用作任何舊的上下文。該對話框顯示在該活動的頂部。但是MyHidingActivity與主要活動並不相同,所以它隱藏了主要活動和它所連接的對話框。

爲了解決此問題,您必須在所有其他活動之上顯示對話框。爲此,你必須:

  1. 使用應用程序上下文,而不是新的 AlertDialog.Builder(this).create()(其中「本」是我 應用程序)
  2. 使該對話框的系統對話框:

    alertDialog .getWindow()。setType(WindowManager.LayoutParams。TYPE_SYSTEM_ALERT);

+0

當然,如果您決定使用系統警報,則必須通過android.permission.SYSTEM_ALERT_WINDOW和Settings.ACTION_MANAGE_OVERLAY_PERMISSION詢問權限。請參閱https://stackoverflow.com/a/35716156/442512 – Emmanuel