一、開篇吹水
我很早就接觸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吧!