【问题标题】:Android BroadcastReceiver within ActivityActivity 中的 Android BroadcastReceiver
【发布时间】:2011-06-01 02:40:04
【问题描述】:

我只是在尝试这个小示例项目,它所做的一切: 活动一有一个发送广播的按钮。活动二在收到时会显示祝酒词。 下面是代码,广播永远不会收到。我做错了什么?

发送广播

public class SendBroadcast extends Activity {

    public static String BROADCAST_ACTION = "com.unitedcoders.android.broadcasttest.SHOWTOAST";

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    public void sendBroadcast(View v){
        Intent broadcast = new Intent();
        broadcast.setAction(BROADCAST_ACTION);
        sendBroadcast(broadcast);
    }
}

收到

public class ToastDisplay extends Activity {

    private BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(getApplicationContext(), "received", Toast.LENGTH_SHORT);
        }
    };

    @Override
    protected void onResume() {
        IntentFilter filter = new IntentFilter();
        filter.addAction(SendBroadcast.BROADCAST_ACTION);
        registerReceiver(receiver, filter);
        super.onResume();
    }

    @Override
    protected void onPause() {
        unregisterReceiver(receiver);
        super.onPause();
    }
}

清单

<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".SendBroadcast" android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".ToastDisplay">
        <intent-filter>
            <action android:name="com.unitedcoders.android.broadcasttest.SHOWTOAST"></action>
        </intent-filter>
    </activity>
</application>

【问题讨论】:

  • 那么你找到答案了吗?我有同样的问题。我实际上有一个本地服务,它广播当前打开的活动监听的意图(注册一个广播接收器,就像你在上面做的那样)。活动永远不会收到消息。我没有在清单中放任何东西,但由于我正在注册广播接收器,我认为我不需要。你有没有让你的工作?
  • 谢谢。原来我的issue 是另一个涉及指定 MIME 类型的。
  • 嗨 nheid 我也在寻找相同的 .. 并且还实现了你上面的代码,但它不起作用意味着 Broadcat 正在发送到其他活动..请帮助..
  • Broadcat 没有发送到其他活动
  • 嗨 Garret Wilson,您找到上述解决方案了吗?

标签: android broadcastreceiver


【解决方案1】:

您还必须在 onCreate() 中注册接收器,如下所示:

IntentFilter filter = new IntentFilter();
filter.addAction("csinald.meg");
registerReceiver(receiver, filter);

【讨论】:

    【解决方案2】:

    你忘记在最后写 .show() ,它是用来显示 toast 消息的。

    Toast.makeText(getApplicationContext(), "received", Toast.LENGTH_SHORT).show();
    

    这是程序员经常犯的错误,但我相信在此之后你不会再犯这个错误了... :D

    【讨论】:

      【解决方案3】:

      使用 BroadcastReceiver 扩展 ToastDisplay 类并在清单文件中注册接收器,不要在 onResume() 中注册您的广播接收器。

      <application
        ....
        <receiver android:name=".ToastDisplay">
          <intent-filter>
            <action android:name="com.unitedcoders.android.broadcasttest.SHOWTOAST"/>
          </intent-filter>
        </receiver>
      </application>
      

      如果您想在活动中注册,请在 onCreate() 方法中注册,例如:

      onCreate(){
      
          sentSmsBroadcastCome = new BroadcastReceiver() {
      
              @Override
              public void onReceive(Context context, Intent intent) {
                  Toast.makeText(context, "SMS SENT!!", Toast.LENGTH_SHORT).show();
              }
          };
          IntentFilter filterSend = new IntentFilter();
          filterSend.addAction("m.sent");
          registerReceiver(sentSmsBroadcastCome, filterSend);
      }
      

      【讨论】:

        【解决方案4】:
         Toast.makeText(getApplicationContext(), "received", Toast.LENGTH_SHORT);
        

        制作吐司,但不显示。

        你必须做Toast.makeText(getApplicationContext(), "received", Toast.LENGTH_SHORT).show();

        【讨论】:

        • +1:如果可以的话,我会多次投票 - 我过去多久这样做一次。我认为这是一个常见的错误。
        • 谁想要创建一个 toast 而不想展示它。不必要的命令:show()。大声笑
        • @alicanbatur 虽然晚了:因为你可以操纵 toast 对象
        【解决方案5】:

        我认为您的问题是您在其他活动开始之前发送了广播!所以其他活动不会收到任何东西。

        1. 测试代码的最佳做法是从线程或服务发送广播,以便打开 Activity 并注册接收器,然后后台进程发送消息。
        2. 从发件人活动开始 ToastDisplay 活动(我没有测试过,但它可能会起作用)

        【讨论】:

          【解决方案6】:

          我做错了什么?

          ToastDisplay 的源代码是可以的(我的类似并且可以工作),但它只会接收一些东西,如果它当前在前台(你在 onResume 中注册接收器)。但如果显示不同的活动(在本例中为 SendBroadcast 活动),它就无法接收任何内容。

          您可能想从第一个活动中startActivity ToastDisplay?

          BroadcastReceiver 和 Activity 在不同的用例中有意义。 In my application我需要接收来自后台 GPS 跟踪服务的通知并将它们显示在活动中(如果活动在前台中)。

          无需在清单中注册接收器。在我的用例中,它甚至是有害 - 我的接收器操纵活动的 UI,如果活动当前未显示,则在 onReceive 期间 UI 将不可用。相反,我在 onResume 和 onPause 中为活动注册和取消注册接收器,如中所述 BroadcastReceiver documentation:

          您可以使用 Context.registerReceiver() 动态注册此类的实例,也可以通过 AndroidManifest.xml 中的标记静态发布实现。

          【讨论】:

          • 如何从 BroadcastReceiver 的 onReceive() 方法中检查哪个活动在前台?
          • @zmeda 这不是你应该想的那样:要么你知道哪些活动会受到 boradcastreceiver 的影响并且你为所有这些活动注册了一个接收者,或者你不想与活动交互并注册应用清单中的接收者。
          • 一个问题。有什么理由在两种方法结束时调用 super 吗?还是没关系?谢谢。
          【解决方案7】:

          您需要将接收者定义为清单中的一个类,它将接收意图:

          <application
            ....
            <receiver android:name=".ToastReceiver">
              <intent-filter>
                <action android:name="com.unitedcoders.android.broadcasttest.SHOWTOAST"/>
              </intent-filter>
            </receiver>
          </application>
          

          而且您不需要在 ToastDisplay 中手动创建类。

          在您提供的代码中,您必须在 ToastDisplay 活动中才能实际接收 Intent。

          【讨论】:

          • 好的,我有。这样可行。但是如果我想让它成为一个活动,我该怎么办,例如我想更改一些标签?
          • 请详细说明您要做什么。可能您不需要使用 BroadcastReceiver 并为此启动另一个线程(AsyncTask 是最好的)?或者您可以向 Activity 发送回一个意图。
          • 让我们假设活动二(接收部分)是一个显示统计数据的活动。每当用户在活动一中执行某些特殊事件或后台服务有新信息时,我都想更新活动二中的信息。
          • 发送具有特殊属性的 Intent,仅在 Activity 已打开时才发送 Intent。有关如何执行此操作,请参阅 Intent 的 javadocs。
          • 另一个提示:看看来自 SDK 的samples/android-8/ApiDemos/src/com/example/android/apis/app/OneShotAlarm.java
          猜你喜欢
          • 1970-01-01
          • 2014-04-10
          • 2015-03-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多