2017-06-20 60 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