欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

四大组件---Activity

程序员文章站 2022-07-04 08:28:36
前言就业前的学习补足吧,遥想半年前的后端职业梦,半年后却确定了客户端开发的offer,人生无常呀,记录下自己学习补足Android开发的过程,大家一起加油呀。不是基础贴,所以很多简单的实践方面的东西都不会列出哦。Activity定义一种可以包含用户界面的组件,主要用于和用户进行交互。通俗的来说,就是APP中我们看见的部分,直接操作的部分都是包含在Activity中的。Activity的生命周期返回栈Android是使用任务(task)来管理Activity的,一个任务就是一组存放在栈里的...

前言

就业前的学习补足吧,遥想半年前的后端职业梦,半年后却确定了客户端开发的offer,人生无常呀,记录下自己学习补足Android开发的过程,大家一起加油呀。

不是基础贴,所以很多简单的实践方面的东西都不会列出哦。

Activity

定义

一种可以包含用户界面的组件,主要用于和用户进行交互。通俗的来说,就是APP中我们看见的部分,直接操作的部分都是包含在Activity中的。

Activity的生命周期

返回栈

Android是使用任务(task)来管理Activity的,一个任务就是一组存放在栈里的Activity的集合,这个栈也被称作返回栈(back stack)。

四大组件---Activity

栈是一种后进先出的数据结构,在默认情况下,每当我们启动了一个新的Activity,它就会在返回栈中入栈,并处于栈顶的位置。而每当我们按下Back键或调用finish()方法去销毁一个Activity时,处于栈顶的Activity就会出栈,前一个入栈的Activity就会重新处于栈顶的位置。

系统总是会显示处于栈顶的Activity给用户。

生命周期

  • onCreate() 这个方法在Activity第一次被创建的时候调用。

  • onStart() 这个方法在Activity由不可见变为可见的时候调用。

  • onResume() 这个方法在Activity准备好和用户进行交互的时候调用。

  • onPause() 这个方法在系统准备去启动或者恢复另一个Activity的时候调用。

  • onStop() 这个方法在Activity完全不可见的时候调用。

  • onDestroy() 这个方法在Activity被销毁之前调用。

  • onRestart() 这个方法在Activity由停止状态变为运行状态之前调用,也就是Activity被重新启动了。

四大组件---Activity

四大组件---Activity

常见的生命周期调用场景

四大组件---Activity

Activity被回收了怎么办

当一个Activity进入暂停状态时,是有机会被系统进行回收的,例如:

有一个Activity A,用户在Activity的基础上打开了Activity B,此时系统内存不足,对ActivityA进行了回收,此时我们按back键回到Activity A时会出现什么情况呢?

Activity A还是会正常显示,因为此时Activity又被重新创建了一次,执行了onCreate()方法而不是执行onRestart(),很好理解吧,因为它没有了,所以是重新创建,但是问题就出来了,我们的Activity A很可能保存了我们的操作数据,在重新进行创建的时候这些信息丢失了,我们应该怎么做呢?

答案是我们对Activity的onSaveInstanceState()回调方法进行重写,这个方法可以保证在Activity被回收前进行调用。

onSaveInstanceState()方法携带了一个Bundle类型的参数,Bundle提供了一系列方法用于存储数据。

  @Override protected void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        String x = "数据";
        outState.putString("x",x);
    }

我们对数据进行了保存,就一定有取出的过程,所以我们需要在onCreate()方法中进行取出,我们看onCreate()方法中参数Bundle savedInstanceState,我们可以从中取出。

 if (savedInstanceState != null){
            String data = savedInstanceState.getString("x");

        }

Activity的启动模式

通过android:launchMode="?"进行设置。

标准模式standard

standard是Activity默认的启动模式,在不进行显式指定的情况下,所有Activity都会自动使用这种启动模式。

在standard模式下,每当启动一个新的Activity,它就会在返回栈中入栈,并处于栈顶的位置。

对于使用standard模式的Activity,系统不会在乎这个Activity是否已经在返回栈中存在,每次启动都会创建一个该Activity的新实例。

四大组件---Activity

栈顶复用模式

当Activity的启动模式指定为singleTop,在启动Activity时如果发现返回栈的栈顶已经是该Activity,则认为可以直接使用它,不会再创建新的Activity实例。
四大组件---Activity

栈内复用模式singleTask

当Activity的启动模式指定为singleTask,每次启动该Activity时,系统首先会在返回栈中检查是否存在该Activity的实例,如果发现已经存在则直接使用该实例,并把在这个Activity之上的所有其他Activity统统出栈,如果没有发现就会创建一个新的Activity实例。

四大组件---Activity

单例模式singleInstance

当Activity的启动模式指定为singleInstance,会启用一个新的返回栈来管理这个Activity。

假设我们的程序中有一个Activity是允许其他程序调用的,如果想实现其他程序和我们的程序可以共享这个Activity的实例,就可以使用singleInstance模式。

在这种模式下,会有一个单独的返回栈来管理这个Activity,不管是哪个应用程序来访问这个Activity,都共用的同一个返回栈,也就解决了共享Activity实例的问题。
四大组件---Activity

四种启动模式的区别

四大组件---Activity

Activity间的交互

显式 Intent

 Intent intent = new Intent(this,MainActivity.class);
 startActivity(intent);

隐式Intent

 <activity android:name=".MainActivity"
        android:launchMode="standard">
      <intent-filter>
        <action android:name="com.example.activity.start"/>
        <category android:name="android.intent.category.DEFAULT"/>
      </intent-filter>
    </activity>
Intent intent = new Intent("com.example.activity.start");
startActivity(intent);

隐式Intent的应用还有很多,包括匹配规则也没有总结出来,大家有兴趣的可以单独去查找。

向下一个Activity传递数据和接受返回数据

可以通过Intent存储信息,返回信息时可以采用以下方法:
采用onStartActivityForResult()启动新的Activity;然后在新的Activity中定义:

Intent intent = new Intent();
intent.putExtra("return","hello")
setResult(RESULT_OK,intent);

通过重写接受返回数据的Activity中的onActivityResult()方法:

/**
     * Dispatch incoming result to the correct fragment.
     */
    @Override protected void onActivityResult(int requestCode, int resultCode,
        @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    }

就可以接收信息了。

总结

第一次系统的开始写博客,有很多细节都没有注意呀,希望自己可以越来越清晰吧,加油!

本文地址:https://blog.csdn.net/qq_40959750/article/details/108853164