Android 如何在后台服务中使用alertDialog

Android 如何在后台服务中使用alertDialog,android,android-service,android-alertdialog,Android,Android Service,Android Alertdialog,我需要在后台服务中提示alertDialog,但它被坏的上下文崩溃了,我如何处理它,在哪里可以获得正确的上下文?1、您必须设置:mDialog.getWindow().setType( WindowManager.LayoutParams.TYPE_SYSTEM_ALERT) 2、 设置权限: <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 1、必须设置:mDialog.getWin

我需要在后台服务中提示alertDialog,但它被坏的上下文崩溃了,我如何处理它,在哪里可以获得正确的上下文?

1、您必须设置:
mDialog.getWindow().setType(
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)
2、 设置权限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

1、必须设置:
mDialog.getWindow().setType(
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)
2、 设置权限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

服务内部代码分类至打开警报对话框

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"/>

您可以根据需要自定义“警报”对话框


完成

服务中编写代码类以打开警报对话框

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中使用标记类型\应用程序\覆盖,而不是类型\电话或系统\警报。布局参数: 使用

WindowManager.LayoutParams.TYPE\u应用程序\u覆盖

反而

WindowManager.LayoutParams.TYPE\系统\警报

还是覆盖层不显示?然后检查您的应用程序是否具有该权限

Settings.canDrawOverlays()如果为false,则为

用户也应该有此权限 这是在棉花糖中引入的

//检查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);
}

公认的答案在奥利奥是行不通的+ 请在WindowManager中使用标记类型\应用程序\覆盖,而不是类型\电话或系统\警报。布局参数: 使用

WindowManager.LayoutParams.TYPE\u应用程序\u覆盖

反而

WindowManager.LayoutParams.TYPE\系统\警报

还是覆盖层不显示?然后检查您的应用程序是否具有该权限

Settings.canDrawOverlays()如果为false,则为

用户也应该有此权限 这是在棉花糖中引入的

//检查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);
}

你需要活动上下文来显示警报对话框我不想要任何活动,除了后台服务。使用toast来显示消息你也可以试试@LeonLeung,你解决问题了吗?你需要活动上下文来显示警报对话框我不想要任何活动,除了后台服务。用祝酒词来显示消息你也可以试试@LeonLeung,你解决问题了吗?