Xamarin.Forms系列 1、認識Xamarin.Forms


一、開篇吹水

  我很早就接觸Xamarin了,但也只是空閑時翻翻官方文檔,翻牆看看視頻教程,當然也買了幾本相關的書籍,但是一直沒有在實際項目中使用過。這個博客也是很早就注冊了,一直沒寫過文章(主要是我都還不會用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吧!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM