Как настроить Alertbox из BroadcastReceiver

Я реализовал будильник в приложении для Android. Сигнализация работает нормально. Toast сообщение видно. Теперь я хочу отправить уведомление пользователю.

Вот код из ReceiverActivity класса. что я пробовал

public class ReceiverActivity extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub

// Code....


    new AlertDialog.Builder(context)
    .setTitle("Alert Box")
    .setMessage("Msg for User")
    .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface arg0, int arg1) {
        // TODO Auto-generated method stub
            // some coding...
        }
    })
    .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface arg0, int arg1) {
            arg0.dismiss();
    }
}).create().show();
}

}


person PSK    schedule 02.05.2013    source источник
comment
с какой проблемой ты столкнулся?   -  person Richa    schedule 02.05.2013
comment
Зачем вам нужно, чтобы диалог всплывал спонтанно (с точки зрения пользователя)? Почему бы не использовать уведомление; вот для чего они.   -  person Edward Falk    schedule 02.05.2013
comment
@PSK Я обновил свой ответ для более подробной информации ..... прочитайте об этом ..   -  person Pankaj Kumar    schedule 03.05.2013


Ответы (4)



Несмотря на то, что вы не можете показывать AlertDialog из приемников, поскольку для этого требуется ActivityContext.

У вас есть альтернативное решение для отображения действия, такого как AlertDialog, от Receiver. Это возможно.

Чтобы запустить действие как диалог, вы должны установить тему действия в манифесте как <activity android:theme="@android:style/Theme.Dialog" />

Стиль любого действия как диалоговое окно с предупреждением в Android


Чтобы запустить действие из приемника, используйте код, например

    //Intent mIntent = new Intent();
    //mIntent.setClassName("com.test", "com.test.YourActivity"); 
    Intent mIntent = new Intent(context,YourActivity.class) //Same as above two lines
    mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(mIntent);

И еще одна причина не использовать AlertDialog от получателя (даже если вам удалось показать AlertDialog)

Объект BroadcastReceiver действителен только на время вызова onReceive(Context, Intent). Как только ваш код возвращается из этой функции, система считает, что объект завершен и больше не активен.

Это имеет важные последствия для того, что вы можете сделать в реализации onReceive(Context, Intent): все, что требует асинхронной операции, недоступно, потому что вам нужно будет вернуться из функции для обработки асинхронной операции, но в этот момент BroadcastReceiver больше не активен, и, таким образом, система может завершить свой процесс до завершения асинхронной операции.

В частности, вы не можете отображать диалоговое окно или привязываться к службе из BroadcastReceiver. В первом случае вам следует использовать API NotificationManager. В последнем случае вы можете использовать Context.startService() для отправки команды службе. Подробнее…

Таким образом, лучший способ — «показать уведомление», а альтернативный — «использовать действие как предупреждение».

Удачного программирования :)

person Pankaj Kumar    schedule 02.05.2013
comment
Это кажется полезным. позвольте мне попробовать это. @Панкадж Кумар - person PSK; 02.05.2013
comment
Можете ли вы объяснить мне, что делает метод setClassName()? @Панкадж Кумар - person PSK; 02.05.2013
comment
да, конечно .. это эквивалентно new Intent(context,YourActivity.class), но здесь вам нужно полное имя класса, включая пакет. Вы также можете использовать new Intent(context,YourActivity.class).. - person Pankaj Kumar; 02.05.2013
comment
хорошее объяснение .. @Pankaj Kumar - person PSK; 02.05.2013
comment
этот тип Intent может вызываться из BroadcastReceiver для запуска Alert Box @ Pankaj Kumar - person PSK; 02.05.2013
comment
давайте продолжим это обсуждение в чате - person Pankaj Kumar; 03.05.2013
comment
в моем методе приемника я помещаю код выше... когда появляется всплывающее окно с предупреждением, активность также открывается. но мне не нужно открывать эту деятельность. так есть ли какое-нибудь предложение сделать это? .. @Pankj Kumar - person PSK; 03.05.2013
comment
как это делает ватсап?? - person Pemba Tamang; 02.09.2019

Вы можете попробовать отобразить диалог с атрибутами системного оповещения:

YourAlertDialog dialog = new YourAlertDialog(mContext);
dialog.getWindow()
        .setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
dialog.show();

И добавьте разрешение системного оповещения в файл mainfest.xml:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
person buptcoder    schedule 02.05.2013
comment
что такое AdShowDialog в этом коде, я получаю сообщение об ошибке. @buptcoder - person PSK; 03.05.2013
comment
Извините, я забыл изменить имя. Я скопировал код из своего проекта. - person buptcoder; 03.05.2013

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

дополнительную информацию проверьте AlertDialog из BroadcastReceiver?? Можно ли это сделать?

