使用Intent启动Activity
Intent的最常用的用途是绑定应用程序组件。Intent用来在应用程序的Activity间启动、停止和传输。
这一章节中关于启动新的Activity的提示,也同样适用于Service。第8章可以了解到关于启动(和创建)Service的细节。
为了打开应用程序中不同的画面(Activity),调用startActivity,传入一个Intent,如下面的片段所示:
startActivity(myIntent);
Intent既可以显式的指定类去打开,也可以包含目标需要执行的动作。在后者的情况下,运行时会选择Activity去打开,使用一个熟知的处理过程——“Intent解析”
startActivity方法查找、启动与Intent最匹配的单一Activity。
当使用startActivity时,新启动的Activity结束是你的应用程序不会接收到任何通知。为了追踪打开画面的反馈,使用startActivityForResult方法,在后面会描述更多细节。
显式启动新的Activity
你在第2章已经了解到,应用程序由很多个内部相互联系的屏幕——Activity组成,这些Activity必须包含在应用程序的manifest中。为了连接它们,你可能想要显式的指定打开哪个Activity。
为了显式地选择一个Activity类来启动,需要创建一个新的Intent,指定当前应用程序的上下文和要启动的Activity的类。然后传递这个Intent给startActivity,如下的代码片段所示:
Intent intent = new Intent(MyActivity.this, MyOtherActivity.class);
startActivity(intent);
在调用startActivity之后,新的Activity(在这个例子里,是MyOtherActivity)将被创建,并变成可见和活跃状态,移到Activity栈的最顶端。
代码调用新Activity的finish方法会关闭它,并从栈中移除。可变通的地方,用户可以通过设备的Back按钮导航到先前的Activity。
隐式Intent和运行时绑定
隐式Intent是一种让匿名应用程序组件服务动作请求的机制。当创建一个新的隐式Intent时,你指定要执行的动作,作为可选项,你可以提供这个动作所需的数据。
当你使用这个新的隐式Intent来启动Activity时,Android会在运行时解析它,找到最适合在指定的数据类型上执行动作的类。这意味着,你可以创建使用其它应用程序的工程,而不需要提前精确地知道你会借用哪个应用程序的功能。
例如,如果你想让用户在应用程序里打电话,与其实现一个新的拨号,不如使用一个隐式的Intent来请求一个在一个电话号码(URI表示)上的动作(拨一个号码),如下代码片段所示:
if (somethingWeird && itDontLookGood)
{
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(“tel:555-2368”));
startActivity(intent);
}
Android解析这个Intent并启动一个提供了能在一个号码上执行拨号动作的Activity,在这里,是拨号Activity。
一些本地的应用程序提供了在特定数据上执行动作的组件。第三方应用程序,包括你的,也可以注册来支持新的动作或为本地动作提供一种替代的方法。你会在本章的后面了解到一些本地的动作。