Android开发中,Activity页面之间的跳转可以分为两大类型。其中两种中又有不同的方法和方式,接下来会详细介绍页面跳转的每种方式。
Intent是一个消息传递对象,可以用于其他应用请求操作。Intent可以通过多种方式促进组件之间的通信,接下来只讲解Intent启用Activity,页面跳转的部分。
Intent由以下各个组成部分:
component(组件):目的组件
action(动作):用来表现意图的行动
category(类别):用来表现动作的类别
data(数据):表示与动作要操纵的数据
type(数据类型):对于data范例的描写
extras(扩展信息):扩展信息
Flags(标志位):期望这个意图的运行模式
Intent类型分为显式Intent(直接类型)、隐式Intent(间接类型)。
Activity 表示应用中的一个屏幕。通过将 Intent 传递给 startActivity(),可以启动新的 Activity 实例。Intent 用于描述要启动的 Activity,并携带任何必要的数据。如果希望在 Activity 完成后收到结果,请调用 startActivityForResult()。在 Activity 的 onActivityResult() 回调中,您的 Activity 将结果作为单独的 Intent 对象接收。
一、显示调用方法
当前页面A命名为:MainActivity
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 页面 跳转下一个页面的跳转按钮
Button nextBt = findViewById(R.id.nextBtn);
nextBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 跳转下一个页面
Intent inter = new Intent(MainActivity.this, NextActiverVC.class);
startActivity(inter);
}
});
}
}
跳转页面B命名为:NextActiverVC
public class NextActiverVC extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_next);
// 页面内的一个返回按钮
Button gobackBtn = findViewById(R.id.button);
gobackBtn.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
// 返回上一个页面
finish();
}
});
System.out.println("--nextVC----onCreate--------开始----");
}
}
1.单个页面跳转
1)Intent直接类方法
Intent inter = new Intent(this, NextActiverVC.class);
startActivity(inter);
//或者
Intent inter = new Intent(MainActivity.this, NextActiverVC.class);
startActivity(inter);
// 或者
Intent inter = new Intent();
inter.setComponent(new ComponentName(this, NextActiverVC.class));
startActivity(inter);
2)Intent对象设置方法
Intent inter = new Intent();
inter.setClass(this,NextActiverVC.class);
startActivity(inter);
// 或者
Intent inter = new Intent();
inter.setClass(MainActivity.this,NextActiverVC.class);
startActivity(inter);
// 或者
Intent inter = new Intent();
inter.setComponent(new ComponentName(MainActivity.this, NextActiverVC.class));
startActivity(inter);
其中使用component组件:目标组件
2.多层页面跳转
跳转页面C命名为:ThirtvcActivity
public class ThirtvcActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_thirtvc);
}
}
直接同A页面直接跳转到C页面,中间页面是B页面
Activity A-——>ActivityB ——> Activity C
跳转的方式:
Intent intents[] = new Intent[2];
Intent intent1 = new Intent(this,NextActiverVC.class);
Intent intent2 = new Intent(this, ThirtvcActivity.class);
intents[0] = intent1;
intents[1] = intent2;
startActivities(intents);
3. 页面跳转回调传参
从页面A(MainActivity)使用startActivityForResult跳转到B(NextActivity)页面,B页面点击返回时将新写入的值通过Intent传回到A页面。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button nextBtn = findViewById(R.id.mainBtn);
nextBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/// 按钮 下一页
Intent intent = new Intent(MainActivity.this, NextActivity.class);
startActivityForResult(intent, 3);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 3 && resultCode == 5){
String result = data.getStringExtra("resultStr");
System.out.println(result);
}
}
}
public class NextActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_next);
final Button finishBtn = findViewById(R.id.finishBtn);
finishBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent finishIntent = new Intent();
finishIntent.putExtra("resultStr", "测试返回数据");
setResult(5,finishIntent);
finishActivity(3);
}
});
}
// 避免通过点击返回键的方式,返回到上一个Activity页面,无法实现数据的回传。
// 下边有两种方式实现点击返回按钮,回传参数
// 方式一: 回调返回按钮之前, 设置需要返回的Intent传的参数
// 使用方法二时,方法一不会被调用。
@Override
public void onBackPressed() {
Intent finishIntent = new Intent();
finishIntent.putExtra("resultStr", "测试返回数据");
setResult(5,finishIntent);
finishActivity(3);
System.out.println("--------------onBackPressed--------------");
super.onBackPressed();
}
// 方法二:通过监听按键的方式,判断点击返回按钮KEYCODE_BACK,实现设置返回参数。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
System.out.println("--------------onKeyDown--------------");
if (keyCode == KeyEvent.KEYCODE_BACK){
Intent finishIntent = new Intent();
finishIntent.putExtra("resultStr", "测试返回数据");
setResult(5,finishIntent);
finishActivity(3);
return true;
}else{
return super.onKeyDown(keyCode, event);
}
}
}
注意:
系统的Back返回键,直接返回RESULT_CANCELED,不会带有数据参数,所有如果点击返回键时返回数据,必须重写或者截获Back键的事件处理。
其中在完成Activity有两个方法1.finish() 2)finishActivity();(有返回的返回)
二、隐式调用
在AndroidManifest.xml文件中配置隐式方法的调用,对应的类和类名都和上边一致。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ftimage.firstandroid">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".ThirdvcActivity">
<intent-filter>
<action android:name="com.ftimage.firstandroid.test"></action>
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
</activity>
<activity android:name=".NextActivity" />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
页面跳转的方法如下,就详细书写。
// 跳转方法
Intent intent = new Intent("com.ftimage.firstandroid.test");
startActivity(intent);
注意:
在隐式调用过程中,Action用来表现意图的行动,category用来表现动作的类别。其他的data、type、extras等根据需要进行配置,在这就详细介绍了。
在隐式调用过程中,当前App A可以跳到其他App B的页面,同时可以携带对应的参数等。这个例子只是App内的跳转。