Android桌面弹窗实现总结

时间:2022-09-05 10:29:05

在应用内弹出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);
}