Android四大组件之activity(活动)


前言

本文主要是整理Android四大组件之一的activity的相关知识;
其他相关内容可以跳转至 Android学习与巩固查看


一、activity简介

Activity是Android四大组件之一,主要功能就是实现一个可以让用户与程序交互的窗口。一般来说一个activity表示一个与用户交互的界面;

二、activity知识点

1.生命周期

activity的生命周期代表了一个activity从产生到被销毁的整个流程,包含了七个周期,如图:
activity生命周期
1. onCreate()
首次创建 Activity 时调用。在此方法中执行资源绑定,视图创建等静态界面初始化;此时用户不可见。在一个activity的生命周期中只会调用一次。
2. onStart()
当前Activity由用户不可见变为用户可见时调用,但是此时用户还无法进行交互。
3. onResume()
当前Activity状态属于运行状态,此时Activity获得焦点,用户可以与之进行交互。
4.onPause()
当另外一个activity覆盖当前的acitivty时,此时当前activity会进入到onPouse()方法中,当前activity是可见的,但不能与用户交互状态。
5.onStop()
onPouse()方法完成之后,此时activity进入onStop()方法,此时activity对用户是不可见的,但是Activity还未被销毁,在系统内存紧张的情况下,有可能会被系统进行回收。所以一般在当前方法可做资源回收。如果重新启动activity将进入onRestart()方法
6.onDestroy()
此方法回调时表示Activity被销毁,如果需要重启Activity需要重新新建,绑定资源及从onCreate()开始执行。
7.onRestart()
重新启动已经停止但未被销毁的 Activity 时调用。重新将Activity显示出来。调用顺序onPouse()->onStop()->onRestart()->onStart()->onResume().

2.生命周期示例验证

新建项目来看看app的各个状态所经历的生命周期;示例代码如下:

MainActivity

public class MainActivity extends AppCompatActivity {

    private Button btDialog;
    private Context context;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.e("MainActivity","onCreate()");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = this;
        btDialog = (Button) findViewById(R.id.bt_dialog);
        btDialog.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setClass(context,Activity1.class);
                startActivity(intent);
            }
        });
    }

    @Override
    protected void onStart() {
        Log.e("MainActivity","onStart()");
        super.onStart();
    }

    @Override
    protected void onResume() {
        Log.e("MainActivity","onResume()");
        super.onResume();
    }

    @Override
    protected void onPause() {
        Log.e("MainActivity","onPause()");
        super.onPause();
    }

    @Override
    protected void onStop() {
        Log.e("MainActivity","onStop()");
        super.onStop();
    }

    @Override
    protected void onDestroy() {
        Log.e("MainActivity","onDestroy()");
        super.onDestroy();
    }

    @Override
    protected void onRestart() {
        Log.e("MainActivity","onRestart()");
        super.onRestart();
    }
}

Activity1

/**
 * author xiaohu
 * description:
 * date :2022/7/11 14:40
 */
public class Activity1 extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.e("Activity1","onCreate()");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_1);
    }

    @Override
    protected void onStart() {
        Log.e("Activity1","onStart()");
        super.onStart();
    }

    @Override
    protected void onResume() {
        Log.e("Activity1","onResume()");
        super.onResume();
    }

    @Override
    protected void onPause() {
        Log.e("Activity1","onPause()");
        super.onPause();
    }

    @Override
    protected void onStop() {
        Log.e("Activity1","onStop()");
        super.onStop();
    }

    @Override
    protected void onDestroy() {
        Log.e("Activity1","onDestroy()");
        super.onDestroy();
    }

    @Override
    protected void onRestart() {
        Log.e("Activity1","onRestart()");
        super.onRestart();
    }
}

布局代码如下:

MainActivity

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/bt_dialog"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="next Activity"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

然后我们看看启动流程:
1.启动app时:

2022-07-11 14:48:31.870 2662-2662/com.xiaohu.myapplication E/MainActivity: onCreate()
2022-07-11 14:48:31.919 2662-2662/com.xiaohu.myapplication E/MainActivity: onStart()
2022-07-11 14:48:31.920 2662-2662/com.xiaohu.myapplication E/MainActivity: onResume()

2.跳转至新activity时:

