Android桌面弹窗实现总结

时间:2022-09-05 10:28:35

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