如何从服务中显示对话框?
答案 0 :(得分:23)
android-smspopup正是如此。
服务收到短信,然后使用以下内容启动Activity
android:theme="@android:style/Theme.Dialog"
编辑:使用此代码启动对话框活动here
private void notifyMessageReceived(SmsMmsMessage message) {
(...)
context.startActivity(message.getPopupIntent());
(...)
}
声明getPopupIntent()
跟随(代码here):
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>
答案 1 :(得分:19)
不使用活动的另一种方式:
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" />
答案 2 :(得分:19)
从服务中,您可以轻松地显示Material Design样式化对话框,操纵其窗口类型,属性和LayoutParams。
本指南假设您使用的是Android AppCompat libray。
此方法需要 SYSTEM_ALERT_WINDOW 权限。
通常,想要显示对话框的服务也有一些通过系统UI绘制的视图(使用WindowManager.addView()
方法添加),因此您可能已经在清单中声明了此权限用法。如果没有,请添加以下行:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
在 Android 6.0 Marshmallow 中,用户必须明确允许您的应用“抽取其他应用”。 您可以以编程方式启动包含该开关的系统设置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;
}
}
在themes.xml
内创建此主题并使用您的应用颜色进行自定义:
<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();
答案 3 :(得分:5)
文档建议您应该使用通知。重新评估您可能需要使用对话框的原因。你想要实现什么目标?
答案 4 :(得分:2)
第一,你需要在服务中投射你的活动 所以在你的Activity中添加
mactivity = YourActivity.this;
并在On create中添加此
YourActivity mact;
YourActivity act;
当我们转到您的服务部门时,声明:
mact = (YourActivity) 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
请记住ORDER BY CONVERT(DATETIME, DATE, 105) DESC
是在Alert Builder中使用的Cast类...对我来说很好,希望它有所帮助。
答案 5 :(得分:0)
Here更详细地解释了如何使用半透明AlertDialog
从服务中显示Activity
,以及如何避免某些问题。
答案 6 :(得分:0)
当我需要显示对话框时,我在服务内部调用以下内容。
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及更高版本,用户应明确设置&#34;绘制其他应用程序&#34;应用程序管理器对启动此服务的应用程序的许可。