person Richa    schedule 02.05.2013
comment
Хорошо @Richa.. Я проверяю вашу ссылку - person PSK; 02.05.2013
comment
как это делает ватсап?? - person Pemba Tamang; 02.09.2019

Я также ищу это решение, но после поиска многих вещей я не получил точного ответа для пользовательского диалога. Итак, в этот момент я делаю custom dialog и автоматически всплываю при разрыве интернет-соединения. Итак, прежде всего нам нужно создать собственный макет, который мы использовали для всплывающего окна, поэтому вот мой файл alertforconnectioncheck.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:fbutton="http://schemas.android.com/tools"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:background="@color/colorPrimary"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="1dp"
    android:layout_marginLeft="2dp"
    android:layout_marginRight="2dp"
    android:layout_marginBottom="2dp"
    card_view:cardCornerRadius="7dp"
    card_view:cardElevation="10dp">

    <LinearLayout
        android:background="@color/colorPrimary"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:weightSum="1">

        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <ImageView
                android:id="@+id/image"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/nonetwork1"
                android:layout_alignParentTop="true"
                android:layout_centerHorizontal="true"
                android:layout_marginLeft="3dp"
                android:layout_marginTop="11dp" />
        </LinearLayout>

        <LinearLayout
            android:layout_marginLeft="0dp"
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:weightSum="1">

            <TextView
                android:id="@+id/text"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textSize="14dp"
                android:gravity="center"
                android:textColor="#fff"
                android:text="You are not connected to Internet!"
                android:layout_marginTop="16dp"
                android:layout_below="@+id/image"
                android:layout_alignParentRight="true"
                android:layout_alignParentEnd="true" />

            <info.hoang8f.widget.FButton
                android:layout_width="wrap_content"
                android:layout_height="50dp"
                android:drawablePadding="0dp"
                android:minWidth="150dp"
                android:paddingLeft="30dp"
                android:paddingRight="20dp"
                android:paddingTop="5dp"
                android:paddingBottom="10dp"
                fbutton:cornerRadius="15dp"
                android:layout_gravity="center"
                android:gravity="center"
                fbutton:shadowEnabled="true"
                fbutton:shadowHeight="5dp"
                android:id="@+id/ok_button"
                android:textColor="@android:color/white"
                android:text="OK"
                android:layout_marginTop="22dp"
                android:layout_below="@+id/text"
                android:layout_centerHorizontal="true" />
        </LinearLayout>

    </LinearLayout>

</android.support.v7.widget.CardView>

введите здесь описание изображения Теперь создайте расширяемый класс Broadcast:

public class NetworkChangeReceiver extends BroadcastReceiver {
    String LOG_TAG = "NetworkChangeReceiver";
    public boolean isConnected = false;
    private SharedPreferences.Editor edit;
    private Boolean status;
    @Override
    public void onReceive(final Context context, final Intent intent) {

        Log.v(LOG_TAG, "Receieved notification about network status");
        status = isNetworkAvailable(context);

        if (status == false) {

            final Dialog dialog = new Dialog(context);
            dialog.setContentView(R.layout.alertforconnectioncheck);
            dialog.setTitle("No Internet Connection...");
            Button dialogButton = (Button) dialog.findViewById(R.id.ok_button);
            dialogButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    dialog.dismiss();
                }
            });
            dialog.show();
        }
    }

    private boolean isNetworkAvailable(Context context) {
        ConnectivityManager connectivity = (ConnectivityManager)
                context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivity != null) {
            NetworkInfo[] info = connectivity.getAllNetworkInfo();
            if (info != null) {
                for (int i = 0; i < info.length; i++) {
                    if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                        if(!isConnected){
                            Log.v(LOG_TAG, "Now you are connected to Internet!");
                            Toast.makeText(context, "Now you are connected to Internet!", Toast.LENGTH_LONG).show();
                            isConnected = true;
                        }
                        return true;
                    }
                }
            }
        }
        Log.v(LOG_TAG, "You are not connected to Internet!");
        Toast.makeText(context, "You are not connected to Internet!", Toast.LENGTH_LONG).show();
        isConnected = false;
        return false;
    }
}

Теперь в классе MainActivity вызовите класс Broadcast Receiver в onCreate:

private NetworkChangeReceiver receiver;
IntentFilter filter;
filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
        receiver = new NetworkChangeReceiver();
        registerReceiver(receiver, filter);  

Это настраиваемое диалоговое окно, которое появляется автоматически при отключении Интернета, и если у вас есть несколько Activities в приложении, вы должны вызывать его при каждом действии в onCreate надежде, что это поможет кому-то, кто ищет это решение.

person Sanjeev Sangral    schedule 14.12.2016
comment
я получаю исключение android.view.WindowManager$BadTokenException: невозможно добавить окно - токен null не для приложения - person Anjani Mittal; 17.07.2018