Как настроить 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();
}

}

Ответ 1


Хотя вы не можете отображать AlertDialog из приемников, потому что ему нужен ActivityContext.

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

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

Стиль Любая активность в качестве диалогового окна оповещений в Android


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

    //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 действителен только на время вызова to onReceive (Контекст, намерение). Как только ваш код вернется из этого функции, система считает объект законченным и больше не активным.

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

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

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

Счастливое кодирование:)

Ответ 2

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

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

Ответ 4

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