【问题标题】:android communicate between activity and broadcast receiverandroid在活动和广播接收器之间进行通信
【发布时间】:2011-10-16 11:37:15
【问题描述】:

我有一个显示从服务器获取的一些数据的活动。如果没有可用的连接,activity 会显示一些缓存数据;如果连接可用,则活动获取数据并显示它。这一切都按预期工作。
现在,我想让我的活动在连接发生后立即重新加载数据。我正在使用一个扩展广播接收器的简单接收器:

public class ConnectionChangeReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager connectivityManager = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
        if (activeNetInfo != null) {
            //what to do here? 
        } 
     }
}

广播接收器在我的清单文件中声明如下:

<receiver android:name=".ConnectionChangeReceiver"
          android:label="NetworkConnection">
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
        </intent-filter>
</receiver>

在我的活动中,我注册了接收者:

ConnectionChangeReceiver 接收者 = new ConnectionChangeReceiver(); this.registerReceiver(接收者, 新的 IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));

现在,我很困惑下一步该做什么。执行 onReceive 方法时,如何让我的活动意识到这一点?我知道我可以开始一项新活动,但这并不是我真正想要的。我应该将 ConnectionChangeReceiver 声明为我的活动的私有类吗?还是有其他解决办法?

【问题讨论】:

  • 在你想知道连接的活动内创建 ConnectionChangeReceiver 类,在 onRecieve 内,接收到连接信号后更新 UI 部分。

标签: android broadcastreceiver


【解决方案1】:

我认为将接收器构建为您的活动的私有子类是这里的方法。通过这种方式,您可以控制活动中的事件和数据。然后你可以只创建它的一个实例并像上面一样从代码中注册接收器。

请注意,您不必在清单和代码中都注册您的接收器。其中之一就足够了 - 清单基本上是一个“静态”注册,而在代码中进行它允许在运行时动态注册。此外,当您在清单中注册时,系统会自动创建、执行和终止接收器的新实例。在代码中做 reg 允许指向一个特定的实例。

【讨论】:

  • 但是如果我不想让广播接收器进入活动状态怎么办..??还有其他方法可以做到这一点..??
【解决方案2】:

接口方法!

您也可以通过接口进行通信。这种方法甚至有效 如果您的 BroadcastReceiver 在单独的文件中。你甚至不会 必须在广播中访问 Activity 的 UI 元素。

它非常简单。只需遵循这 3 个简单的步骤即可。

1) 创建界面

public interface MyListerner{

    public void performSomething(String arg);

} 

2) 在ConnectionChangeReceiver中初始化监听器

public class ConnectionChangeReceiver extends BroadcastReceiver {

      private MyListerner listener;

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

            listener = (MyListerner )context;  // initialse

            ConnectivityManager connectivityManager = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
            if (activeNetInfo != null) {

              listener.performSomething("Some data");   // Call listener method
              
            } 
      }
}

3) 在你的Activity中实现接口并重写方法

public class YourActivity implements MyListerner{
     
      // Activity relate stuff onCreate() etc 

     public void updateUI(String result){
         // Your code to update UI
     }

     @Override
     public void performSomething(String arg){
           updateUI(arg);
     }

}

相关链接: 可以详细阅读Why using an interface is a preferred approach in this case

【讨论】:

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