Android - 是否可以在清单文件中声明本地广播接收器?

时间:2017-05-23 13:35:57

标签: android broadcastreceiver android-broadcast android-broadcastreceiver localbroadcastmanager

我已在清单

中声明了我的接收器
<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();

        }

    }
}

但是当我从我的app中的其他地方执行此代码时:

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

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

问题:

  1. 是否可以在清单中注册本地广播接收器?
  2. 如果是这样,我是否错误地宣布了我的本地广播接收器?
  3. 如果无法在清单中声明本地广播接收器,而是在我的Application子类中声明它,它是否具有相同的范围&#39;作为清单中声明的​​接收者? (我的意思是,它会在与清单中宣布的情况相同的条件/情况下接收广播吗?)
  4. 如果在清单中指定接收者与在我的Application子类中指定接收者之间存在差异,我是否需要使用普通(非本地)广播而不是本地广播? (在实际应用中,当我的IntentService完成其工作时,将发送本地广播.InntService将由FCM推送消息触发。)
  5. 注意 - 我在the documentation似乎能找到的所有内容是:

      

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

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

1 个答案:

答案 0 :(得分:3)

  

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

没有

  

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

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

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

  

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

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