我正在开发一个Android应用程序,当用户在我的应用程序中进行某些活动时,我将在其中发送电子邮件。我可以使用AsyncTask正确发送电子邮件。但是,我想确保这种情况发生时用户实际上是在线的。
我也知道我可以像这样通过编程方式打开WiFi:
WifiManager wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
boolean wifiEnabled = wifiManager.isWifiEnabled();
if(!wifiEnabled){
wifiManager.setWifiEnabled(true);
}
//I can then do my async task here
但是,Android需要花费一些时间才能连接到网络并建立连接。因此,当异步任务由于设备离线而失败时。
现在,我的问题是:
应用程序是否有办法知道WiFi是否已连接不使用BroadCast接收器?我知道我可以使用广播接收器检查设备是否已连接。但是,我认为这对我来说太麻烦了。我正在寻找类似回调函数的东西,类似于将记录同步到商店/数据库时在ExtJS框架中使用的那些东西。
如果Android中没有回调函数,是否可以让Broadcast Receiver调用您的应用程序函数仅在应用程序处于活动状态时?我的意思是,仅当我的应用程序处于活动状态时,我才希望我的广播接收器在活动中调用一个函数(电子邮件发送功能)。我不希望它在WiFi状态更改时调用该函数。
应用程序是否有一种方法可以在不使用BroadCast接收器的情况下知道WiFi是否已经连接?
如果您的意思是一种检查wifi是否已连接的方法,则可以使用此方法:
private boolean isWifiConnected(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo wifiInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
return wifiInfo.isConnectedOrConnecting();
}
但是要“了解更改”到wifi状态,只能使用广播接收器。
仅当应用程序处于活动状态时,才可以让广播接收器调用您的应用程序功能吗?
是。您可以使用registerReceiver
的unRegisterReceiver
和Activity
方法。只需在onCreate
中注册您想要的接收者,然后在您的活动的onDestroy
方法中取消注册。
示例:
public class MainActivity extends Activity {
BroadcastReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(MainActivity.this, "Wifi State Changed!", Toast.LENGTH_SHORT).show();
}
};
registerReceiver(receiver, new IntentFilter(WifiManager.NETWORK_STATE_CHANGED_ACTION));
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}