показать диалоговое окно с предупреждением в приемнике вещания после перезагрузки системы - PullRequest
31 голосов
/ 07 января 2012

Добрый день, я пытаюсь показать диалоговое окно с предупреждением после перезагрузки системы в широковещательном приемнике. Я добавил получателя в свой манифест и вызвал требуемое разрешение, но получаю сообщение об ошибке при отображении диалогового окна. Пожалуйста, как я могу реализовать это правильно? .. Спасибо

мой код:

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)

01-07 01:42:01.559: ERROR/AndroidRuntime(2004): at android.app.ActivityThread.handleReceiver(ActivityThread.java:1994)

Ответы [ 6 ]

46 голосов
/ 07 января 2012

Проблема в том, что вы пытаетесь показать AlertDialog из BroadcastReceiver, что недопустимо. Вы не можете показать AlertDialog из BroadcastReceiver. Только действия могут отображать диалоги.

Вы должны сделать что-то еще, запустить BroadcastReceiver при загрузке, как вы делаете, и начать действие, чтобы показать диалоговое окно.

Вот сообщение в блоге Подробнее об этом.

EDIT:

Вот как я бы порекомендовал это сделать. С вашего 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(). Это потому, что у действия будет прозрачное представление, и будет отображаться только диалоговое окно с предупреждением.

27 голосов
/ 27 августа 2013

Вы не можете использовать диалоговое окно на 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();
}
}

где я получил ответ?, здесь: Как использовать диалоговое окно с предупреждением в приемнике вещания в Android? спасибо Феми !!, я просто распространил новость: D

7 голосов
/ 27 октября 2012

Вот сообщение о том, как это сделать. Вы можете получить исходный код от здесь .

Невозможно отобразить диалоговое окно непосредственно с приемника вещания. Вы должны использовать Activity. Кроме того, для получения ACTION_BOOT_COMPLETED ваша активность должна быть сначала явно запущена пользователем или другим приложением (для получения дополнительной информации приложение Google остановлено).

В принципе, для достижения требуемой функциональности вам необходимо:

  1. Создать прозрачное действие, которое показывает диалог.
  2. Создайте BroadcastReceiver, который получает ACTION_BOOT_COMPLETED и начинает вашу деятельность.
  3. Зарегистрируйте приемник вещания в манифесте и получите соответствующее разрешение.

Кроме того, этот вопрос предоставляет дополнительную информацию о том, как создать прозрачную активность.

3 голосов
/ 21 ноября 2015

Лучший способ - выполнить упражнение и установить для его атрибута «Theme» значение «Theme.Translucen»

 <activity
        android:name=".MyAlertDialog"
        android:label="@string/title_activity_alert_dialog"
        android:launchMode="singleInstance"
        android:theme="@android:style/Theme.Translucent" >
    </activity>

и создать в диалоговом окне «Предупреждение»:

public class MyAlertDialog extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE); //hide activity title
    setContentView(R.layout.activity_my_alert_dialog);

    AlertDialog.Builder Builder=new AlertDialog.Builder(this)
            .setMessage("Do You Want continue ?")
            .setTitle("exit")
            .setIcon(android.R.drawable.ic_dialog_alert)
            .setNegativeButton(R.string.No, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    MyAlertDialog.this.finish();
                }
            })
            .setPositiveButton(R.string.Yes,null);
    AlertDialog alertDialog=Builder.create();
    alertDialog.show();

}

}

и в brodcastreciver:

 @Override
public void onReceive(Context context, Intent intent) {

    Intent i=new Intent(context.getApplicationContext(),MyAlertDialog.class);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(i);

}
}
1 голос
/ 04 ноября 2016
  1. Отображение диалога из Broadcast Receiver невозможно.
  2. мы должны показывать только диалог из Activity.
  3. Но в контексте вашего приложения есть только Broadcast Receiver, тогда мы должны запуститьдействие как "FLAG_ACTIVITY_NEW_TASK", затем он создает стек.
  4. Если мы запускаем действие с этим флагом "FLAG_ACTIVITY_NEW_TASK", мы не можем удалить его из стека.

  5. Итак, после закрытия приложения, затем мы пытаемся запустить приложение из стека, оно показывает ту же активность, потому что это действие имеет флаг «FLAG_ACTIVITY_NEW_TASK», поэтому оно не должно создавать новый экземпляр и использовать существующееinstance.

Но мы хотим показать диалог только один раз.для этого нам нужно справиться с программным союзником.

 if (count == 0) {
            mBuilder = new Dialog(this);
            mMsg = getIntent().getStringExtra(AlarmSchedulerUtils.EXTRA_MSG);
            Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
            mRingTome = RingtoneManager.getRingtone(ReminderDialog.this, notification);
            mRingTome.play();
            count++;
            showReminderDialog();
        } else {
            Intent intent=new Intent(ReminderDialog.this,SplashActivity.class);
            startActivity(intent);
            finish();
        }

Это работает для меня.

0 голосов
/ 10 августа 2015

Это может быть старая ветка с ответами, но ответ с ответом не помог.

Вы не можете запустить всплывающее диалоговое окно в своей реализации onReceive (). BroadcastReceiver

Вместо диалогов или всплывающего окна вы можете использовать действие, которое имеет тематическую форму диалога

 <activity 
   android:taskAffinity=""
   android:name=".activity.CallActivity"
   android:label="@string/app_name"
   android:theme="@style/AppTheme.Dialog" />

Обратите внимание, что я добавляю taskAffinity внутри блока (AndroidManifest.xml)

Тогда вы можете просто использовать его как обычную деятельность.

Intent intentPhoneCall = new Intent(context, CallActivity.class);
intentPhoneCall.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intentPhoneCall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intentPhoneCall);

Надеюсь, это поможет. Удачных кодировок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...