web-dev-qa-db-fra.com

Comment envoyer BroadCast d'une application à une autre application

J'ai App A et App B. Dans App A, je veux envoyer une diffusion à App B .

final Intent intent = new Intent();
intent.setAction("com.pkg.perform.Ruby");
intent.putExtra("KeyName", "code1id");
intent.setComponent(new ComponentName("com.pkg.AppB", "com.pkg.AppB.MainActivity"));
sendBroadcast(intent);

Et dans l’App B - Dans MainActivity, j’ai MyBroadCastReceiver Class. 

public class MainActivity extends Activity {
    private MyBroadcastReceiver MyReceiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Receive broadcast from External App
        IntentFilter intentFilter = new IntentFilter("com.pkg.perform.Ruby");
        MyReceiver = new MyBroadcastReceiver();
        if(intentFilter != null)
        {
            registerReceiver(MyReceiver, intentFilter);
        }
    }

    public class MyBroadcastReceiver extends BroadcastReceiver
    {
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(MainActivity.this, "Data Received from External App", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(MyReceiver != null)
            unregisterReceiver(MyReceiver);
    }
}

Je reçois le message d'erreur - Le récepteur n'est pas enregistré .

29
abh22ishek

Tout d'abord, déclarez le destinataire dans l'application B dans le fichier manifeste comme ceci: 

<receiver Android:name=".MyBroadcastReceiver"
    Android:enabled="true"
    Android:exported="true">
        <intent-filter>
          <action Android:name="com.pkg.perform.Ruby" />
        </intent-filter>
</receiver>

lors de l'envoi de la diffusion, ajoutez le drapeau FLAG_INCLUDE_STOPPED_PACKAGES à l'intention [src] car, lorsque vous diffusez de l'application A à l'application B, l'application B peut ne pas être en cours d'exécution.

L'indicateur FLAG_INCLUDE_STOPPED_PACKAGES est ajouté à l'intention avant celle-ci est envoyé pour indiquer que l’intention doit être autorisée à démarrer un composant d'une application arrêtée.

intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);

Dans votre cas ce sera comme ça: 

    final Intent intent=new Intent();
    intent.setAction("com.pkg.perform.Ruby");
    intent.putExtra("KeyName","code1id");
    intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
    intent.setComponent(  
        new ComponentName("com.pkg.AppB","com.pkg.AppB.MyBroadcastReceiver"));  
    sendBroadcast(intent);
36
dsharew

Il peut y avoir deux cas:

  1. Votre appB n'est pas en cours d'exécution, l'activité n'est donc pas instanciée et le récepteur n'est pas enregistré.
  2. Votre activité est détruite, cela signifie que vous avez annulé l'enregistrement de votre récepteur enregistré via registerReceiver () dans onCreate ().

Solution : 

Enregistrez votre récepteur de radiodiffusion dans le manifeste.

Manifeste intérieur de appB: 

<receiver Android:name=".MyBroadcastReceiver">
    <intent-filter>
        <action Android:name="com.pkg.perform.Ruby" />
    </intent-filter>
</receiver>

Et commentez la ligne dans appA

intent.setComponent(new ComponentName("com.pkg.AppB","com.pkg.AppB.MainActivity"));

Écrivez la logique dans MyBroadcastReceiver pour afficher les données pertinentes/lancer une nouvelle activité 

2
abhishesh

MyReceiver est une classe pas un objet. Créer 

myReceiver = new MyReceiver(); 

et met...........

registerReceiver(myReceiver,intentFilter);
0
d.k.

Si cela aide quelqu'un et que cela fonctionne pour moi

Dans l'application A en activité ou dans un fournisseur de contenu-

  Intent intent = new Intent("Updated");
  intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
  intent.setComponent (new
  ComponentName "com.exam.appA",
  "com.exam.appA.DbaseChanged"));
  getContext().sendBroadcast(intent);

Dans App B dans le manifeste

      <receiver
        Android:name=".DbaseChanged"
        Android:enabled="true"
        Android:exported="true">
        <intent-filter>
            <action Android:name="Updated" />
        </intent-filter>
      </receiver>

Dans App B Broadcast Broadcast Class-

    public class DbaseChanged extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent
     intent)   {

           String act = intent.getAction();
           if(act != null && act.equals("Updated")  )
            {
                Toast.makeText(context, act ,
              Toast.LENGTH_SHORT).show();

            }

            }
       }
0
Jro