Android四大组件--Activity
Activity概述
Activity是一个Android应用程序组件(也称为Android四大组件之一),它提供了一个屏幕,用户可以通过该屏幕进行交互以执行某些操作,例如拨打电话,拍照,发送电子邮件或查看地图。每个活动都有一个窗口,用于绘制其用户界面。窗口通常填满屏幕,但可能比屏幕小,并漂浮在其他窗口的顶部.
Android应用程序通常由多个彼此松散绑定的Activity组成。通常,应用程序中的一个Activity被指定为“主要”Activity,该Activity在首次启动应用程序时呈现给用户。然后,每个Activity可以启动另一个Activity以执行不同的操作。每次新Activity开始时,前一个Activity都会停止,但系统会将Activity保留在后台堆栈中(“后堆栈”)。当一个新的Activity开始时,它会被推到后面的堆栈上,并引起用户的注意。后栈遵循基本的“ 后进先出”堆栈机制,因此,当用户完成当前活动并按下"后退按钮"时,它从堆栈弹出(并销毁),之前的活动恢复。
创建Activity
要创建Activity,您必须创建Activity(或其现有子类)的子类。在子类中,您需要实现当Activity在其生命周期的各个状态之间转换时系统调用的回调方法,例如在创建,停止,恢复或销毁活动时。两个最重要的回调方法是:
public class ExampleActivity extends AppCompatActivity {
@Override
public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
//您必须实现此方法。系统在创建Activity时调用此方法。在您的实施中,您应该初始化Activity的基本组成部分。最重要的是,您必须在此处调用以定义Activity用户界面的布局。
setContentView();
}
//系统将此方法称为用户离开您的Activity的第一个指示(尽管并不总是意味着Activity正在被销毁)。这通常是您应该提交应该在当前用户会话之外保留的任何更改的地方(因为用户可能不会回来)。
@Override
protected void onPause() {
super.onPause();
//在此处应该提交应该在当前用户会话之外保留的任何更改的地方
}
}
manifest中注册(略)
启动Activity
您可以通过调用启动另一个Activity,通过startActivity()方法,并将Intent传递给您要启动的Activity。intent指定要启动的确切Activity或描述您要执行的操作类型(系统为您选择适当的活动,甚至可以来自不同的应用程序)。Intent(意图)还可以携带少量数据以供启动的活动使用。
- 显示意图
Intent intent = new Intent(this, SignInActivity.class);
startActivity(intent);
- 隐式意图
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);
startActivity(intent);
Activity完整声明周期回调方法
public class ExampleActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// The activity is being created.
}
@Override
protected void onStart() {
super.onStart();
// The activity is about to become visible.
}
@Override
protected void onResume() {
super.onResume();
// The activity has become visible (it is now "resumed").
}
@Override
protected void onPause() {
super.onPause();
// Another activity is taking focus (this activity is about to be "paused").
}
@Override
protected void onStop() {
super.onStop();
// The activity is no longer visible (it is now "stopped")
}
@Override
protected void onDestroy() {
super.onDestroy();
// The activity is about to be destroyed.
}
}
注意:在执行任何工作之前,以上这些生命周期方法的实现必须始终调用超类实现,如上面的示例所示。
Activity生命周期
![](https://img.haomeiwen.com/i11447161/b7feb4d1c0c73b7c.png)
Method | Desc | Killable | Next |
---|---|---|---|
onCreate | 在第一次创建活动时调用。这是您应该进行所有常规静态设置的地方 - 创建视图,将数据绑定到列表等等。如果捕获了该状态,则此方法将传递包含活动先前状态的Bundle对象 | NO | onStart |
onRestart | 在Activity停止后,再次启动之前调用。 | NO | onStart |
onStart | 在活动变得对用户可见之前调用。 | No | onResume()或onStop() |
onResume | 在活动开始与用户交互之前调用。此时,活动位于活动堆栈的顶部,用户输入转到活动堆栈。 | NO | onPause |
onPause | 当系统即将开始恢复另一个活动时调用。此方法通常用于将未保存的更改提交到持久数据,停止动画以及可能消耗CPU的其他事物,等等。它应该做很快的事情,因为下一个Activity在返回之前不会恢复。 | YES | onResume()或onStop() |
onStop | 当活动不再对用户可见时调用。这可能是因为它正在被销毁,或者是因为另一个活动(现有的或新的活动)已经恢复并且正在覆盖它。 | YES | onRestart()或onDestroy() |
onDestory | 在活动被销毁之前调用。这是活动将收到的最后一个电话。可以调用它,因为活动正在完成(有人调用finish()它),或者因为系统暂时销毁此活动实例以节省空间。您可以使用该isFinishing()方法区分这两种情况。 | YES | / |
其中Killable 表示系统是否可以在方法返回后随时终止托管Activity的进程,而不执行Activity代码的下一个回调方法.
因为onPause()是三个允许Killable after方法中第一个执行的,一旦活动被创建,onPause()是在回调过程中能够保证执行的最后一个方法,如果系统必须在紧急情况下恢复记忆,是会调用onPause()方法的,但是onStop()和onDestroy()可能不被调用。因此,您应该使用onPause()将关键的持久性数据(例如用户编辑)写入存储。而不是onStop()或onDestroy().
Activity状态保存
当Activity暂停或停止,该Activity的活动状态会被保持,因为Activity对象在暂停或停止时仍保留在内存中 - 有关其成员和当前状态的所有信息仍然存在。因此,Activity会默认保留用户在活动中所做的任何更改,以便当活动返回到前台时(当它“恢复”时),那些更改仍然存在。
但是,当系统销毁Activity以恢复内存时,Activity对象被破坏,因此系统不能完好无损地恢复它的活动状态。在这种情况下,您可以通过实施额外的回调方法来确保保留有关活动状态的重要信息,该方法允许您保存有关活动状态的信息:
onSaveInstanceState()
onSaveInstanceState() 在Activity受破坏之前,系统会自动调用。系统会传递一个Bundle对象,您可以使用诸如putString()和putInt()之类的方法将关于Activity的状态信息保存为名称 - 值的键值对.
然后,如果系统终止您的应用程序进程,系统将重新创建活动并将其Bundle传递给Activity的onCreate()和onRestoreInstanceState()。使用这些方法之一,您可以从中提取已保存的状态Bundle并恢复活动状态。如果没有要恢复的状态信息,则Bundle传递给您的是null(这是第一次创建活动时的情况)。
![](https://img.haomeiwen.com/i11447161/90e942ebb4902deb.png)
注意:onSaveInstanceState()在您的活动被销毁之前不能保证会被调用,因为在某些情况下不需要保存状态(例如当用户使用“ 返回”按钮离开您的活动时,因为用户是明确的关闭活动)。如果系统调用onSaveInstanceState(),则会在onPause()和onStop()之前执行.
再者就是,即使不执行任何操作并且未实现onSaveInstanceState(),只要Activity没有被销毁,Activity也会默认实现onSaveInstanceState()来恢复某些活动状态.例如EditText输入的文字,但前提是控件需要有android:id,否则不会默认保存状态.
onSaveInstanceState()常用场景
某些设备配置可能会在运行时更改(例如屏幕方向,键盘可用性和语言)。发生此类更改时,Android会重新创建正在运行的活动(系统调用onDestroy(),然后立即调用onCreate()).处理此类重新启动的最佳方法是使用onSaveInstanceState()和onRestoreInstanceState()(或onCreate())来保存和恢复Activity活动状态.
Activity启动方式
- standard 标准模式,每次都新建一个实例对象
- singleTop 如果在任务栈顶发现了相同的实例则重用,否则新建并压入栈顶
- singleTask 如果在任务栈中发现了相同的实例,将其上面的任务终止并移除,重用该实例。否则新建实例并入栈
- singleInstance 允许不同应用,进程线程等共用一个实例,无论从何应用调用该实例都重用
可以在AndroidManifest.xml中通过给<activity>标签指定android:launchMode属性来选择启动模式。
当activity是被从栈中恢复的时候会调用onNewIntent()方法