• 【Android】-- Activity页面(启动和结束、生命周期、启动模式和实例)


    目录

    一、Activity的启动和结束

    例:

     二、Activity的生命周期

    生命周期

    1、onCreate

    2、onStart

    3、onResume

    4、onPause

    5、onStop

    6、onDestroy

    7、onRestart

    8、onNewIntent

    各状态之间的切换过程

    三、Activity的启动模式

     1、默认启动模式 standard

     2、栈顶复用模式 singleTop

    3、栈内复用模式 singleTask

    4、全局唯一模式 singleInstance

    四、启动模式的实际应用

    代码中启动标志的取值说明如下:

    在配置文件中指定启动模式

    1、在两个活动之间交替跳转

    例:

    2、登录成功后不再返回登录页面

    例:


    一、Activity的启动和结束

    从当前页面跳到新页面,跳转代码如下:

    startActivity(new Intent(源页面.this,目标页面.class));

    从当前页面回到上一页面,相当于关闭当前页面,返回代码如下:

    finish();//结束当前的活动页面

    例:

    两个activity,点击第一个activity的跳转按钮即可跳转到第二个activity,点击返回或完成即可回到第一个activity。

    第一个activity,java类

    1. public class ActStartActivity extends AppCompatActivity implements View.OnClickListener {
    2. @Override
    3. protected void onCreate(Bundle savedInstanceState) {
    4. super.onCreate(savedInstanceState);
    5. setContentView(R.layout.activity_act_start);
    6. findViewById(R.id.act_next).setOnClickListener(this);
    7. }
    8. @Override
    9. public void onClick(View view) {
    10. startActivity(new Intent(this,ActFinishActivity.class));
    11. }
    12. }

    xml文件

    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    2. xmlns:app="http://schemas.android.com/apk/res-auto"
    3. xmlns:tools="http://schemas.android.com/tools"
    4. android:layout_width="match_parent"
    5. android:layout_height="match_parent"
    6. android:orientation="vertical"
    7. android:gravity="center">
    8. <Button
    9. android:id="@+id/act_next"
    10. android:layout_width="wrap_content"
    11. android:layout_height="wrap_content"
    12. android:text="跳转"/>
    13. </LinearLayout>

    第二个activity,Java类

    1. public class ActFinishActivity extends AppCompatActivity implements View.OnClickListener{
    2. @Override
    3. protected void onCreate(Bundle savedInstanceState) {
    4. super.onCreate(savedInstanceState);
    5. setContentView(R.layout.activity_act_finish);
    6. findViewById(R.id.iv_back).setOnClickListener(this);
    7. findViewById(R.id.btn_finish).setOnClickListener(this);
    8. }
    9. @Override
    10. public void onClick(View v) {
    11. if(v.getId() == R.id.iv_back || v.getId() == R.id.btn_finish){
    12. finish();//结束当前页面
    13. }
    14. }
    15. }

    xml文件

    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    2. xmlns:app="http://schemas.android.com/apk/res-auto"
    3. xmlns:tools="http://schemas.android.com/tools"
    4. android:layout_width="match_parent"
    5. android:layout_height="match_parent"
    6. android:orientation="vertical">
    7. <ImageView
    8. android:id="@+id/iv_back"
    9. android:layout_width="40dp"
    10. android:layout_height="40dp"
    11. android:padding="5dp"
    12. android:src="@drawable/ic_back"/>
    13. <Button
    14. android:id="@+id/btn_finish"
    15. android:layout_width="match_parent"
    16. android:layout_height="wrap_content"
    17. android:gravity="center"
    18. android:text="完成"/>
    19. </LinearLayout>

     二、Activity的生命周期

    生命周期

    1、onCreate

    创建活动,把页面布局加载进内存,进入了初始状态。

    2、onStart

    开始活动,把活动页面显示在屏幕上,进入就绪状态。

    3、onResume

    恢复活动,活动页面进入活跃状态,能够与用户正常交互,例如允许相应用户的点击动作、允许用户输入文字等。

    4、onPause

    暂停活动,页面进入暂停状态,无法与用户正常交互。

    5、onStop

    停止活动,页面将不在屏幕显示。

    6、onDestroy

    销毁活动,回收活动占用的系统资源,把页面从内存中清除。

    7、onRestart

    重启活动,重新加载内存中的页面数据。

    8、onNewIntent

    重用已有的活动实例。

    各状态之间的切换过程

    打开新页面的方法调用顺序为:

    • onCreate -> onStart -> onResume

    关闭旧页面的方法调用顺序为:

    • onPause -> onStop -> onDestroy

    三、Activity的启动模式

    某个APP先后打开两个活动,此时活动栈的变动情况如下:

     依次结束已打开的两个活动,此时活动栈的变动情况如下:

     

     1、默认启动模式 standard

    不在manifest设定时,Activity的默认模式是standard,该模式下启动的Activity会依照启动顺序被依次压入Task栈中。

     2、栈顶复用模式 singleTop

    该模式下,如果栈顶Activity为我们要新建的Activity(目标Activity),那么就不会重复创建新的Activity。

     应用场景:适合开启渠道多、多应用开启调用的Activity,通过这种设置可以避免已经创建过的Activity被重复创建,多数通过动态设置使用。如:微信、支付宝等。

    3、栈内复用模式 singleTask

    与上一模式相似,只不过singleTop模式是只针对栈顶的元素,而singleTask模式下,如果task栈内存在目标Activity实例,则将task内的对应Activity实例之上的所有Activity弹出栈,并将对应Activity置于栈顶,获得焦点。

    例:下图,activity1跳转到2再跳转到3,再跳转到1时,将上面两个activity弹出,回到1。

     应用场景:

    • 程序主界面:主界面不希望被创建多次,而且在主界面退出的时候退出整个APP。
    • 耗费系统资源的activity:对于极其耗费系统资源的activity,可以考虑将其设为singleTask模式,减少资源耗费。

    4、全局唯一模式 singleInstance

    该模式下,会为目标Activity创建一个新的Task栈,将目标Activity放入新的Task,并让目标Activity获得焦点,新的Task有且只有这一个Activity实例。如果已经创建过目标Activity实例,则不会创建新的Task,而是将以前创建过的Activity唤醒。

    四、启动模式的实际应用

    启动模式可以在配置文件中配置,也可以在java代码中配置。

    接下来举两个例子阐述启动模式的实际应用:在两个活动之间交替跳转、登录成功后不再返回登录界面。

    代码中启动标志的取值说明如下:

    • Intent.FLAG_ACTIVITY_NEW_TASK:开辟一个新的任务栈
    • Intent.FLAG_ACTIVITY_SINGLE_TOP:当栈顶为待跳转的活动实例时,则重用栈顶的实例
    • Intent.FLAG_ACTIVITY_CLEAR_TOP:当栈中存在待跳转的活动实例时,则重新创建一个新实例,并清除原实例上方的所有实例。
    • Intent.FLAG_ACTIVITY_NO_HISTORY:栈中不保存新启动的活动实例。
    • Intent.FLAG_ACTIVITY_CLEAR_TASK:跳转到新页面时,栈中的原有实例都被清空。

    在配置文件中指定启动模式

     

    1、在两个活动之间交替跳转

    跳转流程:首页 -> 活动A ->活动B -> 活动A ->活动B -> 活动A ->活动B......

    然后再返回,正常的流程是这样的:.... -> 活动B -> 活动A-> 活动B -> 活动A.....

    要实现只返回一次页面:活动B -> 活动A -> 首页

    可以设置启动标志FLAG_ACTIVITY_CLEAR_TOP,即使活动栈里存在待跳转的活动实例,也会重新创建该活动的实例,并清除原实例上方的所有实例,保证栈中最多只有该活动的唯一实例,从而避免的重复返回。

    例:

    第一个页面java类

    1. public class activity_jump_first extends AppCompatActivity implements View.OnClickListener {
    2. @Override
    3. protected void onCreate(Bundle savedInstanceState) {
    4. super.onCreate(savedInstanceState);
    5. setContentView(R.layout.activity_jump_first);
    6. findViewById(R.id.btn_jump_second).setOnClickListener(this);
    7. }
    8. @Override
    9. public void onClick(View view) {
    10. //创建意图对象,准备跳到指定活动页面
    11. Intent intent = new Intent(this,activity_jump_second.class);
    12. //栈中存在待跳转的活动实例时,则重新创建该活动的实例,并清除原实例上方的所有实例
    13. intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    14. startActivity(intent);
    15. }
    16. }

    xml文件

    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    2. xmlns:app="http://schemas.android.com/apk/res-auto"
    3. xmlns:tools="http://schemas.android.com/tools"
    4. android:layout_width="match_parent"
    5. android:layout_height="match_parent"
    6. android:orientation="vertical">
    7. <Button
    8. android:id="@+id/btn_jump_second"
    9. android:layout_width="match_parent"
    10. android:layout_height="wrap_content"
    11. android:text="跳到第二个页面"/>
    12. </LinearLayout>

    第二个java类

    1. public class activity_jump_second extends AppCompatActivity implements View.OnClickListener {
    2. @Override
    3. protected void onCreate(Bundle savedInstanceState) {
    4. super.onCreate(savedInstanceState);
    5. setContentView(R.layout.activity_jump_second);
    6. findViewById(R.id.btn_jump_second).setOnClickListener(this);
    7. }
    8. @Override
    9. public void onClick(View view) {
    10. //创建意图对象,准备跳到指定活动页面
    11. Intent intent = new Intent(this,activity_jump_first.class);
    12. //栈中存在待跳转的活动实例时,则重新创建该活动的实例,并清除原实例上方的所有实例
    13. intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    14. startActivity(intent);
    15. }
    16. }

    xml文件

    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    2. xmlns:app="http://schemas.android.com/apk/res-auto"
    3. xmlns:tools="http://schemas.android.com/tools"
    4. android:layout_width="match_parent"
    5. android:layout_height="match_parent"
    6. android:orientation="vertical">
    7. <Button
    8. android:id="@+id/btn_jump_second"
    9. android:layout_width="match_parent"
    10. android:layout_height="wrap_content"
    11. android:text="跳到第二个页面"/>
    12. </LinearLayout>

    2、登录成功后不再返回登录页面

    可以设置启动标志FLAG_ACTIVITY_CLEAR_TASK,该标志会清空当前活动栈里的所有实例,全部清空后,当前栈没法继续使用,必须找另外个活动栈,也就是同时设置启动标志FLAG_ACTIVITY_NEW_TASK,该标志用于开辟新的活动栈。

    例:

    第一个java类

    1. public class activity_jump_first extends AppCompatActivity implements View.OnClickListener {
    2. @Override
    3. protected void onCreate(Bundle savedInstanceState) {
    4. super.onCreate(savedInstanceState);
    5. setContentView(R.layout.activity_jump_first);
    6. findViewById(R.id.btn_jump_success).setOnClickListener(this);
    7. }
    8. @Override
    9. public void onClick(View view) {
    10. //创建意图对象,准备跳到指定活动页面
    11. Intent intent = new Intent(this,activity_jump_second.class);
    12. //设置启动标志,跳转到新页面时,栈中的原有实例都被清空,同时开辟新活动栈
    13. // 运算符|:参加运算的两个对象只要有一个为1,其值为1.
    14. intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
    15. startActivity(intent);
    16. }
    17. }

    xml文件

    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    2. android:layout_width="match_parent"
    3. android:layout_height="match_parent"
    4. android:orientation="vertical">
    5. <TextView
    6. android:layout_width="wrap_content"
    7. android:layout_height="wrap_content"
    8. android:text="登录页面"/>
    9. <Button
    10. android:id="@+id/btn_jump_success"
    11. android:layout_width="match_parent"
    12. android:layout_height="wrap_content"
    13. android:gravity="center"
    14. android:text="跳到登录成功页面"/>
    15. </LinearLayout>

    第二个java类

    1. public class activity_jump_second extends AppCompatActivity{
    2. @Override
    3. protected void onCreate(Bundle savedInstanceState) {
    4. super.onCreate(savedInstanceState);
    5. setContentView(R.layout.activity_jump_second);
    6. }
    7. }

    xml文件

    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    2. android:layout_width="match_parent"
    3. android:layout_height="match_parent"
    4. android:orientation="vertical">
    5. <TextView
    6. android:layout_width="wrap_content"
    7. android:layout_height="wrap_content"
    8. android:text="登录成功页面,不会再返回登录页面"/>
    9. </LinearLayout>

  • 相关阅读:
    WPF之Button组件
    React-18(组件化开发) -- 插槽 Context的应用场景 setState(18之前与18的对比)
    java计算机毕业设计线上导医系统源程序+mysql+系统+lw文档+远程调试
    C++ 64位系统常见数据类型及大小 (Visual Studio && GCC x64)
    Linux Centos7 下使用yum安装的nginx平滑升级
    【业务功能篇112】maven 指定打包某个module子模块 打包命令参数
    C语言:static关键字的使用
    [算法2-数组与字符串的查找与匹配] (.NET源码学习)
    学习笔记|Pearson皮尔逊相关系数|Spearman斯皮尔曼相关系数|和Kendall肯德尔tau-b相关系数|分析流程|-SPSS中双变量相关性分析系数
    springboot毕设项目摄影跟拍预定管理系统808t0(java+VUE+Mybatis+Maven+Mysql)
  • 原文地址:https://blog.csdn.net/Tir_zhang/article/details/126917429