Activity是Android应用的关键组件,我们所见到的很多Android应用都是通过Activity的各种组合而成的。在大多数编程中,都是通过main()方法来启动应用程序的,但是在Android应用中则不然,它是通过调用与其生命周期特定阶段相对应的回调方法来运行Activity实例中的代码。
所以我们本文来介绍Activity的概念,并简要说明如何使用Activity。
Activity的概念
其实移动应用和PC应用的最大区别主要还是在体验上,桌面应用你每次启动后都会先进入该PC应用的首页,而移动应用则不一定了。例如:你直接通过手机桌面启动今日头条APP,那你进去的就是这个APP的主页,但是你通过通知栏进去的话,现实的就是某条新闻的详情页。
Activity存在的目的就是促进并推动这种模式的发展,当一个应用调用另一个应用时,调用方APP会调用另一个APP的某一个Activity,而不是整个APP。通过这种方式,Activity充当了APP与用户互动的入口点。
Activity提供了一个窗口供开发者在其中绘制界面,通常此窗口是会充满整个屏幕的,但在特定情况下可能会比屏幕小,也有可能是浮动在其他窗口上面,通常一个Activity实现一个界面,而一个APP是由多个界面组成的。
大多数APP包含多个界面,那么也就意味着它包含了多个Activity。一个APP不管有多少个Activity组成,但它只能有一个主Activity。也就是用户启动后看到的第一个界面。然后可以再通过各种activity之间的启动调用来组合起来形成一个完成的APP应用。比如我们经常使用的微信,在你打开的时候,一般是在消息界面,但是你可以通过下面的菜单后菜单中的菜单进入朋友圈、附近的人、漂流瓶等等功能中去。
虽然应用中的各个 Activity 协同工作形成统一的用户体验,但每个 Activity 与其他 Activity 之间只存在松散的关联,应用内不同 Activity 之间的依赖关系通常很小。这对于我们开发者来说叫解耦,解耦度越高能实现的功能就越多,可扩展性就越好。事实确实如此,Activity 经常会启动属于其他应用的 Activity。例如,浏览器应用可能会启动社交媒体应用的“分享”Activity。
配置清单
要使应用能够使用 Activity,您必须在清单中声明 Activity 及其特定属性。如果只是创建了新Activity代码而没有在清单文件中声明,那么在你启动该Activity的时候就会引起APP崩溃。
要声明 Activity,请打开清单文件,并添加
元素作为 元素的子元素。例如:
<manifest ... >
<application ... >
<activity android:name=".ExampleActivity" />
...
application ... >
...
manifest >
此元素唯一的必要属性是 android:name
,该属性用于指定 Activity 的类名称。
声明 intent 过滤器
Intent 过滤器是 Android 平台的一项非常强大的功能。借助这项功能,您不但可以根据显式请求启动 Activity,还可以根据隐式请求启动 Activity。显式请求就是直接告诉系统你要启动的Activity就行了,而隐式请求就是系统发现有多个满足要求的Activity,然后会让用户去选择使用哪一个。例如,你使用微信给好友发一个链接,他点击这个链接的时候,如果你手机上有多个浏览器的话,系统就会询问你打算使用哪个浏览器去访问这个链接,这就是 intent 过滤器在起作用。
要使用此功能,您需要在
元素中声明
属性。此元素的定义包括
元素,以及可选的
元素和 元素。这些元素组合在一起,可以指定 Activity 能够响应的 intent 类型。例如,以下代码段展示了如何配置一个发送文本数据并接收其他 Activity 的文本数据发送请求的 Activity:
<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
intent-filter>
activity>
在此示例中
,
元素指定该 Activity 会发送数据。将
元素声明为 DEFAULT
可使 Activity 能够接收启动请求。 元素指定此 Activity 可以发送的数据类型。以下代码段展示了如何调用上述 Activity:
// Create the text message with a string
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.setType("text/plain");
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
// Start the activity
startActivity(sendIntent);
如果您打算构建一个独立的应用,不允许其他应用激活其 Activity,则不需要任何其他 intent 过滤器。您不想让其他应用访问的 Activity 不应包含 intent 过滤器,您可以自己使用显式 intent 启动它们。
声明权限
您可以使用清单的
标记来控制哪些应用可以启动某个 Activity。启动APP和被启动APP 必须在其清单中具有相同的权限,前者才能启动后者。如果您为启动APP 声明了
元素,则所有需要启动该APP的APP都必须具有匹配的
元素。
例如,假设您的应用想要使用一个名为 SocialApp 的应用在社交媒体上分享文章,则 SocialApp 本身必须定义调用它的应用所需具备的权限:
<manifest>
<activity android:name="...."
android:permission=”com.google.socialapp.permission.SHARE_POST”
/>
然后,为了能够调用 SocialApp,您的应用必须匹配 SocialApp 清单中设置的权限:
<manifest>
<uses-permission android:name="com.google.socialapp.permission.SHARE_POST" />
manifest>