[英]How to Send BroadCast from one app to another app
我有 App A 和 App B。在 App AI 中,要向 App B 发送广播。这是 App 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);
在 App 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);
}
}
我收到错误 -接收器未注册。
首先,首先在清单文件中的 app 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);
在 App 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);
在 App B 清单中
<receiver android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.pkg.perform.Ruby" />
</intent-filter>
</receiver>
在 App 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);
}
}
在 App B 中广播接收器
public class MyBroadcastReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
String data = intent.getStringExtra("data");
Log.i("BR" ,"Data received: " + data);
}
}
可能有两种情况:
- 您的 appB 未运行,因此未实例化活动,因此未注册接收器。
- 您的活动已被销毁,这意味着您已取消注册您在 onCreate() 中通过 registerReceiver() 注册的接收器
解决方案 :
在清单中注册您的广播接收器。
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 中编写逻辑以显示相关数据/启动新活动
MyReceiver 是类而不是对象。 创建
myReceiver = new MyReceiver();
并把......
registerReceiver(myReceiver,intentFilter);
如果这对某人有帮助并且对我有用
在应用程序 A 中的活动或内容提供者中-
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);
在清单中的 App B 中
<receiver
android:name=".DbaseChanged"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="Updated" />
</intent-filter>
</receiver>
在 App B 广播接收器类中-
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();
}
}
}
当我在清单中注册广播接收器时,我需要调用setPackage("package_name")
以确保明确性。 即使应用程序完全关闭,我也能够接收数据。
// sending app sends broadcast
Intent intent = new Intent(ACTION_RECOMMEND);
intent.putExtra(LISTEN_RECOMMENDATION, "Triggered - Jhene Aiko");
intent.putExtra(WATCH_RECOMMENDATION, "Goblin - Kim Go-eun");
intent.setPackage("com.example.package.receiverapp");
sendBroadcast(intent);
//receiving app manifest registers receiver
<receiver
android:name=".ManifestRegisteredBroadcastReceiver"
android:exported="true">
<intent-filter>
<action android:name="com.random.action.RECOMMEND" />
</intent-filter>
</receiver>
通过活动注册接收器时,我不需要添加intent.setPackage(package_name)
,但这也意味着如果活动被破坏,我将无法获取数据(应用程序关闭,应用程序在后台长时间运行)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.