来自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理器的“通过其他应用程序绘制”权限。