2022-07-11 14:49:15.201 2662-2662/com.xiaohu.myapplication E/MainActivity: onPause()
2022-07-11 14:49:15.587 2662-2662/com.xiaohu.myapplication E/MainActivity: onStop()

3.返回原activity时:

2022-07-11 14:50:54.168 2662-2662/com.xiaohu.myapplication E/MainActivity: onRestart()
2022-07-11 14:50:54.169 2662-2662/com.xiaohu.myapplication E/MainActivity: onStart()
2022-07-11 14:50:54.169 2662-2662/com.xiaohu.myapplication E/MainActivity: onResume()

4.activity切换到后台但未被销毁时:

2022-07-11 14:53:08.625 2662-2662/com.xiaohu.myapplication E/MainActivity: onPause()
2022-07-11 14:53:08.898 2662-2662/com.xiaohu.myapplication E/MainActivity: onStop()

5.activity从后台显示到前台时:

2022-07-11 14:53:34.732 2662-2662/com.xiaohu.myapplication E/MainActivity: onRestart()
2022-07-11 14:53:34.732 2662-2662/com.xiaohu.myapplication E/MainActivity: onStart()
2022-07-11 14:53:34.732 2662-2662/com.xiaohu.myapplication E/MainActivity: onResume()

6.退出activity时

2022-07-11 14:55:04.936 2662-2662/com.xiaohu.myapplication E/MainActivity: onPause()
2022-07-11 14:55:05.200 2662-2662/com.xiaohu.myapplication E/MainActivity: onStop()
2022-07-11 14:55:05.200 2662-2662/com.xiaohu.myapplication E/MainActivity: onDestroy()

2.activity的启动模式

1.Standard 标准模式
这是activity的默认启动方式,不需要进行设置。
2.SingleTop栈顶复用模式
如果需要创建的activity在已在栈顶则不重复创建,直接复用栈顶的activity;如果activity在不在栈顶或不在栈内则会新建一个activity入栈。
3.SingleTask栈内复用模式
如果需要创建的activity在栈内,则会将activity上的所有activity出栈(销毁),使得栈内activity变为栈顶activity,再复用该activity。
4.SingleInstance单实例模式
改模式的activity仅仅能单独位于一个任务栈中,每次使用该模式创建activity时都会新生成一个Task用于存放该activity。

3.activity的启动模式示例

下面我们也通过实例来看看activity的几种启动模式;
设置activity的启动模式有两种方法:

1.在 AndroidMainifest 设置

        <!--
        standard:标准模式
        singleTop:栈顶复用模式
        singleTask:栈内复用模式
        singleInstance:单例模式
        如不设置,Activity的启动模式默认为标准模式(standard)
        -->
        <activity android:name=".Activity1"
            android:launchMode="standard"
            />

2.通过Intent设置

// FLAG_ACTIVITY_NEW_TASK:通过在Intent中加入FLAG_ACTIVITY_NEW_TASK启动Activity时,将在指定的Activity栈中启动Activity,如果栈中已经存在Activity实例,将复用实例,并且调用onNewIntent方法,这个过程跟singleTask模式下的Activity表现相同。
// FLAG_ACTIVITY_SINGLE_TOP:通过在Intent中加入FLAG_ACTIVITY_SINGLE_TOP启动Activity时,如果栈顶已经存在Activity实例,将复用Activity实例,并且调用onNewIntent方法。否则将重新创建Activity实例。这个过程跟singleTop模式下的Activity表现相同。
//FLAG_ACTIVITY_CLEAR_TOP:如果正在启动的Activity已在当前栈中运行,则不会启动该活动的新实例,而是销毁其上的所有其他活动。如果Activity的启动模式是singleTask,那么将调用onNewIntent方法。如果Activity的启动模式是standard那么会把Activity已经它上面的Activity实例一同销毁,并且重建Activity实例放入栈顶。
Intent inten = new Intent (context,Activity1.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

**如果同时设置两种方式的话Intent的优先级高于在AndroidMainifest 中设置的模式;

1.在 AndroidMainifest 设置的实例

我们先在AndroidMainifest 来设置四种方式来看看具体的情况:
示例代码:

MainActivity

public class MainActivity extends AppCompatActivity {

    private Button bt1;
    private Button bt2;
    private Context context;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.e("MainActivity", this.toString() + " : " + "onCreate()");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = this;
        bt1 = (Button) findViewById(R.id.bt_1);
        bt2 = (Button) findViewById(R.id.bt_2);
        bt1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setClass(context,Activity1.class);
                startActivity(intent);
            }
        });
        bt2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setClass(context,MainActivity.class);
                startActivity(intent);
            }
        });
    }

    @Override
    protected void onStart() {
        Log.e("MainActivity",this.toString() + " : " + "onStart()");
        super.onStart();
    }

    @Override
    protected void onResume() {
        Log.e("MainActivity",this.toString() + " : " + "onResume()");
        super.onResume();

        Log.e("MainActivity",getTaskId() + " : " + this.toString());
    }

    @Override
    protected void onPause() {
        Log.e("MainActivity",this.toString() + " : " + "onPause()");
        super.onPause();
    }

    @Override
    protected void onStop() {
        Log.e("MainActivity",this.toString() + " : " + "onStop()");
        super.onStop();
    }

    @Override
    protected void onDestroy() {
        Log.e("MainActivity",this.toString() + " : " + "onDestroy()");
        super.onDestroy();
    }

    @Override
    protected void onRestart() {
        Log.e("MainActivity",this.toString() + "onRestart()");
        super.onRestart();
    }


}

