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内的跳转。