活动之间的Android意向处理示例教程
在上一个Android教程中,我们讨论了Android Hello World应用程序。
在本Android教程中,我们将深入研究名为Intent的Android基本构建块。
什么是Android Intent?
Android意图是一种数据结构,其中包含要执行的操作的描述。
Intent最强大的功能之一是,您可以将消息异步发送到其他活动和服务。
意图始终由Android组件(即活动,服务或者广播接收器)处理。
在本教程中,我们将重点放在作为意图处理程序的活动上。
Android意向类型
明确意图用名称(完全限定的类名称)指定组件。
通常,您会使用明确的意图在自己的应用程序中启动组件,因为您知道要启动的活动或者服务的类名。
创建显式意图以启动活动或者服务时,系统会立即启动Intent对象中指定的应用程序组件。隐式意图不命名特定组件,而是声明要执行的常规操作,该操作允许另一个应用程序中的组件对其进行处理。
创建隐式意图时,Android系统会通过将意图的内容与设备上其他应用的列表文件中声明的意图过滤器进行比较,找到合适的组件来开始。
如果意图与意图过滤器匹配,则系统将启动该组件并将其交付给Intent对象。
我们如何使用android intent启动活动?
要创建意图并使用它启动活动,我们可以在调用者活动中编写以下代码:
Intent intent = new Intent(CallerActivity.this, CallingActivity.class); startActivity(intent);
运行此代码段具有以下后果:
创建了CallingActivity的新实例
该实例被推入当前任务堆栈的顶部,这是调用者活动所在的堆栈。
该活动已启动并带到前台。
使用Android意向标志
在Intent类中定义的标志,用作标志的元数据。
这些标志可能会指示Android系统如何启动活动以及在启动活动后如何对其进行处理。
可以通过在将意图传递给startActivity(Intent)之前在意图实例上指定意图标志来修改所描述的行为,例如:
intent.addFlag(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
这会将当前堆栈中存在的调用活动类型的现有实例带到前台。
项目结构
该项目包含两个名为FirstActivity.java和SecondActivity.java的活动。
撇开常规,在资源文件夹中的一个可区分目录是动画。
它包含动画资源文件,我们将在本教程的后面部分详细介绍。
使用按钮
在本教程中,我们将使用按钮来显示"活动之间的意图"。
按钮是用户可以按下或者单击以执行操作的按钮。
它继承自android.widget.TextView类。
android.widget.Button类用于显示普通按钮。
为了使按钮在用户单击时做出反应,必须注册一个click事件。
为此,添加了一个OnClickListener()方法。
其中我们将在方法内部调用intent对象。
以下代码片段显示了它是如何完成的:
FirstActivity.java
button=(Button)findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent= new Intent(FirstActivity.this,SecondActivity.class); startActivity(intent); }});
添加动画
现在让我们在执行Intent时添加过渡效果。
为此,请在res-> anim下添加两个名为activity_in.xml和activity_out.xml的动画资源文件。
这些包含发生意图时的过渡效果。
以下屏幕截图分别显示activity_in和activity_out。
activity_in.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="https://schemas.android.com/apk/res/android"> <translate android:fromXDelta="100%" android:toXDelta="0" android:duration="200" </set>
activity_out.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="https://schemas.android.com/apk/res/android"> <translate android:fromXDelta="0" android:toXDelta="-100%" android:duration="200" </set>
如您所见,这两张照片中的deltaX值是互补的。
这是显而易见的,因为新活动将移入,而先前的活动必须移出。
现在,只需在startActivity(intent)之后添加以下代码段:
overridePendingTransition(R.anim.activity_in, R.anim.activity_out);
在android模拟器中构建并运行项目.