四大组件---Activity
前言
就业前的学习补足吧,遥想半年前的后端职业梦,半年后却确定了客户端开发的offer,人生无常呀,记录下自己学习补足Android开发的过程,大家一起加油呀。
不是基础贴,所以很多简单的实践方面的东西都不会列出哦。
Activity
定义
一种可以包含用户界面的组件,主要用于和用户进行交互。通俗的来说,就是APP中我们看见的部分,直接操作的部分都是包含在Activity中的。
Activity的生命周期
返回栈
Android是使用任务(task)来管理Activity的,一个任务就是一组存放在栈里的Activity的集合,这个栈也被称作返回栈(back stack)。
栈是一种后进先出的数据结构,在默认情况下,每当我们启动了一个新的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 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的启动模式指定为singleTop,在启动Activity时如果发现返回栈的栈顶已经是该Activity,则认为可以直接使用它,不会再创建新的Activity实例。
栈内复用模式singleTask
当Activity的启动模式指定为singleTask,每次启动该Activity时,系统首先会在返回栈中检查是否存在该Activity的实例,如果发现已经存在则直接使用该实例,并把在这个Activity之上的所有其他Activity统统出栈,如果没有发现就会创建一个新的Activity实例。
单例模式singleInstance
当Activity的启动模式指定为singleInstance,会启用一个新的返回栈来管理这个Activity。
假设我们的程序中有一个Activity是允许其他程序调用的,如果想实现其他程序和我们的程序可以共享这个Activity的实例,就可以使用singleInstance模式。
在这种模式下,会有一个单独的返回栈来管理这个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
上一篇: 小程序遮罩层与弹出导航栏的通用实现
推荐阅读