Activity1

public class Activity1 extends AppCompatActivity {

    private Button bt1;
    private Button bt2;
    private Context context;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.e("Activity1", this.toString() + " : " + "onCreate()");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_1);
        context = this;
        bt1 = (Button) findViewById(R.id.bt_1);
        bt2 = (Button) findViewById(R.id.bt_2);
        bt1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setClass(context,MainActivity.class);
                startActivity(intent);
            }
        });
        bt2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setClass(context,Activity1.class);
                startActivity(intent);
            }
        });
    }

    @Override
    protected void onStart() {
        Log.e("Activity1", this.toString() + " : " + "onStart()");
        super.onStart();
    }

    @Override
    protected void onResume() {
        Log.e("Activity1", this.toString() + " : " + "onResume()");
        super.onResume();
        Log.e("Activity1",getTaskId() + " : " + this.toString());
    }

    @Override
    protected void onPause() {
        Log.e("Activity1", this.toString() + " : " + "onPause()");
        super.onPause();
    }

    @Override
    protected void onStop() {
        Log.e("Activity1", this.toString() + " : " + "onStop()");
        super.onStop();
    }

    @Override
    protected void onDestroy() {
        Log.e("Activity1", this.toString() + " : " + "onDestroy()");
        super.onDestroy();
    }

    @Override
    protected void onRestart() {
        Log.e("Activity1", this.toString() + " : " + "onRestart()");
        super.onRestart();
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/bt_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Activity1"
        app:layout_constraintBottom_toTopOf="@id/bt_2"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/bt_2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="MainActivity"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@id/bt_1" />

</androidx.constraintlayout.widget.ConstraintLayout>

activity_1.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <Button
        android:id="@+id/bt_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="MainActivity"
        app:layout_constraintBottom_toTopOf="@id/bt_2"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/bt_2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Activity1"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@id/bt_1" />

</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity界面
在这里插入图片描述

Activity1界面

在这里插入图片描述

1.Standard 标准模式:
在AndroidMainfast中设置:

        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:launchMode="standard">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!--
        standard:标准模式
        singleTop:栈顶复用模式
        singleTask:栈内复用模式
        singleInstance:单例模式
        如不设置,Activity的启动模式默认为标准模式(standard)
        -->
        <activity android:name=".Activity1"
            android:launchMode="standard"
            />

如上图,进入MainActivity后点击两次MAINACTIVITY按钮打印日志如下:

2022-07-11 15:57:56.261 4988-4988/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@38abf22 : onCreate()
2022-07-11 15:57:56.312 4988-4988/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@38abf22 : onStart()
2022-07-11 15:57:56.312 4988-4988/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@38abf22 : onResume()
2022-07-11 15:57:56.312 4988-4988/com.xiaohu.myapplication E/MainActivity: 26 : com.xiaohu.myapplication.MainActivity@38abf22
2022-07-11 15:58:33.583 4988-4988/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@38abf22 : onPause()
2022-07-11 15:58:33.652 4988-4988/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@c131345 : onCreate()
2022-07-11 15:58:33.657 4988-4988/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@c131345 : onStart()
2022-07-11 15:58:33.658 4988-4988/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@c131345 : onResume()
2022-07-11 15:58:33.658 4988-4988/com.xiaohu.myapplication E/MainActivity: 26 : com.xiaohu.myapplication.MainActivity@c131345
2022-07-11 15:58:34.074 4988-4988/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@38abf22 : onStop()
2022-07-11 15:58:35.416 4988-4988/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@c131345 : onPause()
2022-07-11 15:58:35.485 4988-4988/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@bf77c80 : onCreate()
2022-07-11 15:58:35.490 4988-4988/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@bf77c80 : onStart()
2022-07-11 15:58:35.490 4988-4988/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@bf77c80 : onResume()
2022-07-11 15:58:35.491 4988-4988/com.xiaohu.myapplication E/MainActivity: 26 : com.xiaohu.myapplication.MainActivity@bf77c80
2022-07-11 15:58:35.844 4988-4988/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@c131345 : onStop()

我们可以看出在standard模式下我们每次创建activity都会生成一个新的实例加入同一个activity栈中,不会新建activity栈;

2.SingleTop栈顶复用模式

在AndroidMainfast中设置:

<activity
            android:name=".MainActivity"
            android:exported="true"
            android:launchMode="singleTop"
            android:label="MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!--
        standard:标准模式
        singleTop:栈顶复用模式
        singleTask:栈内复用模式
        singleInstance:单例模式
        如不设置,Activity的启动模式默认为标准模式(standard)
        -->
        <activity android:name=".Activity1"
            android:launchMode="singleTop"
            android:label="Activity1"
            />

进入MainActivity后点击两次ACTIVITY1按钮打印日志如下:

2022-07-12 09:17:31.728 2356-2356/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@b25aea : onCreate()
2022-07-12 09:17:31.776 2356-2356/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@b25aea : onStart()
2022-07-12 09:17:31.776 2356-2356/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@b25aea : onResume()
2022-07-12 09:17:31.777 2356-2356/com.xiaohu.myapplication E/MainActivity: 5 : com.xiaohu.myapplication.MainActivity@b25aea
2022-07-12 09:17:42.382 2356-2356/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@b25aea : onPause()
2022-07-12 09:17:42.451 2356-2356/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@10ac362 : onCreate()
2022-07-12 09:17:42.456 2356-2356/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@10ac362 : onStart()
2022-07-12 09:17:42.457 2356-2356/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@10ac362 : onResume()
2022-07-12 09:17:42.457 2356-2356/com.xiaohu.myapplication E/Activity1: 5 : com.xiaohu.myapplication.Activity1@10ac362
2022-07-12 09:17:42.862 2356-2356/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@b25aea : onStop()
2022-07-12 09:17:44.839 2356-2356/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@10ac362 : onPause()
2022-07-12 09:17:44.839 2356-2356/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@10ac362 : onResume()
2022-07-12 09:17:44.840 2356-2356/com.xiaohu.myapplication E/Activity1: 5 : com.xiaohu.myapplication.Activity1@10ac362

我们可以看出在第二次生成activity1的时候,由于activity1在栈顶所以再次生成时是复用了栈顶的activity,并没有重复生成实例;

3.SingleTask栈内复用模式

在AndroidMainfast中设置:

<activity
            android:name=".MainActivity"
            android:exported="true"
            android:launchMode="singleTask"
            android:label="MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!--
        standard:标准模式
        singleTop:栈顶复用模式
        singleTask:栈内复用模式
        singleInstance:单例模式
        如不设置,Activity的启动模式默认为标准模式(standard)
        -->
        <activity android:name=".Activity1"
            android:launchMode="singleTask"
            android:label="Activity1"
            />

进入MainActivity后 点击ACTIVITY1按钮 再点击MainActivity按钮 再点击ACTIVITY1按钮打印日志如下:

2022-07-12 09:24:53.745 2586-2586/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@951cd54 : onCreate()
2022-07-12 09:24:53.750 2586-2586/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@951cd54 : onStart()
2022-07-12 09:24:53.750 2586-2586/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@951cd54 : onResume()
2022-07-12 09:24:53.751 2586-2586/com.xiaohu.myapplication E/MainActivity: 7 : com.xiaohu.myapplication.MainActivity@951cd54
2022-07-12 09:25:01.540 2586-2586/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@951cd54 : onPause()
2022-07-12 09:25:01.580 2586-2586/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@161ebac : onCreate()
2022-07-12 09:25:01.586 2586-2586/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@161ebac : onStart()
2022-07-12 09:25:01.587 2586-2586/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@161ebac : onResume()
2022-07-12 09:25:01.587 2586-2586/com.xiaohu.myapplication E/Activity1: 7 : com.xiaohu.myapplication.Activity1@161ebac
2022-07-12 09:25:01.840 2586-2586/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@951cd54 : onStop()
2022-07-12 09:25:04.824 2586-2586/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@161ebac : onPause()
2022-07-12 09:25:04.877 2586-2586/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@951cd54onRestart()
2022-07-12 09:25:04.877 2586-2586/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@951cd54 : onStart()
2022-07-12 09:25:04.877 2586-2586/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@951cd54 : onResume()
2022-07-12 09:25:04.877 2586-2586/com.xiaohu.myapplication E/MainActivity: 7 : com.xiaohu.myapplication.MainActivity@951cd54
2022-07-12 09:25:05.065 2586-2586/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@161ebac : onStop()
2022-07-12 09:25:05.065 2586-2586/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@161ebac : onDestroy()
2022-07-12 09:25:06.199 2586-2586/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@951cd54 : onPause()
2022-07-12 09:25:06.251 2586-2586/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@7ac2e59 : onCreate()
2022-07-12 09:25:06.256 2586-2586/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@7ac2e59 : onStart()
2022-07-12 09:25:06.257 2586-2586/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@7ac2e59 : onResume()
2022-07-12 09:25:06.258 2586-2586/com.xiaohu.myapplication E/Activity1: 7 : com.xiaohu.myapplication.Activity1@7ac2e59
2022-07-12 09:25:06.512 2586-2586/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@951cd54 : onStop()

我们可以看出我们总共生成了四个activity,因为栈内复用所以再次生成mainActivity时复用了栈内的mainActivity,但是此时在MainActivity上层的activity会出栈被销毁,所以我们再次生成Activity1是可以看到是新建了一个实例;

4.SingleInstance单实例模式

在AndroidMainfast中设置:

<activity
            android:name=".MainActivity"
            android:exported="true"
            android:launchMode="singleInstance"
            android:label="MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!--
        standard:标准模式
        singleTop:栈顶复用模式
        singleTask:栈内复用模式
        singleInstance:单例模式
        如不设置,Activity的启动模式默认为标准模式(standard)
        -->
        <activity android:name=".Activity1"
            android:launchMode="singleInstance"
            android:label="Activity1"
            />

进入MainActivity后 点击ACTIVITY1按钮 再点击MainActivity按钮 再点击MainActivity按钮打印日志如下:

2022-07-12 09:37:15.221 2776-2776/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@775fae1 : onCreate()
2022-07-12 09:37:15.226 2776-2776/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@775fae1 : onStart()
2022-07-12 09:37:15.227 2776-2776/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@775fae1 : onResume()
2022-07-12 09:37:15.227 2776-2776/com.xiaohu.myapplication E/MainActivity: 10 : com.xiaohu.myapplication.MainActivity@775fae1
2022-07-12 09:37:19.573 2776-2776/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@775fae1 : onPause()
2022-07-12 09:37:19.661 2776-2776/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@6705381 : onCreate()
2022-07-12 09:37:19.666 2776-2776/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@6705381 : onStart()
2022-07-12 09:37:19.666 2776-2776/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@6705381 : onResume()
2022-07-12 09:37:19.667 2776-2776/com.xiaohu.myapplication E/Activity1: 11 : com.xiaohu.myapplication.Activity1@6705381
2022-07-12 09:37:19.844 2776-2776/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@775fae1 : onStop()
2022-07-12 09:37:22.665 2776-2776/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@6705381 : onPause()
2022-07-12 09:37:22.744 2776-2776/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@775fae1onRestart()
2022-07-12 09:37:22.744 2776-2776/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@775fae1 : onStart()
2022-07-12 09:37:22.744 2776-2776/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@775fae1 : onResume()
2022-07-12 09:37:22.745 2776-2776/com.xiaohu.myapplication E/MainActivity: 10 : com.xiaohu.myapplication.MainActivity@775fae1
2022-07-12 09:37:22.984 2776-2776/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@6705381 : onStop()
2022-07-12 09:37:23.851 2776-2776/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@775fae1 : onPause()
2022-07-12 09:37:23.851 2776-2776/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@775fae1 : onResume()
2022-07-12 09:37:23.851 2776-2776/com.xiaohu.myapplication E/MainActivity: 10 : com.xiaohu.myapplication.MainActivity@775fae1

我们可以看到在新建Activity1时同时新建了一个栈用来存放activity1,新建MainActivity时会复用MainActivity存储栈中的实例,而不是新建,所以在该模式下一个栈只存放一个activity,没次新建一个新的activity都会生成一个栈用来存放改activity,如果该activity已经创建过,那么就会复用已创建的activity,不再新建;

4.activity间的数据传递与回传

跳转activity时可以使用 startActivity 或 startActivityForResult 两种方式跳转 然后我们可以定义一个Intent 携带需要传输的数据传递给跳转到的activity,也可以使用bundle注入数据,在通过intent携带bundle来进行传输;我更喜欢后者的携带数据的方式;startActivity只是将数据传递给下一个activity,如果需要接受返回数据就需要使用startActivityForResult ;

1.单方面页面间传值 startActivity

传递数据

                Intent intent = new Intent(context,Activity1.class);
                Bundle bundle = new Bundle();
                bundle.putString("value","hello! this is MainActivity");
                intent.putExtra("bundle",bundle);
                startActivity(intent);

接收数据

Intent intent = getIntent();
        Bundle bundle = intent.getBundleExtra("bundle");
        Log.e("Activity1", bundle.get("value").toString());

通过日志打印获取数据

2022-07-21 15:54:05.867 2608-2608/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@3f138fc : onPause()
2022-07-21 15:54:05.936 2608-2608/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@bbb44b4 : onCreate()
2022-07-21 15:54:05.941 2608-2608/com.xiaohu.myapplication E/Activity1: hello! this is MainActivity
2022-07-21 15:54:05.941 2608-2608/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@bbb44b4 : onStart()
2022-07-21 15:54:05.942 2608-2608/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@bbb44b4 : onResume()
2022-07-21 15:54:05.942 2608-2608/com.xiaohu.myapplication E/Activity1: 5 : com.xiaohu.myapplication.Activity1@bbb44b4
2022-07-21 15:54:06.369 2608-2608/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@3f138fc : onStop()

1.获取返回数据的页面间传值 startActivityForResult

MainActivity传递数据给activity1

Intent intent = new Intent(context,Activity1.class);
                Bundle bundle = new Bundle();
                bundle.putString("value","hello! this is MainActivity");
                intent.putExtra("bundle",bundle);
                startActivityForResult(intent,001);

MainActivity获取下一个activity1返回的数据

// 获取返回数据
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == 001){
            Bundle bundle = data.getBundleExtra("backBundle");
            Log.e("MainActivity",bundle.getString("backValue"));
        }
    }

