Xamarin.Android开发

使用 Visual Studio 生成第一个 Xamarin.Android 应用程序,并进一步了解使用 Xamarin 进行 Android 应用程序开发的基础知识。在此过程当中,会介绍生成和部署 Xamarin.Android 应用程序所需的工具、概念和步骤。html

第 1 部分:快速入门

在本指南的第一部分,用户将建立一个应用程序,该应用程序可将用户输入的字母数字电话号码转换为数字电话号码,而后呼叫该号码。android

第 2 部分:深刻了解

在本文档的第二部分,用户将回顾生成的应用程序,并从根本上了解 Android 应用程序的工做原理。git

查看项目中的项,查看每一个文件夹及其用途:github

  • 属性 – 包含 AndroidManifest.xml 文件,该文件描述了对 Xamarin.Android 应用程序的全部要求(包括名称、版本号和权限)。 Properties 文件夹还包括.NET 程序集元数据文件 AssemblyInfo.cs。 最好在此文件中填写一些应用程序相关的基本信息。编程

  • 引用 – 包含生成和运行应用程序所需的程序集。 若是展开“引用”目录,可查看对 .NET 程序集(如 System、System.Core 和 System.Xml)的引用以及对 Xamarin 的 Mono.Android 程序集的引用。windows

  • 资产 – 包含应用程序须要运行的文件(包括字体、本地数据文件和文本文件)。 此处包括的文件可经过生成的 Assets 类访问。 有关 Android 资产的详细信息,请参阅 Xamarin 使用 Android 资产指南。api

  • 资源 – 包含应用程序资源,例如字符串、图像和布局。 能够经过生成的 Resource 类访问代码中的这些资源。 Android 资源指南提供有关“资源” 目录的更多详细信息。 应用程序模板在 AboutResources.txt 文件中还包含有“资源”的简明指南。浏览器

一、资源

“资源”目录包含 4 个文件夹(drawable、layout、mipmap 和 values),还有一个名为 Resource.designer.cs 的文件 。缓存

下表总结了这些项:app

  • drawable – 可绘制目录包含可绘制资源,如图像和位图。

  • mipmap – mipmap 目录包含适用于不一样启动器图标密度的可绘制文件。 在默认模板中,drawable 目录包含应用程序图标文件“Icon.png” 。

  • layout – 布局目录包含 Android 设计器文件 (.axml),该文件定义每一个屏幕或活动的用户界面。 该模板建立名为 activity_main.axml 的默认布局 。
  • values – 此目录包含存储简单值(如字符串、整数和颜色)的 XML 文件。 该模板建立名为 Strings.xml 的文件,用于存储字符串值。

  代码中使用:

string info = this.Resources.GetString(Resource.String.button_bundle_info);
  • Resource.designer.cs – 也称为 Resource 类,此文件是一个分部类,存放分配给每一个资源的惟一 ID。 它由 Xamarin.Android 工具自动建立,并在必要时从新生成。 不该手动编辑此文件,由于 Xamarin.Android 将覆盖对其进行的任何手动更改。

二、应用基础知识和体系结构基础知识

Android 应用程序不具备单一入口点;也就是说,应用程序中没有操做系统可调用来启动该应用程序的任何代码行。 相反,当 Android 实例化应用程序的一个类时,会启动该应用程序,在此期间 Android 将整个应用程序的进程加载到内存中。

设计复杂应用程序或与 Android 操做系统交互时,Android 的这一特有功能极其有用。 可是,这些选项也使 Android 在处理 Phoneword 应用程序等基本方案时变得复杂。 出于此缘由,分两种状况来探索 Android 体系结构。 本指南剖析使用 Android 应用最多见入口点(第一个屏幕)的应用程序。 了解 Android 多屏幕中,讨论了以不一样方式启动应用程序,全面探讨了 Android 体系结构的复杂性。

在仿真器或设备中首次打开 Phoneword 应用程序时,操做系统会建立第一个活动 。 活动是特殊的 Android 类,对应于单个应用程序屏幕,负责绘制和支持用户界面。 Android 建立应用程序的第一个Activity时,会加载整个应用程序

