【问题标题】:Detect connectivity change within Android Activity subclass检测 Android Activity 子类中的连接变化
【发布时间】:2013-10-11 16:05:26
【问题描述】:

我对 Android 比较陌生,

我已阅读有关检测网络连接更改的相关文章,并已实现此BroadcastReceiver 子类,对 AndroidManifest.xml 进行了必要的添加,并且我按预期收到了必要的状态更改广播:

public class NetworkStateReceiver extends BroadcastReceiver {

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

    }
}

问题是:如何在Activity 子类中接收或转发这些通知?显然在我的Activity 子类中创建NetworkStateReceiver 的实例并覆盖onReceive 并没有成功。

提前感谢您的任何指点...

编辑:

我最终从上面的onReceive 广播了一个Intent,如下所示:

Intent target = new Intent(CONNECTIVITY_EVENT);
target.putExtra(CONNECTIVITY_STATE, networkInfo.isConnected());
context.sendBroadcast(target);

并在我的Activity 中收到这样的信息:

@Override
protected String[] notifyStrings() {
     return ArrayUtils.addAll(super.notifyStrings(), new String[] {NetworkStateReceiver.CONNECTIVITY_EVENT});
}

@Override
protected void notifyEvent(Intent intent, String action) {
    super.notifyEvent(intent, action);
    if (action != null) {
        if (action.equalsIgnoreCase(NetworkStateReceiver.CONNECTIVITY_EVENT)) {
            boolean isConnected = intent.getBooleanExtra(NetworkStateReceiver.CONNECTIVITY_STATE, true);
            // Do something...
        }
    }
}

【问题讨论】:

    标签: java android networking android-activity broadcastreceiver


    【解决方案1】:

    我会推荐使用 1) 接口方法。因此,声明一个具有networkChanged() 方法的接口,并让拥有此BroadcastReceiver 的类保留一个希望通过本地List<InterfaceName> 通知网络更改的类列表

    2) 跳过创建和使用订阅实用程序的界面。我最喜欢的两个是 https://github.com/greenrobot/EventBus

    https://gist.github.com/bclymer/6708819(更小,更少使用,也免责声明:我写了这个)

    使用这些,您可以创建具有属性的事件类,然后订阅和发布这些类的实例。

    在你的活动中

    @Override
    public void onCreate() {
        ...
        EventBus.getInstance().subscribe(this, MyType.class);
    }
    
    @Override
    public void onDestroy() {
        ...
        EventBus.getInstance().unsubscribe(this, MyType.class);
    }
    
    @Override
    public void newEvent(Object event) {
        if (event instanceOf MyType) {
            // do stuff
        }
    }
    

    然后在你的BroadcastReceiver

    @Override 
    public void onReceive(Context context, Intent intent) {
        EventBus.post(new MyType(true));
    }
    

    MyType 示例

    public class MyType {
        public boolean networkEnabled;
        public MyType(boolean networkEnabled) {
            this.networkEnabled = networkEnabled;
        }
    }
    

    此示例使用第二个订阅实用程序(我的)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-07
      • 2012-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-08
      相关资源
      最近更新 更多