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