活动负载

因为 Android 应用程序中没有线性发展(能够经过多个点启动应用程序),Android 采用一种独特方式来跟踪哪些类和文件组成应用程序。 在 Phoneword 示例中,将向名为“Android 清单” 的特殊 XML 文件注册组成应用程序的全部部分。 “Android 清单” 的做用是跟踪应用程序的内容、属性和权限,并将这些信息告知 Android 操做系统。 能够将 Phoneword 应用程序看成单一活动(屏幕)和由 Android 清单文件捆绑在一块儿的资源文件和帮助程序文件的集合,如如下关系图所示:

资源帮助程序

如下几个部分将探索 Phoneword 应用程序各部分的关系;使你能更好地理解上面的关系图。 此探索先从用户界面开始,会讨论 Android 设计器和布局文件。

三、用户界面

activity_main.axml 是应用程序中第一个屏幕的用户界面布局文件 。 .axml 指示这是 Android 设计器文件(AXML 表示 Android XML。 名称 Main 对 Android 而言是任意的 – 可将布局文件命名为其余名称。 在 IDE 中打开 activity_main.axml 时,会显示名为“Android Designer”的 Android 布局文件的可视编辑器 :

TranslateButton 的 ID 设置为 @+id/TranslateButton

设置 TranslateButton 的 id 属性时,Android Designer 会将 TranslateButton 控件映射到 Resource 类,并为其分配 TranslateButton 的资源 ID 。 经过将可视控件映射到类,能够找到并使用 TranslateButton 和应用代码中的其余控件。 当你剖析为控件提供支持的代码时,会更详细地了解这一内容。 此时,只需知道控件的代码表示形式是经过 id 属性连接到设计器中控件的可视表示形式便可

源视图

在设计界面上定义的全部内容都会转换成 XML,以供 Xamarin.Android 使用。 Android 设计器提供源视图,此源视图包含从可视化设计器生成的 XML。 能够切换到设计器视图左下角的“源” 面板以查看此 XML

四、活动和活动生命周期

Activity 类包含为用户界面提供支持的代码。 activity负责响应用户交互,并建立动态用户体验。 本部分将介绍 Activity 类,讨论活动生命周期,并剖析为 Phoneword 应用程序中的用户界面提供支持的代码。

  • Activity 类

Phoneword 应用程序只有一个屏幕(活动)。为屏幕提供支持的类称为 MainActivity,位于 MainActivity.cs 文件中。 名称 MainActivity 在 Android 中没有特别的意义 – 虽然约定是命名应用程序 MainActivity 中的第一个活动,但 Android 并不在乎将其命名为其余名称。

打开 MainActivity.cs 时,能够看到,MainActivity 类是 Activity 类的子类 而且活动标有 Activity 属性:

Activity 属性向 Android 清单注册活动;这能让 Android 知道此类是该清单所管理的 Phoneword 应用程序的一部分

Label 属性设置将显示在屏幕顶部的文本。【在values文件夹下的string.xml中管理】

MainLauncher 属性告知 Android 在启动应用程序时显示此活动。 了解 Android 多屏幕指南中所述,当你向应用程序添加更多活动(屏幕)时,此属性会变得很重要。

  • 活动生命周期

在 Android 中,活动会根据与用户的交互经历生命周期的不一样阶段。 能够对活动进行建立、启动和暂停、恢复和销毁等操做。 Activity 类包含方法,系统会在屏幕生命周期的特定时间点调用这些方法。 

经过重写 Activity 生命周期方法,能够控制活动的加载方式和与用户的互动方式,甚至还能够控制活动从设备屏幕消失后会发生的状况。 例如,能够重写上图中的生命周期方法,以执行如下重要任务:

  • OnCreate – 建立视图、初始化变量,并执行在用户能看到活动以前其余必须完成的准备工做。 只有将活动加载到内存时,才会调用此方法一次。【向用户显示屏幕以前】

  • OnResume – 执行每当活动返回到设备屏幕时必须发生的任何任务。【从主屏幕再次回到app,非第一次】

  • OnPause – 执行每当活动离开设备屏幕时必须发生的任何任务。【单击home键,离开app时】

向 Activity 中的生命周期方法添加自定义代码时,重写 该生命周期方法的基实现 。 能够利用现有的生命周期方法(已在其中附加了一些代码)并使用本身的代码来扩展该方法。 从方法内调用基实现,确保原始代码在新代码以前运行。 下一部分对此提供示例说明。

活动生命周期是 Android 中一个重要且复杂的部分。 完成_入门_系列后,若是想要了解有关活动的详细信息,请阅读活动生命周期指南。 本指南下一步的重点是活动生命周期的第一个阶段 - OnCreate

OnCreate

protected override void OnCreate (Bundle bundle)
{
    base.OnCreate (bundle);

    // Set our view from the "main" layout resource
    SetContentView (Resource.Layout.Main);
    // Additional setup code will go here
}

Bundle:从字符串值到各类可打包类型的映射

OnCreate中加载在 Android Designer 中建立的用户界面。 若要加载 UI,请调用 SetContentView 并向其传递布局文件的资源布局名称:activity_main.axml 。 布局位于 Resource.Layout.activity_main

当 MainActivity 开始运行后,会基于 activity_main.axml 文件的内容建立一个视图 。

准备好布局文件后,能够开始查找控件。 若要查找控件,请调用 FindViewById,并传入控件的资源 ID。

 // Get our UI controls from the loaded layout
            EditText phoneNumberText = FindViewById<EditText>(Resource.Id.PhoneNumberText);
            TextView translatedPhoneWord = FindViewById<TextView>(Resource.Id.TranslatedPhoneword);
            Button translateButton = FindViewById<Button>(Resource.Id.TranslateButton);

如今布局文件中已具备对控件的引用,能够开始对其进行编程,以响应用户交互。

响应用户交互

在 Android 中, Click 事件侦听用户的触控。 在此应用中,Click 事件将由 lambda 处理,不过也可改用委托或命名事件处理程序。

translateButton.Click += (sender, e) =>
            {
                // Translate user's alphanumeric phone number to numeric
                string translatedNumber = PhoneTranslator.ToNumber(phoneNumberText.Text);
                if (string.IsNullOrWhiteSpace(translatedNumber))
                {
                    translatedPhoneWord.Text = string.Empty;
                }
                else
                {
                    translatedPhoneWord.Text = translatedNumber;
                }
            };

为不一样的屏幕密度设置图标

Android 设备具备不一样的屏幕大小和分辨率,不是全部图像都能清晰显示在屏幕上。

考虑到这一点,最好将不一样分辨率的图标添加到 Resources 文件夹。 Android 提供了不一样版本的 mipmap 文件夹来处理不一样密度的启动器图标,包括针对中等密度屏幕的 mdpi、针对高密度屏幕的 hdpi,以及针对超高密度屏幕的 xhdpi、xxhdpi 和 xxxhdpi 。 不一样大小的图标存储在相应的 mipmap- 文件夹中 。

各文件夹下:

ic_launcher:桌面图标【能够在设置->更多->应用程序中查看】,

ic_launcher_background:背景图,

ic_launcher_foreground:前景图,

ic_launcher_round:圆形图【屏幕上的】,

并不是每一个人都具备可用于建立自定义图标和启动图像(让应用不同凡响)的设计器。下面是几种生成自定义应用图像的备选方法:

  • Android Asset Studio – 是一个基于 Web 的浏览器生成器,针对全部类型 Android 图标,带有其余有用社区工具的连接。 在 Google Chrome 中性能最佳。

  • Visual Studio – 能够用于直接在 IDE 中为应用建立简单图标集。

  • Glyphish – 可免费下载和购买的高质量预生成图标集。

  • Fiverr – 从各类设计器中进行选择以便为你建立图标集(最低 5 美圆)。 能够漫无目标,不过若是须要动态设计的图标,这是很好的资源。

有关图标大小和要求的详细信息,请参阅 Android 资源指南。

应用程序基础知识

可访问性

API级别

一、Android资源

 

 

新增长资源:eg,my_image_name .png【约定用下划线,小写】,并将其生成操做设置为:Android资源

 

二、活动生命周期方法

一个Activity活动就是一个界面的布局。参考:onResume何时执行,执行几回的问题

程序正常启动时:onCreate()->onStart()->onResume();
onCreate()在活动第一次建立时被调用,主要用于加载布局
onStart()这个方法在活动由不可见变为可见的时候调用。
onResume这个方法在活动准备好和用户进行交互的时候调用。此时的活动必定位于返回栈的栈顶,而且处于运行状态。

 

三种调用的场景:
一个Activity启动另外一个Activity: onPause()->onStop(),    再返回:onRestart()->onStart()->onResume()
程序按back 退出: onPause()->onStop()->onDestory(),再进入:onCreate()->onStart()->onResume();
程序按home 退出: onPause()->onStop(),                    再进入:onRestart()->onStart()->onResume();

OnCreate

OnCreate是建立活动时要调用的第一个方法。 OnCreate始终会重写,以执行活动可能须要的任何启动初始化,如:

  • 建立视图
  • 初始化变量
  • 将静态数据绑定到列表

OnCreate采用一个绑定参数,该参数是在绑定不为 null 时用于存储和传递状态信息和活动之间的对象的字典,这表示活动正在从新启动,应从上一个实例还原其状态。

OnStart

OnCreate 完成后 , 系统始终会调用 OnStart。 若是活动在活动可见以前须要执行任何特定的任务,例如刷新活动中视图的当前值,则活动可能会重写此方法。 调用此方法以后Android 将当即调用OnResume

OnResume

当活动准备好开始与用户交互时,系统将调用OnResume 【Activity 开始跟用户交互以前会调用 onResume()】。 活动应重写此方法以执行以下任务:

  • 斜向上帧速率(游戏开发中的常见任务)
  • 开始动画
  • 侦听 GPS 更新
  • 显示任何相关的警报或对话框
  • 链接外部事件处理程序

 

OnPause

当系统要将活动放入背景中或活动被部分遮盖时,将调用OnPause 。 若是活动须要,则应重写此方法:

  • 提交永久性数据的未保存更改

  • 销毁或清理使用资源的其余对象

  • 增长帧速率和暂停动画

  • 注销外部事件处理程序或通知处理程序(即绑定到服务的程序)。 必须执行此操做以防止活动内存泄露。

  • 一样,若是活动显示了任何对话框或警报,则必须用.Dismiss()方法对其进行清理。

在调用OnPause后,可能会调用如下两个方法:

一、OnResume:if the Activity is to be returned to the foreground.

二、OnStop:if the Activity is being placed in the background

OnStop

当用户再也不显示该活动时,将调用OnStop 。 发生如下状况之一时,会发生这种状况:

  • 正在启动新活动,并覆盖此活动。
  • 现有活动将进入前台。
  • 正在销毁活动。

OnDestroy

OnDestroy是在将其销毁并从内存中彻底删除以前,在活动实例上调用的最终方法。

Most Activities will not implement this method because most clean up and shut down has been done in the OnPause and OnStop methods【大多数Activity不会实现/重写这个方法】

The OnDestroy method is typically overridden to clean up long running resources that might leak resources.【一般会重写OnDestroy方法来清理长时间运行的可能会泄漏的资源,例如 在OnCreate中启动的后台线程】

OnRestart

There are no general guidelines for what kind of logic should be implemented in OnRestart. This is because OnStart is always invoked regardless of whether the Activity is being created or being restarted, so any resources required by the Activity should be initialized in OnStart, rather than OnRestart

【对于应该在OnRestart中实现哪一种逻辑,没有通用的指导原则。这是由于不管正在建立活动仍是从新启动活动,都始终调用OnStart,所以活动所需的任何资源都应该在OnStart中初始化,而不是在OnRestart中初始化】

三、Back vs. Home

程序按back 退出: onPause()->onStop()->onDestory(),再进入:onCreate()->onStart()->onResume();
程序按home 退出: onPause()->onStop(),                    再进入:onRestart()->onStart()->onResume();

按Back键会销毁程序,home不会,只是退到后台线程。

四、Managing State Throughout the Lifecycle

在中止或者销毁时,系统提供一种保存状态(实例状态)的机会,三种方式:

  • android采用称之为Bundle的字典(key/value) 来保存原始值
  • Creating a custom class that will hold complex values such as bitmaps.
  • 绕过配置更改生命周期,并承担维护活动状态的所有责任。

4.一、Bundle介绍

Bundle不适合与保存复杂数据(如 位图)

活动提供一些方法来帮助在捆绑包中保存和检索实例状态:

  • OnSaveInstanceState–此操做由 Android 在活动被销毁时调用。 若是活动须要保留任何键/值状态项,则这些活动能够实现此方法。

  • OnRestoreInstanceState–此OnCreate方法在方法完成后被调用,并为活动提供了在初始化完成后恢复其状态的另外一种机会。

1.OnSaveInstanceState

当活动正在中止时,将调用OnSaveInstanceState 。 它将接收一个捆绑参数,活动可在其中存储其状态。 当设备遇到配置更改时【例如 改变屏幕方向,横屏竖屏】,活动可使用Bundle传入的对象经过重写OnSaveInstanceState来保留活动状态。

保存活动中的暂时性数据【eg 计数器】,而控件的Text值不会改变。

参考:onSaveInstanceState()和onRestoreInstanceState()使用详解

 

 当系统开始中止您的Activity时,它会调用onSaveInstanceState()(1),以便您能够指定要保存的其余状态数据,以防Activity必须从新建立实例。若是Activity被破坏而且必须从新建立相同的实例,则系统将(1)中定义的状态数据传递给onCreate()方法(2)和onRestoreInstanceState()方法(3)。

注意
一、若是是用户自动按下Home键,是不会触发onSaveInstanceState()和onRestoreInstanceState()的。
二、每次用户旋转屏幕时,您的Activity将被破坏并从新建立。当屏幕改变方向时,系统会破坏并从新建立前台Activity,由于屏幕配置已更改,您的Activity可能须要加载替代资源(例如布局)。即会执行onSaveInstanceState()和onRestoreInstanceState()的。

2.OnRestoreInstanceState

还原状态,通常在OnCreate中还原状态,而不用重写OnRestoreInstanceState。

4.2 保存复杂数据

经过重写OnRetainNonConfigurationInstance并返回包含要保存的数据的Java.Lang.Object实例来保存数据。 使用OnRetainNonConfigurationInstance保存状态有两个主要优势:

  • OnRetainNonConfigurationInstance返回的对象对更大、更复杂的数据类型执行良好的工做,由于内存会保留此对象。

  • OnRetainNonConfigurationInstance方法将按需调用,而且仅在须要时调用。 这比使用手动缓存更经济。

 

五、Service

  • 绑定服务

实现和使用绑定服务

为了使 Android 应用程序使用绑定的服务,必须实现如下

  1. 新建服务。扩展Service类并实现生命周期回调方法 –此类将包含执行服务所需工做的代码。【eg:一个告诉用户服务启动的时间和运行时间的方法api】
  2. 建立一个实现IServiceConnection接口的类,这个接口提供供Android 调用的回调方法(OnServiceConnected),以便在服务链接发生更改时通知客户端,eg:客户端已链接或断开链接到服务.。服务链接还将提供对对象(Binder)的引用,客户端可以使用该对象直接与服务交互。 
  3. 建立一个实现IBinder接口的类, IBinder接口提供了客户端用来与服务进行通讯的 API。 Binder 能够提供对绑定服务的引用、容许直接调用方法或Binder 能够提供一个客户端 API,用于封装和隐藏应用程序中的绑定服务。 IBinder必须提供远程过程调用所需的代码。 不须要(或建议)直接实现IBinder接口。 相反,应用程序应该扩展Binder类型,它提供IBinder所需的大部分基本功能。
  4. 启动Activity并绑定到服务。一旦 service connection, binder, and service 被建立,Android 应用程序负责启动该服务并将其绑定到它。

相关文章
相关标签/搜索