activity1获取MainActivity的数据并返回数据给MainActivity

//获取数据
        Intent intent = getIntent();
        Bundle bundle = intent.getBundleExtra("bundle");
        Log.e("Activity1", bundle.get("value").toString());


        // 设置返回数据
        Bundle bundleBack = new Bundle();
        bundleBack.putString("backValue","hello! this is Activity1 back");
        intent.putExtra("backBundle",bundleBack);
        setResult(001,intent);

日志打印整个流程

2022-07-21 16:01:11.571 2872-2872/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@3f138fc : onPause()
2022-07-21 16:01:11.638 2872-2872/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@bbb44b4 : onCreate()
2022-07-21 16:01:11.642 2872-2872/com.xiaohu.myapplication E/Activity1: hello! this is MainActivity
2022-07-21 16:01:11.643 2872-2872/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@bbb44b4 : onStart()
2022-07-21 16:01:11.643 2872-2872/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@bbb44b4 : onResume()
2022-07-21 16:01:11.643 2872-2872/com.xiaohu.myapplication E/Activity1: 7 : com.xiaohu.myapplication.Activity1@bbb44b4
2022-07-21 16:01:12.009 2872-2872/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@3f138fc : onStop()
2022-07-21 16:01:13.626 2872-2872/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@bbb44b4 : onPause()
2022-07-21 16:01:13.627 2872-2872/com.xiaohu.myapplication E/MainActivity: hello! this is Activity1 back
2022-07-21 16:01:13.627 2872-2872/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@3f138fconRestart()
2022-07-21 16:01:13.627 2872-2872/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@3f138fc : onStart()
2022-07-21 16:01:13.627 2872-2872/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@3f138fc : onResume()
2022-07-21 16:01:13.628 2872-2872/com.xiaohu.myapplication E/MainActivity: 7 : com.xiaohu.myapplication.MainActivity@3f138fc
2022-07-21 16:01:13.764 2872-2872/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@bbb44b4 : onStop()
2022-07-21 16:01:13.764 2872-2872/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@bbb44b4 : onDestroy()

