来自Android服务的警报对话框
如何显示服务中的对话框?
android-smspopup确实如此。
一个服务收到一个短信,它启动一个Activity
:
android:theme="@android:style/Theme.Dialog"
编辑:对话框活动在这里用这个代码开始
private void notifyMessageReceived(SmsMmsMessage message) { (...) context.startActivity(message.getPopupIntent()); (...) }
随着getPopupIntent()
声明如下(代码在这里 ):
public Intent getPopupIntent() { Intent popup = new Intent(context, SmsPopupActivity.class); popup.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); popup.putExtras(toBundle()); return popup; }
SmsPopupActivity
类显然定义了对话活动。 它在AndroidManifest.xml
声明如下:
<activity android:name=".ui.SmsPopupActivity" android:configChanges="keyboardHidden|orientation|screenSize" android:launchMode="singleTask" android:screenOrientation="user" android:taskAffinity="net.everythingandroid.smspopup.popup" android:theme="@style/DialogTheme" > </activity>
另一种不使用活动的方式:
AlertDialog alertDialog = new AlertDialog.Builder(this) .setTitle("Title") .setMessage("Are you sure?") .create(); alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); alertDialog.show();
请注意,您必须使用此权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
来自服务的材料样式对话框
从一个服务,你可以很容易地显示一个Material Design样式的对话框来操作它的Windowtypes,属性和LayoutParams。
开始之前:AppCompat库
本指南假定您正在使用Android AppCompat libray。
开始之前:权限
此方法需要SYSTEM_ALERT_WINDOW权限。 通常,想要显示对话框的服务也会在系统UI上绘制一些视图(使用WindowManager.addView()
方法添加),因此您可能已经在manifest中声明了该权限用法。 如果不是,请添加以下行:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
在Android 6.0棉花糖 ,用户必须明确允许您的应用程序“绘制其他应用程序”。 您可以通过编程方式启动包含交换机的系统设置Activity:
@Override protected void onResume() { super.onResume(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) { openOverlaySettings(); } } @TargetApi(Build.VERSION_CODES.M) private void openOverlaySettings() { final Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())); try { startActivityForResult(intent, RC_OVERLAY); } catch (ActivityNotFoundException e) { Log.e(TAG, e.getMessage()); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case RC_OVERLAY: final boolean overlayEnabled = Settings.canDrawOverlays(this); // Do something... break; } }
创build您的自定义材质devise对话框主题
在themes.xml
创build这个主题并用你的应用颜色进行自定义:
<style name="AppTheme.MaterialDialogTheme" parent="Theme.AppCompat.Light.Dialog"> <item name="colorPrimary">@color/brand_primary</item> <item name="colorPrimaryDark">@color/brand_primary_dark</item> <item name="colorAccent">@color/brand_accent</item> <item name="android:windowBackground">@drawable/dialog_background_light</item> <item name="android:textColorPrimary">@color/primary_text_light</item> <item name="android:textColorSecondary">@color/secondary_text_light</item> <item name="android:textColorTertiary">@color/secondary_text_light</item> </style>
启动你的对话框
在您的服务里面:
final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this, R.style.AppTheme_MaterialDialogTheme); dialogBuilder.setTitle(R.string.dialog_title); dialogBuilder.setMessage(R.string.dialog_message); dialogBuilder.setNegativeButton(R.string.btn_back, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } } ); final AlertDialog dialog = dialogBuilder.create(); final Window dialogWindow = dialog.getWindow(); final WindowManager.LayoutParams dialogWindowAttributes = dialogWindow.getAttributes(); // Set fixed width (280dp) and WRAP_CONTENT height final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(); lp.copyFrom(dialogWindowAttributes); lp.width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 280, getResources().getDisplayMetrics()); lp.height = WindowManager.LayoutParams.WRAP_CONTENT; dialogWindow.setAttributes(lp); // Set to TYPE_SYSTEM_ALERT so that the Service can display it dialogWindow.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); dialogWindowAttributes.windowAnimations = R.style.DialogAnimation; dialog.show();
文档build议您应该使用通知。 重新评估为什么你可能需要使用对话框。 你想达到什么目的?
首先,你需要投入你的活动服务,所以在你的活动添加
public static Activity mactivity;
并在创build添加此
mactivity = yourActivity.this;
当我们转到您的服务中时,请声明这一点:
yourActivity mact; yourActivity act;
并在创build服务这是我们的铸造
mact = (youActivity) act.mactivity;
警报对话框将如下所示:
AlertDialog.Builder builder = new AlertDialog.Builder(mact); builder.setMessage(getResources().getString(R.string.string)); builder.setIcon(R.drawable.chat); builder.setTitle(R.string.app_name); builder.setPositiveButton(getResources().getString(R.string.Ok), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface paramDialogInterface, int paramInt) { // TODO Auto-generated method stub your message } });
请记住mact是在Alert Builder中使用的Cast类…对我来说工作正常,希望它有帮助。
下面是一个更详细的解释,如何使用半透明的Activity
从服务中显示AlertDialog
,以及如何避免一些问题。
当我需要显示一个对话框时,我正在调用下面的服务。
public void ShowYesNoDialog() { DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case DialogInterface.BUTTON_POSITIVE: //Yes Button Clicked break; case DialogInterface.BUTTON_NEGATIVE: //No button clicked break; } } }; AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Did the dialog display?") .setPositiveButton("Yes", dialogClickListener) .setNegativeButton("No", dialogClickListener); AlertDialog alertDialog = builder.create(); alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); alertDialog.show(); }
确保你已经将下面的权限添加到清单。 android.permission.SYSTEM_ALERT_WINDOW
我也认为对于SDK 23和更高版本,用户应该明确地设置启动此服务的应用程序的应用程序pipe理器的“通过其他应用程序绘制”权限。