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é .
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);
Il peut y avoir deux cas:
- 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é.
- 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é
MyReceiver est une classe pas un objet. Créer
myReceiver = new MyReceiver();
et met...........
registerReceiver(myReceiver,intentFilter);
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();
}
}
}