【问题标题】:How to declarare to Broadcast Receiver for many activities? Android如何向广播接收器声明许多活动?安卓
【发布时间】:2016-10-13 08:05:55
【问题描述】:

我想向应用程序的所有活动声明广播接收器,以检测互联网连接何时发生。已经完成了吗?谢谢

清单

 <receiver
            android:name=".managers.ConnectionReceiver"
            android:label="NetworkChangeReceiver" >
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
        </receiver>

类扩展广播接收器

public class ConnectionReceiver extends BroadcastReceiver {

    ConnectionListener connectionListener = new MainActivity();
    ConnectivityManager connectivityManager;
    NetworkInfo activeNetInfo;

    public ConnectionReceiver() {
}

@Override
public void onReceive(Context context, Intent intent) {
    connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    activeNetInfo = connectivityManager.getActiveNetworkInfo();
    if (activeNetInfo != null) {
        connectionListener.onConnect();
    }else{
        connectionListener.onDisconnect();
    }
}

【问题讨论】:

标签: android android-activity connection broadcastreceiver


【解决方案1】:

最简单的方法是为定义此行为的所有活动创建一个父类,并从那里创建子类。

例如...

class ConnectionListeningActivity extends Activity {

    protected boolean isConnected;

    BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
         void onReceive(Context context, Intent intent) {
              updateNetworkState();
         }
    };

    public void updateNetworkState() {
         ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);

         NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
         isConnected = activeNetwork != null &&
                  activeNetwork.isConnectedOrConnecting();
    }

    public void onResume() {
        registerReceiver(broadcastReceiver, new IntentFilter(android.net.ConnectivityManager.CONNECTIVITY_ACTION));
        updateNetworkState();
    }

    public void onPause() {
        unregisterReceiver(broadcastReceiver);
    }

}

这里我们在 onResume 方法中注册了 broadcastReceiver 并在 onPause 中取消注册,所以当 Activity 不活动时它不活动。

我们还在 onResume 中更新 isConnected 状态,因为在首次使用 isConnected 之前我们可能会或可能不会收到 networkStateChange..

现在我们可以创建一个使用 isConnected 字段来执行某些操作的子类..

【讨论】:

    【解决方案2】:

    在所有活动中,创建广播接收器的实例并注册广播接收器。

    ConnectionReceiver receiver = new ConnectionReceiver();
    IntentFilter filter = new IntentFilter();
    filter.addAction("ACTION HERE");
    getApplicationContext().registerReceiver(receiver, filter)
    

    注意:取消注册接收器 onStop() 方法,因为在多任务处理期间在 Android 7 中调用了 onPause() 方法,并在 onStart() 而不是 onResume() 中再次注册接收器

    【讨论】:

      【解决方案3】:

      在您想要的活动中添加以下行

        ConnectionReceiver receiver = new ConnectionReceiver();
      
          public void onResume(){
          super.onResume();
          registerReceiver(receiver ,new IntentFilter("action_to_perform"));
          }
      
          public void onPause(){
          super.onPause();
          unregisterreceiver(receiver);
          }
      

      【讨论】:

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