Вызов метода действия из 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);
    }
}

надеюсь, что это помогает