0

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

Здесь код 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(); 
} 

}

+0

В чем проблема? – Richa

+0

Зачем вам нужен диалог, чтобы всплывать спонтанно (с точки зрения пользователя)? Почему бы не использовать уведомление; для чего они нужны. –

+0

@PSK Я обновил свой ответ для более подробной информации ..... прочитал об этом .. –

ответ

7

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

У вас есть альтернативное решение, чтобы показать активность, такую ​​как AlertDialog от Receiver. Это возможно.

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

Style Any Activity as an Alert Dialog in 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() для отправки команды службе. More...

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

День кодирование :)

+0

Кажется полезным. позвольте мне попробовать это. @Pankaj Kumar – PSK

+0

не могли бы вы объяснить мне, что делает setClassName() метод? @Pankaj Kumar – PSK

+0

да конечно .. это эквивалентно 'new Intent (context, YourActivity.class)', но здесь вам нужно полное имя класса, включая пакет. Вы можете использовать 'new Intent (context, YourActivity.class)' тоже .. –

0

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

дополнительная информация проверки AlertDialog from within BroadcastReceiver?? Can it be done?

+0

это не возможно для меня –

+0

Ok @ Richa .. Я проверяю вашу ссылку – PSK

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

Что такое AdShowDialog в этом коде, я получаю ошибку на этом. @buptcoder – PSK

+0

Извините, я забыл изменить имя. Я скопировал код из моего проекта. – buptcoder

+0

нормально, спасибо ... @ buptcoder – PSK

0

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

enter image description here Теперь сделайте 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, он надеется, что это поможет кому-то, кто ищет это решение.

Смежные вопросы