Ici, je crée une application en ligne qui ne dépend que d’Internet.
Donc, chaque fois qu'il y a une erreur de réseau, il doit en informer l'utilisateur. Pour cela, j'ai créé un BroadcastReciver qui reçoit un appel lorsque la connexion réseau est perdue (Internet).
Tout cela fonctionne parfaitement. Maintenant, ce dont j'ai besoin, c'est que je dois appeler une méthode d'activité à partir de ce récepteur de diffusion, où j'ai créé un dialogue d'alerte.
J'ai lu de nombreuses réponses sur stack-overflow.com que je peux déclarer cette méthode statique et appeler en utilisant uniquement le nom de l'activité,
par exemple MyActivityName.myMethod()
Mais je ne peux pas déclarer ma méthode statique, car j'utilise Alert Dialogue ici et cela me montre une erreur en ligne,
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
que Ne peut pas utiliser ceci dans un contexte statique .
Alors, comment puis-je appeler une méthode d'activité (ne doit pas être statique et sans démarrer cette activité) à partir d'un récepteur de diffusion?
Et puis-je obtenir le nom d'activité (ou de fragment) de Broadcast Receiver en cours d'exécution?
essayez ce code:
votre classe broadcastreceiver pour la classe internet perdue:
public class InternetLostReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
context.sendBroadcast(new Intent("INTERNET_LOST"));
}
}
dans votre activité, ajoutez ceci pour la diffusion d'appel:
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);
}
}
Ajouter une variable booléenne dans votre activité à partir de laquelle vous êtes ouvert alertdialog
boolean isDialogOpened = false;
// in broadcast recever check
if(isDialogOpened) {
alertDialog();
}
Et remplacez votre code pour alertdialog par celui-ci
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();
}
Vous pouvez créer une interface CallBackListener. L'interface fonctionnera comme un pont entre BroadcastReceiver
et Activity
.
1) Créer un CallbackListener
interface ConnectionLostCallback{
public void connectionLost();
}
2) Fournissez ConnectionLostCallback
dans votre BroadcastReceiver
public class MyBroadcastReceiver extends BroadcastReceiver{
private ConnectionLostCallback listener;
public MyBroadcastReceiver(ConnectionLostCallback listener ){
this.listener = listener //<-- Initialze it
}
@Override
public void onReceive(Context context, Intent intent) {
listener.connectionLost();
}
}
3) Implémentez la ConnectionLostCallback
dans votre activité et remplacez la méthode
YourActvity extends AppcompatActivity implements ConnectionLostCallback{
// Your Activity related code //
// new MyBroadcastReceiver(this); <-- create instance
private void showAlertMessage(){
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
}
@Override
public void connectionLost(){
showAlertMessage(); //<--- Call the method to shoe alert dialog
}
}
Si vous voulez savoir comment créer un BroadcastReceiver indépendamment de tout c.-à-d. comment pouvez-vous réutiliser le même BroadCastReceiver avec .__ différentes activités? Alors LISEZ CECI
Transmettez le contexte de votre activité au constructeur 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
}
}
et dans votre 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);
}
}
j'espère que ça aide