Вызов метода действия из BroadcastReceiver в Android
здесь я создаю онлайн-приложение, которое зависит только от Интернета.
поэтому всякий раз, когда есть сетевая ошибка, она должна уведомлять пользователя. Для этого я создал BroadcastReciver, который получает вызов, когда сетевое соединение теряется(интернет).
все это прекрасно работает. Теперь мне нужно, чтобы я вызвал метод действия из этого широковещательного приемника, где я создал Диалог оповещения.
Я прочитал много ответов на stack-overflow.com что я могу объявить этот метод статическим и вызвать, используя только имя действия,
Эл.г MyActivityName.myMethod()
но я не могу объявить свой метод статическим, потому что я использую Диалог Alert, и он показывает мне ошибку в строке,
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
это не может использовать это в статическом контексте.
Итак, как я могу вызвать метод активности (не должен статический и без запуска этой активности) из широковещательного приемника ?
и могу ли я получить имя активности(или фрагмента) из широковещательного приемника, который в настоящее время работает?
3 ответов
попробуйте этот код :
ваш класс broadcastreceiver для потерянного класса интернета:
public class InternetLostReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
context.sendBroadcast(new Intent("INTERNET_LOST"));
}
}
в вашей деятельности добавьте это для вызова трансляции:
public class TestActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
registerReceiver(broadcastReceiver, new IntentFilter("INTERNET_LOST"));
}
BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// internet lost alert dialog method call from here...
}
};
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(broadcastReceiver);
}
}
добавьте логическую переменную в действие, откуда вы открываете alertdialog
boolean isDialogOpened = false;
// in broadcast recever check
if(isDialogOpened) {
alertDialog();
}
и замените свой код для alertdialog на этот
public void alertDialog() {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
alertDialog.setMessage("Network not found.");
alertDialog.setPositiveButton("Check Setting",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
});
alertDialog.setNegativeButton("Cancel",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
});
alertDialog.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
isDialogOpened = false;
}
});
alertDialog.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
isDialogOpened = false;
}
});
alertDialog.show();
}
передайте контекст вашей деятельности в contructor BroadcastReceiver.
public class ResponseReceiver extends BroadcastReceiver{
MainActivity ma; //a reference to activity's context
public ResponseReceiver(MainActivity maContext){
ma=maContext;
}
@Override
public void onReceive(Context context, Intent intent) {
ma.brCallback("your string"); //calling activity method
}
}
и В класса MainActivity
public class MainActivity extends AppCompatActivity {
...
public void onStart(){
...
ResponseReceiver responseReceiver = new ResponseReceiver(this); //passing context
LocalBroadcastManager.getInstance(this).registerReceiver(responseReceiver,null);
...
}
public void brCallback(String param){
Log.d("BroadcastReceiver",param);
}
}
надеюсь, что это помогает