在我之前的文章中 ,您了解了Intents使我们能够将消息从一个Android组件发送到另一个。 好吧,一种非常重要的组件是活动。
活动生命周期
活动是Android中的单个屏幕。 就像桌面应用程序中的窗口或Java程序中的框架一样。 通过“活动”,您可以将所有UI组件或小部件放在屏幕上。
重要的是要了解一个活动具有生命周期:也就是说,它可以处于几种不同的状态之一,具体取决于应用程序和用户交互所发生的情况。
生命周期方法
让我们更仔细地研究Android Activity的生命周期。 每次Activity状态更改时,都会在Activity类上调用以下生命周期方法之一。
onCreate()
:在首次初始化Activity时调用。 您需要实现此方法,才能对Activity进行任何初始化。
onStart()
:这是首次使Activity对用户可见,因为Activity准备进入前台成为交互式。 回调完成后,将调用onResume()
方法。
onResume()
:当活动进入此状态时,它开始与用户进行交互。 活动将在此状态下继续进行,直到碰巧从应用程序或活动中获取焦点(例如来电)。 发生这种情况时,将调用onPause()
方法。
onPause()
:此方法用于暂停当Activity处于暂停状态时不应发生的操作。 对此方法的调用指示用户正在离开应用程序。 例如,在音乐播放器应用程序中,来电将导致该应用程序转换为暂停状态。 这应该使当前正在播放的音乐静音或暂停。 当用户返回到应用程序时,将调用onResume()
方法。
onStop()
:当活动在应用程序中不再可见时,将调用此方法。 例如,当另一个活动已加载并且正在使设备全屏显示时,可能会发生这种情况。 调用此方法时,活动被称为处于停止状态。 在这种状态下,系统可以调用onRestart()
来恢复与Activity的交互性。 或者调用onDestroy()
方法销毁Activity。
onDestroy()
:在活动被销毁之前调用此方法。 当用户终止活动或由于系统正在临时销毁包含活动的进程以节省空间时,系统将调用此方法。 确保释放您的活动通过此方法创建的所有资源,否则您的应用程序将发生内存泄漏!
onRestart()
:活动被停止后重新启动时,将调用此方法。
开始活动
大多数用户与应用程序的交互都会导致活动的活动被更改。 因此,应用在其生命周期内会在“活动”之间多次转换。
当一个活动需要启动另一个活动时,有必要将活动链接在一起。 要启动活动,请使用startActivity()
或startActivityForResult()
。 无论哪种情况,您都必须传递一个Intent。
开始活动而没有预期的结果
如果新启动的Activity不需要返回结果,则使用startActivity()
。
以下代码段显示了如何使用此方法启动另一个Activity:
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
您还可以执行操作,例如将数据从一个活动传递到另一个活动。 在这种情况下,您当前的活动(调用活动)希望将数据传递给目标活动。 这是Intent派上用场的地方。 要了解有关使用Intent启动活动的信息,请查看我的上一篇文章 。
从结果开始活动
startActivityForResult()
用于启动另一个Activity,并期望从新启动的Activity中获取数据。 换句话说,当您要将结果从目标活动返回到调用活动时,请使用此方法,例如,如果目标活动正在模式对话框中收集一些用户信息。
您可以通过onActivityResult(int requestCode, int resultCode, Intent data)
方法从Activity接收结果。 结果将作为意图返回。
开始活动的例子
这是显示启动活动的工作方式的示例。
首先,使用onCreate()
方法,布局文件和请求代码创建MainActivity
。
public class MainActivity extends Activity {
// Unique request code for each use case
private static final int REQUEST_CODE_EXAMPLE = 0x9345;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
在onCreate()
方法中,您将创建一个意图的新实例以启动第二个Activity。
当您准备开始该活动时,说出对按钮单击的响应,您将调用startActivityForResult()
,它将传递新创建的意图和请求代码。
// Create a new instance of Intent to start SecondActivity
final Intent intent = new Intent(this, SecondActivity.class);
// This starts SecondActivity with the request code
startActivityForResult(intent, REQUEST_CODE_EXAMPLE);
尽管如此,在MainActivity
,您仍需要处理Activity结果事件。 您可以通过实现onActivityResult()
方法来实现。 这是您将从其他活动中接收结果的方式。
外观如下:
// onActivityResult only get called
// when the other Activity previously started using startActivityForResult
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// First we need to check if the requestCode matches the one we used.
if(requestCode == REQUEST_CODE_EXAMPLE) {
// The resultCode is set by the SecondActivity
// By convention RESULT_OK means that whatever
// SecondActivity did was executed successfully
if(resultCode == Activity.RESULT_OK) {
// Get the result from the returned Intent
final String result = data.getStringExtra(SecondActivity.EXTRA_DATA);
// Use the data - in this case, display it in a Toast.
Toast.makeText(this, "Result: " + result, Toast.LENGTH_LONG).show();
} else {
// setResult wasn't successfully executed by SecondActivity
// Due to some error or flow of control. No data to retrieve.
}
}
}
现在继续创建您的SecondActivity
。 它看起来应该类似于下面的代码。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
final Button button = (Button) findViewById(R.id.button);
// When this button is clicked we want to return a result
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Create a new Intent object as container for the result
final Intent data = new Intent();
// Add the required data to be returned to the MainActivity
data.putExtra(EXTRA_DATA, "Some interesting data!");
// Set the resultCode as Activity.RESULT_OK to
// indicate a success and attach the Intent
// which contains our result data
setResult(Activity.RESULT_OK, data);
// With finish() we close the SecondActivity to
// return back to MainActivity
finish();
}
});
}
终止活动
在Activity终止之前,将调用相应的生命周期方法。
onPause()
方法应停止所有侦听器和UI更新。 onStop()
方法应保存应用程序数据。 最后, onDestroy()
方法将释放活动已分配的所有资源。
当用户切换回已由系统终止的应用程序时,将调用onResume()
方法。 基于保存的数据,它可以重新注册侦听器并触发UI更新。
活动实例状态
活动需要一种方法来保持其获得的有价值的状态和用户数据。 这些数据可以从用户输入中获得,也可以在未显示“活动”时创建。
例如,设备方向的更改可能导致活动被破坏并重新创建。 在这种情况下,您需要确保在销毁所有“活动”状态之前将其保存,并在重新创建它时重新加载它。 否则,您的“活动”当时拥有的任何数据都可能会完全丢失。
要保存活动状态,您可以覆盖onSaveInstanceState()
方法。 该方法将Bundle
对象作为参数传递。 捆绑包可以包含字符串,原始数据类型或对象。 使用这种方法,只需将任何重要的状态数据添加到包中。 该捆绑包稍后将返回到“活动”,因此您可以恢复“活动”状态。
要从捆绑中提取保存的状态并进行恢复,请实现onRestoreInstanceState()
方法。 在onStart()
和onResume()
生命周期方法之间调用此回调。
在以后的文章中,我们将更深入地了解Activity实例状态。
结论
遵循本文之后,您将对Activity生命周期的工作方式有一个很好的了解。 您已经了解到有两种方法可以启动活动,以及获得一些指针来指示如何在活动生命周期中处理实例状态。
翻译自: https://code.tutsplus.com/tutorials/what-are-android-activities--cms-29518