用DependencyService實(shí)現(xiàn)跨平臺開發(fā)

Xamarin.Form目前是微軟提供的一種跨平臺的開發(fā)技術(shù),可以讓開發(fā)者在iOS、Android和Window Phone等平臺上共享60%以上的代碼,從而節(jié)省維護(hù)多個(gè)平臺代碼的精力。但是完全不跟特定平臺的代碼打交道也是不可能的,為此,Xamarin.Form提供了一個(gè)強(qiáng)大的Api,讓開發(fā)者可以實(shí)現(xiàn)跨平臺調(diào)用代碼,這個(gè)Api就是DependencyService。

利用DependencyService,我們就可以調(diào)用特定平臺的代碼,從而可以做原生代碼所能做的任何事情。

為了在Xamarin.Form中使用DependencyService,我們需要做以下四件事情。

  • 定義接口,這個(gè)接口是平臺無關(guān)的,定義了Xamarin.Form與特定平臺交互的方式。
  • 編寫特定平臺上的具體實(shí)現(xiàn)。
  • 通過DependencyService所提供的元標(biāo)記來注冊這些實(shí)現(xiàn),讓DependencyService在運(yùn)行時(shí)可以找到特定的實(shí)現(xiàn)類。
  • 在Xamarin.Form中使用DependencyService顯式調(diào)用接口的實(shí)現(xiàn)。

定義接口

接口決定了我們在Xamarin.Form中使用平臺代碼的方式,這里我們定義一個(gè)文本轉(zhuǎn)語音的接口。

public interface ITextToSpeech {
    void Speak ( string text ); 
}

編寫特定平臺上的實(shí)現(xiàn)

實(shí)現(xiàn)類必然要實(shí)現(xiàn)上面所定義的接口,并且必須有一個(gè)無參構(gòu)造器。

這里以iOS平臺為例。


public class TextToSpeechImplementation : ITextToSpeech
{
    public TextToSpeechImplementation () {}

    public void Speak (string text)
    {
        var speechSynthesizer = new AVSpeechSynthesizer ();

        var speechUtterance = new AVSpeechUtterance (text) {
            Rate = AVSpeechUtterance.MaximumSpeechRate/4,
            Voice = AVSpeechSynthesisVoice.FromLanguage ("en-US"),
            Volume = 0.5f,
            PitchMultiplier = 1.0f
        };

        speechSynthesizer.SpeakUtterance (speechUtterance);
    }
}

注冊實(shí)現(xiàn)

完成實(shí)現(xiàn)之后,我們還要使用[assembly]標(biāo)記來注冊他們,唯有這樣,DependencyService才能在運(yùn)行時(shí)找到接口所對應(yīng)的實(shí)現(xiàn)類。

我們要在命名空間之上添加如下代碼:

using AVFoundation;
using DependencyServiceSample.iOS;//enables registration outside of namespace

[assembly: Xamarin.Forms.Dependency (typeof (TextToSpeechImplementation))]
namespace DependencyServiceSample.iOS {
    public class TextToSpeechImplementation : ITextToSpeech
    ......

其中,由于注冊的聲明位置在命名空間之外,所以需要在引用中添加對該命名空間的引用,否則注冊會報(bào)錯(cuò)。

將上述兩部分加在一起的實(shí)現(xiàn)類完整代碼如下:

using AVFoundation;
using DependencyServiceSample.iOS;//enables registration outside of namespace

[assembly: Xamarin.Forms.Dependency (typeof (TextToSpeechImplementation))]
namespace DependencyServiceSample.iOS {
    public class TextToSpeechImplementation : ITextToSpeech
{
    public TextToSpeechImplementation () {}

    public void Speak (string text)
    {
        var speechSynthesizer = new AVSpeechSynthesizer ();

        var speechUtterance = new AVSpeechUtterance (text) {
            Rate = AVSpeechUtterance.MaximumSpeechRate/4,
            Voice = AVSpeechSynthesisVoice.FromLanguage ("en-US"),
            Volume = 0.5f,
            PitchMultiplier = 1.0f
        };

        speechSynthesizer.SpeakUtterance (speechUtterance);
    }
}

在Android平臺和Window Phone上也是如此,除了實(shí)現(xiàn)不同,其它的部分都是一樣的。這里不作贅述。

使用DependencyService

完成了上述步驟之后,我們在Xamarin.Form使用DependencyService.Get<ITextToSpeech>()就可以獲得一個(gè)ITextToSpeech實(shí)現(xiàn)類的實(shí)例對象。

具體獲得哪一個(gè)實(shí)現(xiàn)類取決于Xamarin.Form所運(yùn)行的平臺。

需要指出的是,DependencyService.Get<T>()每一次都會返回同一個(gè)對象,事實(shí)上,Get<T>()是這樣的:Get<T>(DependencyFetchTarget)。

DependencyFetchTarget是個(gè)枚舉類,

public enum DependencyFetchTarget
    {
        GlobalInstance,
        NewInstance
    }

故名思義,GlobalInstance是每次都返回同一個(gè)全局的對象,也就單例模式;而NewInstance則是每次都返回一個(gè)新的對象。而Get<T>()等價(jià)于Get<T>(DependencyFetchTarget.GlobalInstance),因此默認(rèn)是單例模式。

可以看出,DependencyService.Get<T>()是不接收其它參數(shù)類型的,這也就是為什么實(shí)現(xiàn)類必須有一個(gè)無參構(gòu)造器。

最后,代碼結(jié)構(gòu)應(yīng)該如下這般:

參考文獻(xiàn)

Introduction to DependencyService

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,733評論 25 709
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,623評論 18 399
  • 大一快結(jié)束的時(shí)候,學(xué)校各個(gè)組織都開始進(jìn)行換屆活動。 我大一比較“拽”,一口氣加了三個(gè)完全不相關(guān)的部門。但是隨著時(shí)間...
    要學(xué)習(xí)啊閱讀 1,364評論 1 4
  • 女人幸福的終極秘訣就是懂得選擇更適合自己的,不管人還是物。 如果女人, 不為自己做什么, 不為自己找樂趣,不嘗試改...
    大象姐說心理閱讀 697評論 1 3

友情鏈接更多精彩內(nèi)容