【问题标题】:Android - Prevent other apps from receiving an implicit intentAndroid - 防止其他应用程序接收隐式意图
【发布时间】: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();
    }

这里的问题是,当我同时打开应用 AB 时,当我在应用 A 中单击此对话框时(广播接收器未在清单中注册,而是在活动中运行时),两个应用程序都将接收意图并采取相应的行动(打开购买活动)。我想要实现的行为是只有应用程序 A(发出广播的那个)才能接收它,所以基本上意图不会广播到系统。

PS:两个应用程序都使用相同的调试密钥进行签名,但它们也使用相同的发布密钥。我很确定这个问题有一个简单的解决方案,但我似乎无法在文档中找到它。

PS2:我不想使用显式意图,因为库不知道将接收意图的组件。它只知道它们应该在同一个应用程序中。

【问题讨论】:

  • 您可以使用 android:exported="false" 来限制接收者只能拥有自己的应用程序
  • 您为什么要使用系统广播让图书馆与其托管应用程序对话?这类似于在街对面竖立一个巨大的广告牌,以便能够向您的隔壁邻居传递信息。使用回调。或者,使用事件总线(例如,LocalBroadcastManager,正如 Gabe Sechan 建议的那样)。

标签: android android-intent broadcastreceiver android-manifest


【解决方案1】:

使用 LocalBroadcastManager 仅向您当前的应用发送广播。也可以通过 LocalBroadcastManager 注册(而不是 BroadcastManager)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多