zoukankan      html  css  js  c++  java
  • Xamarin.Forms系列 1、认识Xamarin.Forms

    一、开篇吹水

      我很早就接触Xamarin了,但也只是空闲时翻翻官方文档,FQ看看视频教程,当然也买了几本相关的书籍,但是一直没有在实际项目中使用过。这个博客也是很早就注册了,一直没写过文章(主要是我都还不会用xamarin,能写出啥来)。国内玩xamarin玩的6的人也不少,只是都很低调(这么好的技术当然要偷偷用(*^_^*))。

      不知道能不能坚持写这个系列,试试吧!我写文章主要是对自己的总结,也是抛砖引玉。希望微软能硬起来!!!

    二、进入正题

      1、什么是Xamarin.Forms?

        要解决这个问题当然是要去看官方文档了(https://docs.microsoft.com/zh-cn/xamarin/xamarin-forms/get-started/index),官方介绍:“Xamarin.Forms 是一个跨平台 UI 工具包,允许开发人员有效创建可跨 iOS、Android、通用 Windows 平台应用共享的本机用户界面布局。

      2、Xamarin.Forms有啥优势?

        (1)、最大的优势当然是跨平台了。那到底能跨多少平台?

        直接上图片。图片引用自 北京视高盛景软件首席架构师 周岳老板 的ppt

        

        (2)、生成原生应用,对,是原生应用,性能如何?自己脑补!!!

        (3)、100%调用原生API,这个有啥用?下面会给个具体例子,让大家真正认识一下Xamarin.Forms的强大!

        (4)、可以使用美丽而熟悉的C#开发APP,美滋滋...

    三、举个栗子,认识下Xamarin.Forms的强大,以及应该如何学习Xamarin

      有时候我们可能会需要读取手机上短信内容,那么问题来了,这个读取短信内容就比较底层了,Xamarin.Forms只是一个跨平台UI框架,这么底层的操作怎么实现???

      这可怎么玩?百度试试...啥都没有搜到,渣渣Xamarin,垃圾,放弃了。。。相信很多刚接触到xamarin的萌新都会有这样的想法。

      那我们到底应该怎么学习xamarin?

      首先,要明确认识到,原生能做的事情Xamarin都能实现,那么遇到较底层的问题当然要去看看原生怎么实现的。

      我一般遇到问题都会先谷歌一下,看看大佬们是怎么解决的(你遇到的大部分xamarin.forms问题都可以搜索到解决办法)。知道大佬们怎么解决的了,再github找找有没有做好的第三方库,有就拿过来用,没有就只能自己写了!

      就像下面这个例子,通过谷歌找到的解决方案,但是没找到第三方库。只能自己动手丰衣足食了。

      具体操作如下:

      1、打开宇宙第一IDE VS2017,并创建一个Xamarin.Forms项目(我这里只创建安卓项目了)

         

            

      2、要使用到的技能:DependencyService(https://docs.microsoft.com/zh-cn/xamarin/xamarin-forms/app-fundamentals/dependency-service/)具体介绍和使用方法看官方文档

         

      3、创建个实体类 SmsEntity.cs

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace ReadSms.Entity
    {
        public class SmsEntity
        {
            public string address { get; set; }
            public string body { get; set; }
        }
    }
    

      

      4、在共享代码里面创建一个接口 IReadSms

    using System;
    using System.Collections.Generic;
    using System.Text;
    using ReadSms.Entity;
    
    namespace ReadSms.DService
    {
        public interface IReadSms
        {
            List<SmsEntity> ReadAllSms();
        }
    }
    

      5、到安卓项目实现接口

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    using Android.App;
    using Android.Content;
    using Android.Database;
    using Android.OS;
    using Android.Runtime;
    using Android.Views;
    using Android.Widget;
    using ReadSms.DService;
    using ReadSms.Entity;
    
    [assembly: Xamarin.Forms.Dependency(typeof(ReadSms.Droid.DService.ReadSms))]
    namespace ReadSms.Droid.DService
    {
        public class ReadSms : IReadSms
        {
            private static Context _context;
    
            public static void Init(Context context)
            {
                if (context != null)
                {
                    _context = context;
                }
            }
    
            public List<SmsEntity> ReadAllSms()
            {
                Android.Net.Uri inboxURI = Android.Net.Uri.Parse("content://sms/inbox");//收件箱
                //Android.Net.Uri sentURI = Android.Net.Uri.Parse("content://sms/sent");//发件箱
                //Android.Net.Uri draftURI = Android.Net.Uri.Parse("content://sms/draft");//草稿
    
                //获取内容解析器对象,该对象将处理内容提供者
                ContentResolver cr = _context.ContentResolver;
    
                //从内置内容提供商获取收件箱SMS消息
                ICursor cursor = cr.Query(inboxURI, null, null, null, null);
    
                List<SmsEntity> data = new List<SmsEntity>();
    
                if (cursor != null && cursor.Count > 0)
                {
                    for (cursor.MoveToFirst(); !cursor.IsAfterLast; cursor.MoveToNext())
                    {
                        SmsEntity obj = new SmsEntity();
                        obj.body = cursor.GetString(cursor.GetColumnIndex("body"));
                        obj.address = cursor.GetString(cursor.GetColumnIndex("address"));
    
                        if (!string.IsNullOrEmpty(obj.body) && !string.IsNullOrEmpty(obj.address))
                        {
                            data.Add(obj);
                        }
                    }
                }
    
                return data;
            }
        }
    }

        核心代码就这么多,具体什么意思可以看看这篇文章 https://www.cnblogs.com/ycclmy/p/3193075.html

      6、调用实现的功能

      来到MainPage.xaml文件创建xaml界面

    <?xml version="1.0" encoding="utf-8" ?>
    <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                 xmlns:local="clr-namespace:ReadSms"
                 x:Class="ReadSms.MainPage">
    
        <StackLayout>
            <ListView x:Name="listview">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <TextCell Text="{Binding address}" Detail="{Binding body}"/>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
            <Button Text="读取收件箱短信" Clicked="Button_OnClicked"/>
        </StackLayout>
    </ContentPage>
    

      主要就是创建了一个列表来显示读取到的所有短信内容,还有一个按钮,点击按钮后开始读取短信。

      再来cs文件

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using ReadSms.DService;
    using ReadSms.Entity;
    using Xamarin.Forms;
    
    namespace ReadSms
    {
    	public partial class MainPage : ContentPage
    	{
    		public MainPage()
    		{
    			InitializeComponent();
    		}
    
    	    private void Button_OnClicked(object sender, EventArgs e)
    	    {
    	        List<SmsEntity> SmsList = DependencyService.Get<IReadSms>().ReadAllSms();
    
    	        listview.ItemsSource = SmsList;
    	    }
    	}
    }
    

      通过 DependencyService.Get<IReadSms>().ReadAllSms(); 这样的方式 调用安卓平台实现的功能!

      7、抛异常了!!!

      此时运行项目肯定会抛异常,因为我们还没有给app赋予读取短信的权限。来到安卓项目-属性-清单-勾选所需权限

          

      8、运行结果 见下图,大功告成

         

    四、总结一下

      还是那句话,原生能做的事情,Xamarin都可以做,而且是跨平台的,还是原生性能。国内由北京视高盛景软件公司开发的21世纪不动产APP(可以来这里看看视频介绍 https://v.qq.com/x/page/k0538f2u8vy.html),已经非常完善。

    这么好的技术,还在等什么???用着熟悉的宇宙第一IDE,还有美丽的C#,来开发跨平台APP吧!

  • 相关阅读:
    rqnoj PID95:多多看DVD(加强版)
    洛谷1309:瑞士轮
    codevs 1052:地鼠游戏
    noi openjudge7627:鸡蛋的硬度
    codevs 1039:数的划分
    lesson 20 pioneer pilots
    TPO-10 C2 Return a literature book
    lesson 19 A very dear cat
    word record 01
    lesson 18 Electric currents in modern art
  • 原文地址:https://www.cnblogs.com/xamarin/p/9213628.html
Copyright © 2011-2022 走看看