【问题标题】:Intent & BroadcastReceiver意图和广播接收器
【发布时间】:2014-04-02 03:52:54
【问题描述】:

我开始学习android开发,所以我的知识目前真的很有限。 我正在尝试播放广播,但我被卡住了,我无法理解我做错了什么。 我正在尝试做的只是从广播接收器显示一个简单的 Toast。

Intent 是在清单中定义的自定义 Intent:

<receiver android:name=".receiver.SendReceiver" android:enabled="true">
     <intent-filter>
   <action android:name="com.android.terralink.sem.SOCCIA"></action>
     </intent-filter>
</receiver>

接收者定义如下:

public class SearchReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent){
   Toast.makeText(context, "asasa", Toast.LENGTH_SHORT).show();
   }
}

在从应用程序调用的第一个操作中,我这样做:

Intent i2 = new Intent(this, SearchReceiver.class);
i2.setAction(CUSTOM_INTENT);
sendBroadcast(i2);

我检查了 Toast 代码在 Activity 中有效,但在广播中无效。 是因为 Toast 无法在接收者上下文中显示?

另外,另一个关于 android 应用程序结构的问题。 如果从我的 Activty 我允许用户在文本框中插入字符串并提交(按钮绑定),并且我希望应用程序在后台进行搜索并在结果准备好后通知用户,那么以下操作是否正确? 1) 带搜索框的主要活动 2)启动一个获取数据的服务,发送一个广播 3)接收者通知用户并打开一个显示结果的Activity

这样做有意义吗? 或者通知应该由服务本身在完成其工作之前完成?

谢谢

【问题讨论】:

    标签: android broadcastreceiver


    【解决方案1】:

    我在注册接收器时发现问题出在清单中。 实际上,可以在接收器中显示 Toast 而没有任何问题。 干杯

    【讨论】:

      【解决方案2】:

      您不能在广播接收器中显示 Toast。 一旦 onReceive() 调用完成,Android 通常会关闭您的进程(目前它只允许最多花费 10 秒)。由于 toast 是异步显示的,我认为它的上下文在显示之前就被杀死了。

      作为 Toast 的替代方案,您可以查看 RemoveViews 的概念,用于从接收器更新另一个进程中的 UI。或者,启动一个显示 toast 并立即关闭的 Activity。

      对于您的问题 #2,我建议您在单击搜索按钮后保持活动运行,并启动 AsyncTask 进行搜索,当搜索结果进入时更新搜索结果。

      【讨论】:

      • 是的,这是有道理的,我认为发生了什么,只是不是 100% 确定。非常感谢
      【解决方案3】:

      要显示来自广播接收器的 toast,我们可以使用以下代码:

      public class ServiceReceiver extends BroadcastReceiver {
      
          Context context;
      
          @Override
          public void onReceive(Context context, Intent intent) {
              this.context = context;
              MyPhoneStateListener phoneListener = new MyPhoneStateListener();
              TelephonyManager telephony = (TelephonyManager) context
                      .getSystemService(Context.TELEPHONY_SERVICE);
              telephony.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);
          }
      
          private class MyPhoneStateListener extends PhoneStateListener {
      
              @Override
              public void onCallStateChanged(int state, String incomingNumber) {
                  super.onCallStateChanged(state, incomingNumber);
                  switch (state) {
                  case TelephonyManager.CALL_STATE_IDLE:
                      Toast.makeText(context, "Idle call", Toast.LENGTH_LONG).show();
                      Log.d("***************************DEBUG", "IDLE");
                      break;
                  case TelephonyManager.CALL_STATE_OFFHOOK:
                      Log.d("***************************DEBUG", "OFFHOOK");
                      break;
                  case TelephonyManager.CALL_STATE_RINGING:
                      Toast.makeText(context, "Ringing call", Toast.LENGTH_LONG)
                              .show();
                      Log.d("***************************DEBUG", "RINGING");
                      break;
                  }
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多