【问题标题】:My Android broadcast receiver is never triggered我的 Android 广播接收器永远不会被触发
【发布时间】:2017-04-19 20:30:35
【问题描述】:

在 AndroidManifest.xml 我有这个:

<receiver android:name=".MyBroadcast"  android:exported="true"/>

我的广播文件:

package com.myapp;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;


public class MyBroadcast extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Intent intent1 = new Intent(context, Radio.class);
        intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent1);
    }
}

我正在尝试关闭应用程序以在后台播放音乐后运行它。

【问题讨论】:

  • 您能澄清一下您正在收听的广播吗?
  • 你能解释一下“关闭后运行应用程序”是什么意思吗?

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


【解决方案1】:

那是因为你从不指定你实际监听的意图。

您需要注册广播接收器以侦听特定广播(事件),无论是在清单中使用intent-filter tag 还是在运行时动态地。有关差异的更多讨论,请参阅this question

这是如何在清单中执行此操作的示例(来自链接的问题):

<receiver android:name="TestReceiver">
        <intent-filter>
            <action android:name="android.media.AUDIO_BECOMING_NOISY"/>
        </intent-filter>
    </receiver>

这意味着广播接收器正在侦听AUDIO_BECOMING_NOISY 意图。 (您需要用更合适的意图替换它,以反映您希望它何时运行)。

有一个非常有用的 Intent 列表,您可以收听 here。您可以从那里(或从其中一个库)选择广播,或者,如果您正在侦听应用程序中发生的事件,您可以自己发起广播。

此外,请确保实际提出了相关事件。如果您正在收听的广播从未发生,则广播接收器将永远不会真正被触发。

相关阅读见Observer Pattern(这是Android广播接收器实现的设计模式)。

【讨论】:

  • @Skyterix 您尝试聆听的目的是什么?结果如何?
  • @Skyterix 你在清单中放了什么?该特定意图是否在某个时候被广播?
  • @Skyterix 我只是举个例子 - 将 &lt;action android:name="android.media.AUDIO_BECOMING_NOISY"/&gt; 行替换为您真正想要收听的意图
  • @Skyterix 您希望何时触发广播接收器?哪个活动?它是发生在您的应用内部的事件还是发生在应用外部的事件?
【解决方案2】:

onReceive() 方法仅在您注册的事件发生时调用。您尚未声明将触发onReceive() 方法的事件。所以,广播接收器不知道它应该监听什么。

您应该阅读更多关于 Broadcast Receivers 和 Android 文档中的 Activity 生命周期方法的信息。

我认为您不需要使用广播接收器。当您的应用程序关闭时,您可以使用 Activity 生命周期方法做任何您想做的事情。

【讨论】:

    【解决方案3】:

    onReceive() 方法仅在您注册的事件发生时调用。您尚未声明将触发 onReceive() 方法的事件。所以,广播接收器不知道它应该监听什么。

    您应该阅读 Android 文档中有关广播接收器和活动生命周期方法的更多信息。

    这类似于要求 X(任何人)为您从市场上获得 ________。他在市场上寻找________,但他不知道它是什么。所以,很明显,他不能为你得到它。您需要告诉接收者要查找的内容。

    【讨论】:

    • 我正在尝试进行广播,在应用程序关闭后启动 Radio.class。 (我是 Java 新手)
    • onReceive() 方法仅在您注册的事件发生时调用。您尚未声明将触发onReceive() 方法的事件。所以,广播接收器不知道它应该监听什么。
    • @rayan 您应该使用您最近的评论编辑您的答案(或删除原始评论并将评论作为答案发布) - 实际上,您的评论问题。 (其实是正确答案)。
    • 应用程序关闭后”是什么意思。这是否意味着您的应用程序进程终止或仅当应用程序处于后台时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 2022-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    相关资源
    最近更新 更多