不仅仅是String类型的数据其他类型的数据也可以这样携带,实体对象也可以序列化之后直接写带传输;
示例如下:
MainActivity代码:

// 设置传值
                Data data = new Data();
                data.setContent("hello! this is MainActivity");

                Intent intent = new Intent(context,Activity1.class);
                Bundle bundle = new Bundle();
                bundle.putSerializable("value",data);
                intent.putExtra("bundle",bundle);
                startActivityForResult(intent,001);
// 获取返回数据
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == 001){
            Bundle bundle = data.getBundleExtra("backBundle");
            Data data1 = (Data) bundle.getSerializable("backValue");
            Log.e("MainActivity",data1.getContent());
        }
    }

Activity1代码

 //获取数据
        Intent intent = getIntent();
        Bundle bundle = intent.getBundleExtra("bundle");
        Data data = (Data) bundle.getSerializable("value");
        Log.e("Activity1",data.getContent());


        // 设置返回数据
        data.setContent("hello! this is Activity1 back");
        Bundle bundleBack = new Bundle();
        bundleBack.putSerializable("backValue",data);
        intent.putExtra("backBundle",bundleBack);
        setResult(001,intent);

日志打印:

2022-07-21 16:07:32.940 3044-3044/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@3f138fc : onCreate()
2022-07-21 16:07:32.940 3044-3044/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@3f138fc : onCreate()
2022-07-21 16:07:32.993 3044-3044/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@3f138fc : onStart()
2022-07-21 16:07:32.994 3044-3044/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@3f138fc : onResume()
2022-07-21 16:07:32.994 3044-3044/com.xiaohu.myapplication E/MainActivity: 8 : com.xiaohu.myapplication.MainActivity@3f138fc
2022-07-21 16:07:36.733 3044-3044/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@3f138fc : onPause()
2022-07-21 16:07:36.775 3044-3044/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@5d095d9 : onCreate()
2022-07-21 16:07:36.780 3044-3044/com.xiaohu.myapplication E/Activity1: hello! this is MainActivity
2022-07-21 16:07:36.780 3044-3044/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@5d095d9 : onStart()
2022-07-21 16:07:36.781 3044-3044/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@5d095d9 : onResume()
2022-07-21 16:07:36.781 3044-3044/com.xiaohu.myapplication E/Activity1: 8 : com.xiaohu.myapplication.Activity1@5d095d9
2022-07-21 16:07:37.036 3044-3044/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@3f138fc : onStop()
2022-07-21 16:07:39.160 3044-3044/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@5d095d9 : onPause()
2022-07-21 16:07:39.162 3044-3044/com.xiaohu.myapplication E/MainActivity: hello! this is Activity1 back
2022-07-21 16:07:39.162 3044-3044/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@3f138fconRestart()
2022-07-21 16:07:39.162 3044-3044/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@3f138fc : onStart()
2022-07-21 16:07:39.162 3044-3044/com.xiaohu.myapplication E/MainActivity: com.xiaohu.myapplication.MainActivity@3f138fc : onResume()
2022-07-21 16:07:39.162 3044-3044/com.xiaohu.myapplication E/MainActivity: 8 : com.xiaohu.myapplication.MainActivity@3f138fc
2022-07-21 16:07:39.315 3044-3044/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@5d095d9 : onStop()
2022-07-21 16:07:39.315 3044-3044/com.xiaohu.myapplication E/Activity1: com.xiaohu.myapplication.Activity1@5d095d9 : onDestroy()

以上就是Activity的基本数据传输方法;

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值