una studio programacion permisos example editar componentes aplicacion androidmanifest android broadcastreceiver broadcast

studio - manual de programacion android pdf



Cómo enviar BroadCast de una aplicación a otra aplicación (5)

Tengo la aplicación A y la aplicación B. En la aplicación AI quiero enviar la transmisión a la aplicación B. Este es el código para la aplicación A:

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);

Y en la aplicación B: en MainActivity , tengo la clase MyBroadCastReceiver .

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); } }

Recibo el error: el receptor no está registrado .


En la aplicación A: envíe la transmisión aquí.

final Intent i= new Intent(); i.putExtra("data", "Some data"); i.setAction("com.pkg.perform.Ruby"); i.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); getApplicationContext().sendBroadcast(i);

En el manifiesto de la aplicación B

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

En la aplicación B MainActivity: registre el receptor oncreate () y anule el registro de onDestroy ()

public class MainActivity extends AppCompatActivity { private MyBroadcastReceiver MyReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MyReceiver = new MyBroadcastReceiver(); IntentFilter intentFilter = new IntentFilter("com.pkg.perform.Ruby"); if(intentFilter != null) { registerReceiver(MyReceiver, intentFilter); } @Override protected void onDestroy() { super.onDestroy(); if(MyReceiver != null) unregisterReceiver(MyReceiver); }}

En la aplicación B BroadcastReceiver

public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String data = intent.getStringExtra("data"); Log.i("BR" ,"Data received: " + data); } }


Lo primero es declarar el receptor en la aplicación B en el archivo de manifiesto de esta manera:

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

al enviar la transmisión, agregue el indicador FLAG_INCLUDE_STOPPED_PACKAGES a la intención [src] porque cuando difunde desde la aplicación A a la aplicación B, la aplicación B podría no estar ejecutándose, este indicador asegura que la transmisión llegue incluso a las aplicaciones que no se están ejecutando:

El indicador FLAG_INCLUDE_STOPPED_PACKAGES se agrega a la intención antes de que se envíe para indicar que se debe permitir que la intención inicie un componente de una aplicación detenida.

intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);

En tu caso será así:

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);


MyReceiver es clase, no objeto. Crear

myReceiver = new MyReceiver();

y pon...........

registerReceiver(myReceiver,intentFilter);


Puede haber dos casos:

  1. Su aplicación B no se está ejecutando, por lo tanto, la actividad no se instancia y, por lo tanto, el receptor no está registrado.
  2. Su actividad se destruye, significa que no ha registrado su receptor que registró a través de registerReceiver () en onCreate ()

Solución:

Registre su receptor de difusión en manifiesto.

Manifiesto interno de appB:

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

Y comenta la línea en appA

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

Escriba la lógica en MyBroadcastReceiver para mostrar datos relevantes / iniciar una nueva actividad


Si esto ayuda a alguien y funciona para mí

En la aplicación A en actividad o en un proveedor de contenido:

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);

En la aplicación B en el manifiesto

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

En la aplicación Receptor de difusión B clase-

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(); } } }