大家好,这次给大家介绍Xamarin.Forms底下跨平台接口的实现。为什么要做跨平台的接口呢,我目前总结有两种情况:1.有些功能在分平台底下需求不一样,这时需要在分平台底下实现各自的功能,比如Device.OnPlatform可以设置分平台底下实现不同方法;2.有些功能在可移植平台底下无法实现,需要在分平台底下实现,比如吐司,ZXing扫码等。
在做天气预报app时发现,请求xml数据时网络没连接,如果没有相应的处理,就会强退,这对于用户体验肯定是不好的,为此,我上网搜了一下资料,看了下Java代码的实现方式:
1.获取网络信息需要在AndroidManifest.xml文件中加入相应的权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
2.实现代码:
//判断是否有网络连接
public boolean isNetworkConnected(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
if (mNetworkInfo != null) {
return mNetworkInfo.isAvailable();
}
}
return false;
}
//判断是否有WIFI连接
public boolean isWifiConnected(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mWiFiNetworkInfo = mConnectivityManager
.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (mWiFiNetworkInfo != null) {
return mWiFiNetworkInfo.isAvailable();
}
}
return false;
}
//判断Mobile网络是否可用
public boolean isMobileConnected(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mMobileNetworkInfo = mConnectivityManager
.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (mMobileNetworkInfo != null) {
return mMobileNetworkInfo.isAvailable();
}
}
return false;
}
有了上面的代码,就可以实现在Xamarin.Forms环境下实现判断网络是否可用,当然不是照搬上面的代码,下面来讲解具体的实现步骤:
1.AndroidManifest.xml文件中加入相应的权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
2.在可移植平台底下创建跨平台接口:
3.在分平台底下底下创建类,实现接口:
3.1 在MainActivity底下定义Context:
3.2 实现接口:
下面是接口具体实现代码:
[assembly:Dependency(typeof(DemoWeather.Droid.IfNetWork.JudgeNet))]
namespace DemoWeather.Droid.IfNetWork
{
public class JudgeNet:IJudgeNetWorks
{
public bool IsNetWorkConnected()
{
ConnectivityManager manager = ConnectivityManager.FromContext(MainActivity.AppContext);
NetworkInfo info = manager.ActiveNetworkInfo;
if (info!=null)
{
return info.IsAvailable;
}
return false;
}
public bool IsWifiConnected()
{
ConnectivityManager manager = ConnectivityManager.FromContext(MainActivity.AppContext);
NetworkInfo info = manager.GetNetworkInfo(ConnectivityType.Wifi);
if (info!=null)
{
return info.IsAvailable;
}
return false;
}
public bool IsMobileConnected()
{
ConnectivityManager manager = ConnectivityManager.FromContext(MainActivity.AppContext);
NetworkInfo info = manager.GetNetworkInfo(ConnectivityType.Mobile);
if (info!=null)
{
return info.IsAvailable;
}
return false;
}
}
}
[assembly:Dependency(typeof(DemoWeather.Droid.IfNetWork.JudgeNet))]的作用是将该类依赖于程序集,以便在可移植平台底下实例化接口。
IOS底下也是类似,不过本人手机是安卓的,没有IOS运行环境,这边就不涉及了。
4. 在可移植平台底下调用:
4.1 实例化接口:
4.2 调用接口:
这样的实现方式很多地方会用到,比如在可移植平台底下调用分平台的吐司提示,MD5加密等。
好了,本次的内容就到这里,有问题的码农们可以联系我的QQ:1405999864,拜拜~