我想动态设置一个广播员,以检查我的应用在前景中运行时是否在线。在我的主类中,我创建了一个意图过滤器,一个嵌套的broadcastreceiver类,最后在on Resume和onpause方法中分别注册/取消接收器。
我的问题是,是否有一个意图动作可以添加到我的意图过滤器中,以检查在线连接吗?
如果没有,我该如何创建此动态广播接收器才能在我的应用程序运行时执行?
这是我的班级的样子....
public class MainActivity extends AppCompatActivity {
private IntentFilter onlineIntentFilter;
private CheckOnlineReceiver checkOnlineReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
onlineIntentFilter = new IntentFilter();
checkOnlineReceiver = new CheckOnlineReceiver();
//*****WHAT INTENT ACTION CAN I PASS TO CHECK NETWORK CONNECTIVITY******
onlineIntentFilter.addAction(Intent.ACTION_POWER_DISCONNECTED);
}
@Override
protected void onResume() {
super.onResume();
registerReceiver(checkOnlineReceiver, onlineIntentFilter);
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(checkOnlineReceiver);
}
private class CheckOnlineReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Toast.makeText(getApplicationContext(),"IN METHOD, ACTION = " + action, Toast.LENGTH_LONG).show();
}
}}
添加连接操作 onlineIntentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION)
不要忘记添加权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
广播接收器的onReceive()
将被调用有关连接性更改,这意味着连接和断开连接。因此,每当您收到braodcast时,您都会检查以下连接性
public boolean isNetworkAvailable() {
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
return true;
}
return false;
}
这是这样做的标准方法。
创建一个接口,该接口将具有两种方法OnnetworkConnected()和onnetworkDisconnected()
public interface NetworkConnectivityListener {
public void onNetworkConnected();
public void onNetworkDisconnected();
}
任何想要收听网络更改的类都将实现此接口并覆盖它是两种方法。
创建一个类,该类将扩展广播员,该接收器的OnReceive()将捕获连接性的变化。在此类中,创建一个函数来注册侦听器
public class NetworkBroadcastReceiver extends BroadcastReceiver {
private NetworkConnectivityListener listener;
public NetworkBroadcastReceiver(NetworkConnectivityListener listener) {
this.listener = listener;
}
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (listener != null) {
if (isConnectedToInternet()) {
listener.onNetworkConnected();
} else {
listener.onNetworkDisconnected();
}
}
}
ps您可以轻松检查设备是否连接到Internet。只是Google。
现在,假设您希望您的主要目的性听取NetWrork的更改,您要做的就是在主要活动调用中实现NetworkConnectivityListener,并创建一个通过Main Activitive的NetworkBroadCastreCeiver的实例,它将开始获得网络的上下文更新。
添加IntentFilter Connectivity_Action
您将需要创建一个服务,因为您希望在后台执行长期运行的任务。
在<application>
标签中,需要在清单中注册服务。
<service android:name=".WifiService"
android:stopWithTask="true"
android:enabled="true"/>
stopWithTask
会导致所有活动被销毁时被破坏(默认值为真)。
您将需要注册并登记向服务类中的Changnitive_change行动注册并取消广播。
public class WifiService extends Service {
private BroadcastReceiver mReceiver;
@Nullable
@Override
public IBinder onBind(Intent intent) {
IntentFilter filter = new IntentFilter();
filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
// Your BroadcastReceiver class
mReceiver = new WifiReceiver();
registerReceiver(mReceiver, filter);
return null;
}
@Override
public boolean onUnbind(Intent intent) {
unregisterReceiver(mReceiver);
return super.onUnbind(intent);
}
}
,然后在广播中您必须收听Connectivity_change。
public class WifiReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
boolean isConnected = networkInfo != null &&
networkInfo.isConnectedOrConnecting();
if (isConnected) {
switch (networkInfo.getType()) {
case ConnectivityManager.TYPE_WIFI:
// Connected via wifi
break;
case ConnectivityManager.TYPE_ETHERNET:
// Connected via ethernet
break;
case ConnectivityManager.TYPE_MOBILE:
// Connected via mobile data
break;
}
}
}
}
使用此设置,您将能够在连接性更改中通知应用程序的组件。