1

我已经在我的清单中声明了我的接收者:

<receiver
    android:name=".MyTestReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="com.example.ACTION_TEST"/>
    </intent-filter>
</receiver>

这是我的MyTestReceiver类:

public class MyTestReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        String action = intent.getAction();
        if ("com.example.ACTION_TEST".equals(action)) {

            Toast.makeText(context, "Test!", Toast.LENGTH_SHORT).show();

        }

    }
}

但是当我从我的应用程序中的其他地方执行此代码时:

Intent intent = new Intent("com.example.ACTION_TEST");
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

...没有接收到本地广播(即,未显示吐司)。

问题:

  1. 是否可以在清单中注册本地广播接收器?
  2. 如果是这样,我是否错误地声明了我的本地广播接收器?
  3. 如果无法在清单中声明本地广播接收器,而是在我的Application子类中声明它,它是否具有与清单中声明的​​接收器相同的“范围”?(我的意思是,它会在与清单中声明的​​所有相同条件/情况下接收广播吗?)
  4. 如果在清单中指定接收器与在我的子类中指定接收器之间存在差异Application,我是否需要使用一般(非本地)广播而不是本地广播?(在实际应用中,当我的 IntentService 完成工作时会发送本地广播。IntentService 将由 FCM 推送消息触发。)

注意-我似乎在文档中可以找到的所有内容是:

注意:要注册本地广播,请致电 LocalBroadcastManager.registerReceiver(BroadcastReceiver, IntentFilter)

...这并没有解决您是否可以在清单中指定接收者的主要问题。

4

1 回答 1

3

是否可以在清单中注册本地广播接收器?

不。

我在我的应用程序子类中声明它,它是否具有与清单中声明的​​接收器相同的“范围”?(我的意思是,它会在与清单中声明的​​所有相同条件/情况下接收广播吗?)

嗯,不。清单注册的接收器用于系统广播,源自任何进程。LocalBroadcastManager是本地的,用于您自己流程中的“广播”。

LocalBroadcastManager欢迎您在您的Application(例如,在它的)中注册一个接收器onCreate(),但我怀疑对于您要解决的任何问题都有更好的解决方案。

在实际应用中,本地广播将在我的 IntentService 完成工作时发送

然后接收者应该在需要知道该工作正在完成的活动或片段中注册。您Application不太可能需要知道该工作是否已完成,就好像它已经完成一样,您IntentService只需调用一个方法Application并绕过所有这些广播内容。

于 2017-05-23T13:42:58.107 回答