android在活动和广播接收器之间进行通信

时间:2011-07-30 10:09:17

标签: android broadcastreceiver

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

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 receiver = new ConnectionChangeReceiver();   this.registerReceiver(接收器,                 新的IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));

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

2 个答案:

答案 0 :(得分:11)

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

请注意,您无需在清单和代码中注册接收方。其中一个是enugh - 清单基本上是一个“静态”注册,而在代码中执行它允许在运行时动态注册。此外,当您在清单中注册时,将自动从系统创建接收器的新实例,执行并终止。在代码中执行reg可以指向一个特定的实例。

答案 1 :(得分:0)

接口方法!

  

您也可以通过界面进行通信。这种方法甚至有效   如果您的BroadcastReceiver在单独的文件中。你甚至都不会   必须访问广播中的活动的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)实现界面并在“活动”中覆盖方法

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