Как отправить BroadCast из одного приложения в другое приложение
У меня есть приложение A и приложение B. В приложении AI я хочу отправить трансляцию в приложение B. Вот код для приложения 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);
А в приложении B - В MainActivity
меня есть класс 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);
}
}
Я получаю сообщение об ошибке - получатель не зарегистрирован.
Ответы
Ответ 1
Первым делом сначала объявите получателя в приложении B в файле манифеста следующим образом:
<receiver android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.pkg.perform.Ruby" />
</intent-filter>
</receiver>
при отправке трансляции добавьте флаг FLAG_INCLUDE_STOPPED_PACKAGES
в намерение [src], поскольку при трансляции из приложения A в приложение B приложение B может не работать, этот флаг гарантирует, что трансляция охватит даже приложения, которые не запущены:
Флаг FLAG_INCLUDE_STOPPED_PACKAGES добавляется в намерение перед его отправкой, чтобы указать, что намерению разрешено запускать компонент остановленного приложения.
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
В вашем случае это будет так:
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);
Ответ 2
Могут быть два случая:
- Ваше приложение не работает, поэтому действие не создается, поэтому получатель не зарегистрирован.
- Ваша деятельность уничтожена, означает, что вы зарегистрировали регистратор, зарегистрированный через registerReceiver(), в onCreate()
Решение:
Зарегистрируйте приемник вещания в манифесте.
Внутри манифеста appB:
<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="com.pkg.perform.Ruby" />
</intent-filter>
</receiver>
И закомментируйте строку в appA
intent.setComponent(new ComponentName("com.pkg.AppB","com.pkg.AppB.MainActivity"));
Запишите логику в MyBroadcastReceiver, чтобы отобразить соответствующие данные/запустить новую активность.
Ответ 3
MyReceiver - это класс не объект. Создать
myReceiver = new MyReceiver();
и поместите...........
registerReceiver(myReceiver,intentFilter);
Ответ 4
Если это помогает кому-то, и это работает для меня
В приложении A в действии или в контенте provider-
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);
В приложении B в манифесте
<receiver
android:name=".DbaseChanged"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="Updated" />
</intent-filter>
</receiver>
В приложении B приемник вещания 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();
}
}
}
Ответ 5
В приложении A: отправьте трансляцию здесь.
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);
В приложении B манифест
<receiver android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.pkg.perform.Ruby" />
</intent-filter>
</receiver>
В приложении B MainActivity: зарегистрируйте получателя oncreate() и отмените регистрацию 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);
}}
В приложении 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);
}
}
Ответ 6
В Android 9 (уровень API 28) мне нужно было определить свой BroadcastReceiver
внутри кода только для того, чтобы он работал.
Как это (добавлено внутри службы в моем случае - не имеет значения)
private MyReceiver myReceiver;
@Override
public void onCreate() {
myReceiver = new MyReceiver();
this.registerReceiver(welcomeAppReceiver, new IntentFilter("android.intent.action.myreceiver"));
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(myReceiver);
}
private class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
try {
if (intent.getAction().equals("android.intent.action.myreceiver")) {
//logic goes here
}
} catch (Exception e) {
//some log goes here
}
}
}
Отправь трансляцию вот так
Intent intentMy = new Intent();
intentMy.setAction("android.intent.action.myreceiver");
intentMy.putExtra("whatever", true);
sendBroadcast(intentMy);