在应用内弹出dialog其实很简单,但是在桌面上显示dialog却是有一些区别,大概思路有两个;
——第一种是弹出一个真正的dialog,但是这是系统级的dialog,需要在manifest中获得系统dialog的权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"></uses-permission>
之后在使用dialog的时候要设置为系统dialog:
<span style="white-space:pre"> </span>private void showDialog(final Context context) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>AlertDialog.Builder dialog=new AlertDialog.Builder(context); <span style="white-space:pre"> </span>dialog.setTitle("提示"); <span style="white-space:pre"> </span>dialog.setIcon(android.R.drawable.ic_dialog_info); <span style="white-space:pre"> </span>dialog.setMessage("test"); <span style="white-space:pre"> </span>AlertDialog mDialog=dialog.create(); <span style="white-space:pre"> </span>mDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);//设定为系统级警告 <span style="white-space:pre"> </span>mDialog.show(); <span style="white-space:pre"> </span>}这样一般情况是可以在桌面上显示dialog的,但是在小米等非Android原生系统的机型,直接在桌面上调用系统dialog会有一些问题,需要手动设置允许展示悬浮窗,这对用户来说未免有些麻烦,因此我们需要换个思路;
——第二个方案就是用dialog样式的Activity代替系统dialog,这样也可以完美的解决一些机型弹窗失败的问题;
首先在Manifest注册一个Activity,但是要设置一下theme和launchMode:
<activity android:name=".activity.main.WidgetAlertActivity" android:configChanges="keyboardHidden|orientation" android:screenOrientation="portrait" android:theme="@style/DialogTheme" android:launchMode="singleInstance" />在values中新建styles.xml文件,在其中设置Activity样式:
<span style="white-space:pre"> </span><style name="DialogTheme" parent="@android:style/Theme.Dialog"> <item name="android:windowIsTranslucent">true</item> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowContentOverlay">@null</item> <item name="android:windowNoTitle">true</item> <item name="android:windowIsFloating">true</item> <item name="android:backgroundDimEnabled">true</item> </style>其中,需要设置Activity的启动方式为android:launchMode="singleInstance",这样就能避免如果在桌面打开DialogActivity时MainActivity被带到前台的情况;
这样在需要展示dialog的service或者其他程序中用Intent打开就可以了:
<span style="white-space:pre"> </span>private void startAlertActivity(Context context){ Intent intent = new Intent(context, WidgetAlertActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_USER_ACTION ); context.startActivity(intent); }