如何在后台服务中使用alertDialog
How to use alertDialog in background service
我需要在后台服务中提示一个alertDialog,但是它被错误的上下文崩溃了,我该如何处理,我在哪里可以得到正确的上下文?
1、必须设置:mDialog.getWindow().setType(
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
2、设置权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
代码在 Service class 到 open AlertDialog
private void showAlertDialog() {
KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
KeyguardManager.KeyguardLock kl = km.newKeyguardLock("MyKeyguardLock");
kl.disableKeyguard();
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
WakeLock wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK| PowerManager.ACQUIRE_CAUSES_WAKEUP
| PowerManager.ON_AFTER_RELEASE, "MyWakeLock");
wakeLock.acquire();
final CharSequence[] items = { getString(R.string.test1), getString(R.string.tes2), getString(R.string.test3), getString(R.string.cancel) };
AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());
builder.setTitle("Title");
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int item) {
if (items[item].equals(getString(R.string.test1))) {
dialog.dismiss();
} else if (items[item].equals(getString(R.string.test2))) {
dialog.dismiss();
} else if (items[item].equals(getString(R.string.test3))) {
}else if (items[item].equals(getString(R.string.cancel))) {
dialog.dismiss();
}
}
});
alert = builder.create();
alert.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
alert.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON|
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD|
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED|
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
alert.show();
alert.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(DialogInterface arg0) {
}
});
alert.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
}
});
}
您必须在清单文件
中添加权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
您可以根据需要对警报对话框进行自定义。
完成
已接受的答案不适用于 Oreo+
请在 WindowManager.LayoutParams 中使用标志 TYPE_APPLICATION_OVERLAY 而不是 TYPE_PHONE 或 SYSTEM_ALERT:
使用
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
改为
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
叠加层仍然不显示?然后检查你的应用是否有权限
Settings.canDrawOverlays() 如果这是假的那么。
用户也应该有这个权限!
这是在 Marshmallow
中引入的
// 检查是否 Android M 或更高
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// Show alert dialog to the user saying a separate permission is
needed
// Launch the settings activity if the user prefers
Intent myIntent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
startActivity(myIntent);
}
我需要在后台服务中提示一个alertDialog,但是它被错误的上下文崩溃了,我该如何处理,我在哪里可以得到正确的上下文?
1、必须设置:mDialog.getWindow().setType(
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
2、设置权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
代码在 Service class 到 open AlertDialog
private void showAlertDialog() {
KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
KeyguardManager.KeyguardLock kl = km.newKeyguardLock("MyKeyguardLock");
kl.disableKeyguard();
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
WakeLock wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK| PowerManager.ACQUIRE_CAUSES_WAKEUP
| PowerManager.ON_AFTER_RELEASE, "MyWakeLock");
wakeLock.acquire();
final CharSequence[] items = { getString(R.string.test1), getString(R.string.tes2), getString(R.string.test3), getString(R.string.cancel) };
AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());
builder.setTitle("Title");
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int item) {
if (items[item].equals(getString(R.string.test1))) {
dialog.dismiss();
} else if (items[item].equals(getString(R.string.test2))) {
dialog.dismiss();
} else if (items[item].equals(getString(R.string.test3))) {
}else if (items[item].equals(getString(R.string.cancel))) {
dialog.dismiss();
}
}
});
alert = builder.create();
alert.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
alert.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON|
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD|
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED|
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
alert.show();
alert.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(DialogInterface arg0) {
}
});
alert.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
}
});
}
您必须在清单文件
中添加权限<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
您可以根据需要对警报对话框进行自定义。
完成
已接受的答案不适用于 Oreo+ 请在 WindowManager.LayoutParams 中使用标志 TYPE_APPLICATION_OVERLAY 而不是 TYPE_PHONE 或 SYSTEM_ALERT: 使用
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
改为
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
叠加层仍然不显示?然后检查你的应用是否有权限
Settings.canDrawOverlays() 如果这是假的那么。
用户也应该有这个权限! 这是在 Marshmallow
中引入的// 检查是否 Android M 或更高
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// Show alert dialog to the user saying a separate permission is
needed
// Launch the settings activity if the user prefers
Intent myIntent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
startActivity(myIntent);
}