在应用程序中,几乎每个Activity都不是独立存在的,因为单独的一个Activity往往是不能实现程序所有功能。举个例子,我们日常使用的微信,启动后首先显示的是登录界面,登录成功后进入到会话列表页面,点击会话后会再跳转到聊天页面,这就是页面之间的跳转,也可称为Activity间的跳转。
Activity间的跳转方式
显式跳转:明确指定需要跳转到的目标Activity
隐式跳转:不明确指定某个Activity,根据条件找到目标Activity
无论是显式跳转、隐式跳转都可以通过Intent来实现,下面通过一个小实例来演示Activity之间的跳转
如何实现Activity间的跳转 ?
Intent
Intent中文意思为意图、意向,在Android中,Intent为一个消息传递对象,可用于Android组件之间传递请求操作,如:启动服务启动Activity、传递数据、发送广播等。通过在Intent对象中封装不同类型的信息传递相应的请求操作。Intent封装传递类型主要有:
- 动作(Action)
- 组件名称(ComponentName)
- 种类(Category)
- 数据(Data)
- 附件信息(Extra)
- 标志(Flag)
下面我们使用Intent分别实现显式跳转和隐式跳转:
实例需求
点击按钮,从FirstActivity跳转到SecondActivity
需求分析
创建一个项目,新建两个Activity分别为:FirstActivity、SecondActivity,FirstActivity的布局中添加一个Button控件,在该控件的监听事件中编写跳转到SecondActivity的逻辑代码,布局布局代码就不提供了,都是最基础的布局创建,控件添加。
显示跳转实现
实例代码
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);
Button mBtn = findViewById(R.id.btn);
mBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);
}
});
}
}
代码解析
在FirstActivity的Java代码中声明中找到用于触发跳转的Button控件,再通过.setOnClickListener( )方法中通过匿名内部类的方式设置该Button的监听事件,在监听事件中,创建了一个Intent实例对象,Intent的构造函数中传入了两个参数:
- 第一个参数:发送跳转请求的Activity.this(这里我们是从FirstActivity进行跳转,所以是FirstActivity.this)
- 第二个参数:目标Activity.class(跳转的目标Activity为SecondActivity,故此处为SecondActivity.class)
- startActivity:该方法用于Activity间的跳转,把封装着跳转信息的intent作为参数传入即可
实例演示
隐式跳转实现
隐式跳转并不会再Intent中明确的指定目标Activity,而是需要在AndroidManifest文件中给目标Activity添加以下代码:
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="IntentTest.action"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
- <intent-filter>:意图过滤器,隐式跳转就是通过匹配意图过滤器中的内容来确定目标Activity
- <action>:表示动作,其值可以设置为一段自定义的字符串,也可使用系统提供的action,可添加多个Action,但是只要匹配其中一个Action即可。
- <category>:表示种类,跟action一样,也是过滤器中的一种匹配类型,也可自定义或者使用系统提供的category,可以有多个category,且必须添加<category android:name="android.intent.category.DEFAULT"/>这个过滤条件
给目标Activity添加好过滤器后,回到FirstActivity中修改代码:
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);
Button mBtn = findViewById(R.id.btn);
mBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setAction("IntentTest.ACTION");
intent.addCategory("android.intent.category.DEFAULT");
startActivity(intent);
}
});
}
}
在FirstActivity中的Button点击事件中,创建了一个Intent实例对象,注意,这次我们并没有明确指定跳转到的Activity,而是通过两个方法,将目标Activity的过滤器中设置的过滤条件传入到了Intent实例中,再由Intent进行匹配、找到符合条件的Activity进行跳转:
- .setAction:给Intent对象传入action
- .addCategory:给Intent添加category
- startActivity:传入Intent进行跳转
实例演示
ok,以上就是如何通过Intent实现Activity间的跳转,上面分别通过显式和隐式两种方式实现。
总结:
显式跳转即在Intent中显式的声明需要跳转到的目标Activity
隐式跳转是给目标Activity添加意图过滤器,再给Intent中设置相应意图属性,对目标Activity进行匹配,再跳转。