【发布时间】:2017-02-21 22:12:39
【问题描述】:
我正在构建几个应用程序,它们都包含我创建的库模块。在这个库模块中,我定义了一个通用的对话框,它像这样广播“购买”意图:
@Override public void onClick(View view) {
int i = view.getId();
if (i == R.id.btnYes) {
view.getContext().sendBroadcast(new Intent(PayComponent.ACTION_OPEN_PAY_SCREEN)
.putExtra(PayComponent.EXTRA_FROM_PURCHASE_DIALOG, true)
.putExtra(PayComponent.EXTRA_PURCHASE_PACKAGE_NAME, packageName)
);
} else if (i == R.id.btnNo) {
//
}
dismiss();
}
这里的问题是,当我同时打开应用 A 和 B 时,当我在应用 A 中单击此对话框时(广播接收器未在清单中注册,而是在活动中运行时),两个应用程序都将接收意图并采取相应的行动(打开购买活动)。我想要实现的行为是只有应用程序 A(发出广播的那个)才能接收它,所以基本上意图不会广播到系统。
PS:两个应用程序都使用相同的调试密钥进行签名,但它们也使用相同的发布密钥。我很确定这个问题有一个简单的解决方案,但我似乎无法在文档中找到它。
PS2:我不想使用显式意图,因为库不知道将接收意图的组件。它只知道它们应该在同一个应用程序中。
【问题讨论】:
-
您可以使用 android:exported="false" 来限制接收者只能拥有自己的应用程序
-
您为什么要使用系统广播让图书馆与其托管应用程序对话?这类似于在街对面竖立一个巨大的广告牌,以便能够向您的隔壁邻居传递信息。使用回调。或者,使用事件总线(例如,
LocalBroadcastManager,正如 Gabe Sechan 建议的那样)。
标签: android android-intent broadcastreceiver android-manifest