我有一个活动,显示从服务器获取的一些数据。如果没有可用的连接,活动将显示一些缓存数据;如果连接可用,则活动将获取数据并显示它。这一切都按预期工作 现在,我想让我的活动在连接发生后立即重新加载数据。我正在使用一个扩展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声明为我的活动的私有类吗?或者还有其他解决方案吗?
答案 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