原文链接:Hello, Android Multiscreen_DeepDive.
译文链接:Xamarin.Android开发入门——Hello,Android Multiscreen深入理解.
本部分介绍利用Xamarin.Android处理导航
Hello,Android Multiscreen Deep Dive
在Hello,Android Multiscreen Quickstart中,我们建立并运行了我们第一个多屏Xamarin.Android应用。接下来我们将深入理解Android导航和架构,以便于我们创建出更加复杂的应用。
在本指南中,我们将探讨更多的Android架构,因此,我们会介绍Android应用程序块,深入Android导航(关于Intents内容),以及探讨Android硬件导航选项。我们将会解析Phoneword应用中新添加的功能,以便于我们可以更全面的理解我们的应用程序和操作系统,以及其他应用程序之间的关系。
Android架构基础
在Hello,Android Deep Dive(原文、译文)中,我们知道了Android应用是独特的程序,因为它没有单一的入口。取而代之的是,操作系统(或另一个应用程序)通过启动应用中已注册的Activity之一来启动应用进程。
在本次Android架构介绍中,我们会进一步拓宽关于Android应用是如何构建的相关知识面,其中包含:Android应用程序构建块以及相关的功能。
Android应用程序块
Android应用由以下几个部分捆绑组成:一组叫应用程序块的特殊的Android类集合,许多app资源(如图片,主题,辅助类等等)和协调上述内容的XML文件——Android Manifest。
应用程序块形成了Android应用的骨架,因为它允许我们进行一些在普通的类中所无法完成的事。其中最重要的两个部分是Activity和Service:
- Activity —— 一个Activity对应一个UI界面,其在概念上类似于web应用中的一个web页面。例如,在一个新闻订阅应用中,登录界面会是第一个Activity,新闻项列表会是另一个Activity,而新闻项的详细页面会是第三个Activity。关于更多Activity的内容见:Activity Lifecyle。
- Service —— Android服务支持Activity接收长时间运行的任务并在后台运行。Service不需要用户界面,且并不在界面显示任务处理 —— 例如,播放音乐或上传照片到服务端。关于更多Service信息,见:原文:Creating Services 和 原文:Android Services。
一个Android应用可能不会使用所有类型的块,且通常情况下,一个类型含有多个块。例如,我们在Hello,Android Quickstart中完成的Phoneword应用只有一个Activity(屏幕)和一些资源文件。一个简单的音乐播放app可能含有几个Activity以及一个后台音乐播放的Service。
Intents
另一个Android应用的基础概念是Intent。Android是以最小特权原则进行设计的 —— 应用只允许访问它们工作所需要的块,对于组成操作系统或其他应用的块是限制访问的。同样,块是松耦合的 —— 对于其他的块,当前块指南知道很少的信息,且限制访问,甚至是同一个应用中的各个部分的块。
为了通信,应用程序块通过调用Intent发送异步消息来进行交互。Intent包含一些接收块的信息,有时还会有一些数据。Intent通过一个应用的组件触发器发送一些信息使另一个应用组件工作,以此绑定两个应用组件并允许他们进行通信。通过Intent来回发送,我们可以利用块处理一些复杂的操作,如启动相机应用进行采集保存,获取位置信息,或者从一个屏幕导航到另一个屏幕。
AndroidManifest.XML文件
当我们向应用中添加块时,它通过一个特殊的XML文件(Android Manifest)来注册。Manifest在应用程序中保持跟踪所有应用程序块,以及版本要求,权限和链接库 —— 所有操作系统需要知道的应用运行要求。Android Manifest同时还和Activity与Intent一起使用,以此控制给定Activity进行适当的操作。关于更多Android Manifest的高级功能见:原文:Working with the Android Manifest。
在单屏幕版本的Phoneword应用中,我们仅仅含有一个Activity,一个Intent和AndroidManifest.xml文件,以及额外的资源文件(如icon)。在多屏幕版本的Phoneword应用中,我们添加了一个额外的Activity —— 需要我们在第一个Activity中使用Intent来启动。在下一节,我们会探讨Intent如何在Android应用中帮助我们进行导航操作。
Android导航
我们在Phoneword应用中使用了两次Intent —— 一次是屏幕跳转,另一次是拨打电话。下面我们将深入代码来理解Intent如何工作,以及它们在Android导航中的角色。
利用Intent启动第二个Activity
在Phoneword应用中,我们使用Intent启动了第二个屏幕(Activity)。我们首先创建了一个Intent,并传入参数:当前上下文(this——指向当前上下文)和我们希望的应用程序块的类型(CallHistoryActivity):
Intent intent = new Intent(this, typeof(CallHistoryActivity));
上下文是一个关于应用环境的整体信息接口 —— 它让新建对象知道应用发生了什么。如果我们把Intent想象为一条消息,我们需要提供信息接受者的姓名(CallHistoryActivity)和信息接受者的地址(上下文-Context)。
Android为我们提供了一个为Intent附加简单数据的选项(辅助数据处理会困难很多)。在Phoneword示例中,我们使用PutStringArrayExtra
来给Intent附加了一个电话号码列表,然后调用StartActivity
来处理Intent。完整代码如下:
callHistoryButton.Click += (sender, e) =>
{
var intent = new Intent(this, typeof(CallHistoryActivity));
intent.PutStringArrayListExtra("phone_numbers", _phoneNumbers);
StartActivity(intent);
};
利用Intent启动另一个应用
在上面示例中,我们利用Intent启动了同一应用中的第二个Activity,但是Android让它启动另一个的应用的Activity也一样容易。事实上,我们在Phoneword应用中,已经处理过这种情况。当我们点击Call按钮,我们使用了如下代码:
Intent callIntent = new Intent(Intent.ActionCall);
callIntent.SetData(Android.Net.Uri.Parse("tel:" + translatedNumber));
StartActivity(callIntent);
当我们创建Intent,我们传入了Intent.ActionCall
参数,它是一个特殊的Intent类型 —— 用于启动Android电话应用,以及传递一个电话号码到拨号界面。然后我们使用SetData
来为Intent附加了一个电话号码。当我们调用StartActivity
并传入callIntent时,我们就调出了系统电话应用的拨号界面。这里将系统电话应用加载到内存中,因此启动系统的电话应用。
Phoneword中遇到的额外概念介绍
Phoneword应用中包含了几个没有在此指南中介绍的概念。其中主要有如下内容:
-
String Resources —— 在我们的Phoneword应用中,我们将
CallHistoryButton
的text值设为了@string/callHistory
。其中@string
语法表示,这个字符串值存储在 String资源文件 中(String.xml)。我们在String.xml文件中对callHistory
字符串进行了如下定义:Call History
关于更字符串资源和其他Android资源的信息,见:原文:Android Resources。
-
ListView and ArrayAdapter —— ListView是一个UI组件 —— 用于提供显示滚动列表的简便方法。ListView需要一个为行视图添加数据的Adapter。我们在CallHistoryController中使用如下代码来向界面填入数据:
this.ListAdapter = new ArrayAdapter(this, Android.Resource.Layout.SimpleListItem1, phoneNumbers);
ListView和Adapter超出了本文范围,关于其更多内容可见指南: 原文:ListViews and Adapters。其中第二部分特别介绍了使用内置ListActivity和ArrayAdapter类来创建和填充ListView,这无需自定义布局,就像我们在Phoneword示例中一样处理。第二部分链接:原文:Part 2 of ListViews and Adapters guide。
总结
至此,你已经完成了第一个多屏幕Android应用的学习。在本指南中,我们介绍了Android应用程序构建块和Intent,并利用它们构建一个多屏幕Android应用。后面课程请自行选择。
译:奇葩史