为了账号安全,请及时绑定邮箱和手机立即绑定

系统重新启动后,在广播接收器中显示警报对话框

/ 猿问

系统重新启动后,在广播接收器中显示警报对话框

守着星空守着你 2019-12-13 17:10:00

美好的一天,在广播接收机中,系统重新启动后,我试图显示一个警报对话框。我已经在清单中添加了接收者并调用了所需的权限,但是在显示对话框时出现错误。请问我该如何正确实施呢?


我的代码:


public void onReceive(final Context context, Intent intent) {

    Log.d(TAG, "received boot completed broadcast receiver... starting settings");



    String settings = context.getResources().getString(R.string.restart_setting);

        String yes = context.getResources().getString(R.string.Settings);

        String no = context.getResources().getString(R.string.Cancel);


              final AlertDialog.Builder builder = new AlertDialog.Builder(context);

                builder.setMessage(settings)

                       .setCancelable(false)

                       .setPositiveButton(yes, new DialogInterface.OnClickListener() {

    public void onClick(@SuppressWarnings("unused") final DialogInterface dialog, @SuppressWarnings("unused") final int id) 

   Intent config = new Intent(context, WeatherConfigure.class)

     context.startActivity(config);


    }

 })

    .setNegativeButton(no, new DialogInterface.OnClickListener() {

        public void onClick(final DialogInterface dialog, @SuppressWarnings("unused") final int id) {

             dialog.cancel();

        }

    });

  final AlertDialog alert = builder.create();

  alert.show();


    }

正在收到此日志错误:


01-07 01:42:01.559: ERROR/AndroidRuntime(2004): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application


01-07 01:42:01.559: ERROR/AndroidRuntime(2004): at android.view.ViewRoot.setView(ViewRoot.java:548)


01-07 01:42:01.559: ERROR/AndroidRuntime(2004):at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)


01-07 01:42:01.559: ERROR/AndroidRuntime(2004): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)


01-07 01:42:01.559: ERROR/AndroidRuntime(2004):at android.app.Dialog.show(Dialog.java:288)


01-07 01:42:01.559: ERROR/AndroidRuntime(2004):at com.MuaaApps.MyWeatherUpdate.myWeatherBroadcastReceiver.onReceive(MyWeatherBroadcastReceiver.java:59)



查看完整描述

3 回答

?
慕姐8265434

问题是您试图显示AlertDialog来自的BroadcastReceiver,这是不允许的。您无法显示AlertDialog来自的BroadcastReceiver。只有活动可以显示对话框。


您应该做其他事情,BroadcastReceiver像启动时一样在启动时启动,并启动一个活动以显示对话框。


这是有关此内容的博客文章。


编辑:


这是我建议这样做的方式。从你BroadcastReceiver开始了Activity与AlertDialog这样..


public class NotifySMSReceived extends Activity 

{

    private static final String LOG_TAG = "SMSReceiver";

    public static final int NOTIFICATION_ID_RECEIVED = 0x1221;

    static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";


    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);


        IntentFilter filter = new IntentFilter(ACTION);

        this.registerReceiver(mReceivedSMSReceiver, filter);

    }


    private void displayAlert()

    {

        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        builder.setMessage("Are you sure you want to exit?").setCancelable(

            false).setPositiveButton("Yes",

            new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int id) {

                    dialog.cancel();

                }

            }).setNegativeButton("No",

            new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int id) {

                    dialog.cancel();

                }

            });

        AlertDialog alert = builder.create();

        alert.show();

    }


    private final BroadcastReceiver mReceivedSMSReceiver = new BroadcastReceiver() {


        @Override

        public void onReceive(Context context, Intent intent) {

            String action = intent.getAction();


            if (ACTION.equals(action)) 

            {

                //your SMS processing code

                displayAlert();

            }

        }

    }

}

如您所见,我从没打电话过setContentView()。这是因为该活动将具有透明视图,并且仅显示警报对话框。



查看完整回答
反对 回复 2019-12-14
?
潇潇雨雨

您不能在BroadcastReceiver上使用对话框,因此最好从BroadcastReceiver调用对话框的活动,


将此代码添加到您的onReceive函数中:


@Override

public void onReceive(Context context, Intent intent) 

{

    Intent i = new Intent(context, {CLASSNAME}.class); 

    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

    context.startActivity(i);

}

用对话框活动填充{CLASSNAME},这里是我的对话框活动:


package com.example.mbanking;


import android.os.Bundle;

import android.app.Activity;

import android.app.AlertDialog;

import android.content.DialogInterface;



// ALERT DIALOG

// Sources : http://techblogon.com/alert-dialog-with-edittext-in-android-example-with-source-code/


public class AlertDialogActivity extends Activity 

{


@Override

protected void onCreate(Bundle savedInstanceState) 

{

    super.onCreate(savedInstanceState);


    AlertDialog.Builder builder = new AlertDialog.Builder(this);

    builder

        .setTitle("Test")

        .setMessage("Are you sure you want to exit?")

        .setCancelable(false)

        .setPositiveButton("Yes", new DialogInterface.OnClickListener() 

        {

            public void onClick(DialogInterface dialog, int id) 

            {

                dialog.cancel();

            }

        })

        .setNegativeButton("No", new DialogInterface.OnClickListener() 

        {

            public void onClick(DialogInterface dialog, int id) 

            {

                dialog.cancel();

            }

        });

    AlertDialog alert = builder.create();

    alert.show();

}

}



查看完整回答
反对 回复 2019-12-14
?
三国纷争

这是有关如何执行此操作的帖子。您可以从此处获取源代码。

您不能直接从广播接收器显示对话框。您必须使用Activity。另外,为了接收ACTION_BOOT_COMPLETED您的活动,必须首先由用户或其他应用程序显式启动(有关更多信息,Google应用程序处于停止状态)。

基本上,要实现所需的功能,您需要执行以下操作:

  1. 创建显示对话框的透明活动。

  2. 创建BroadcastReceiver将接收ACTION_BOOT_COMPLETED并开始您的活动。

  3. 在清单中注册您的广播接收器并获得适当的许可。

此外,此问题提供有关如何创建透明活动的更多信息。



查看完整回答
反对 回复 2019-12-14

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信