Activity
生命周期回调以包含日志记录语句。Activity
应用程序中的每个交互时的状态变化。Activity
用户行为或设备上的配置更改而意外重新创建的实例状态。复制项目
略
在MainActivity中实现回调
在该onCreate()
方法中,添加以下日志语句:
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
添加onStart生命周期
同理,实现onPause()
、onRestart()
、onResume()
、onStop()
和onDestroy()
生命周期回调。
运行
在 SecondActivity 中实现生命周期回调
package com.dingjiaxiong.twoactivities;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.MediaController;
import android.widget.TextView;
public class SecondActivity extends AppCompatActivity {
public static final String EXTRA_REPLY = "com.example.android.twoactivities.extra.REPLY";
private static final String LOG_TAG = "dingjiaxiong";
private EditText mReply;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
mReply = findViewById(R.id.editText_second);
Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
TextView textView = findViewById(R.id.text_message);
textView.setText(message);
}
@Override
protected void onStart() {
super.onStart();
Log.d(LOG_TAG, "onStart");
}
@Override
protected void onPause() {
super.onPause();
Log.d(LOG_TAG, "onPause");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(LOG_TAG, "onRestart");
}
@Override
protected void onResume() {
super.onResume();
Log.d(LOG_TAG, "onResume");
}
@Override
protected void onStop() {
super.onStop();
Log.d(LOG_TAG, "onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(LOG_TAG, "onDestroy");
}
public void returnReply(View view) {
String reply = mReply.getText().toString();
Intent replyIntent = new Intent();
replyIntent.putExtra(EXTRA_REPLY, reply);
setResult(RESULT_OK, replyIntent);
Log.d(LOG_TAG, "End SecondActivity");
finish();
}
}
运行应用程序,观察日志
根据系统资源和用户行为,Activity
您的应用程序中的每个资源都可能比您想象的更频繁地被破坏和重建。
每个状态都Activity
作为一组键/值对存储在 Bundle
称为Activity
实例状态的对象中。Bundle
系统在停止之前将默认状态信息保存到实例状态Activity
,并将其传递Bundle
给新Activity
实例进行恢复。
为了避免在Activity
意外销毁和重新创建数据时丢失数据,您需要实现该onSaveInstanceState()
方法。当有可能被销毁和重新创建时,系统会在您的Activity
(between onPause()
and )上调用此方法。onStop()``Activity
Activity
在当前应用会话期间,您保存在实例状态中的数据仅特定于此特定的此实例。当您停止并重新启动新的应用程序会话时,Activity
实例状态会丢失并Activity
恢复为其默认外观。
使用onSaveInstanceState()保存Activity实例状态
public class MainActivity extends AppCompatActivity {
// Class name for Log tag
private static final String LOG_TAG = "dingjiaxiong";
// Unique tag required for the intent extra
public static final String EXTRA_MESSAGE = "com.example.android.twoactivities.extra.MESSAGE";
// Unique tag for the intent reply
public static final int TEXT_REQUEST = 1;
// EditText view for the message
private EditText mMessageEditText;
// TextView for the reply header
private TextView mReplyHeadTextView;
// TextView for the reply body
private TextView mReplyTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
mMessageEditText = findViewById(R.id.editText_main);
mReplyHeadTextView = findViewById(R.id.text_header_reply);
mReplyTextView = findViewById(R.id.text_message_reply);
if (savedInstanceState != null) {
boolean isVisible = savedInstanceState.getBoolean("reply_visible");
if (isVisible) {
mReplyHeadTextView.setVisibility(View.VISIBLE);
mReplyTextView.setText(savedInstanceState.getString("reply_text"));
mReplyTextView.setVisibility(View.VISIBLE);
}
}
}
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
outState.putBoolean("reply_visible", true);
outState.putString("reply_text", mReplyTextView.getText().toString());
}
}
未保存和保存运行对比
未保存:在主Activity收到回复后,旋转屏幕
可以看出,屏幕旋转后,回复被破坏显示了。
而且可以从日志打印的生命周期明显看出,Activity是重新创建的。
设置了保存:
666,新知识get
Activity
迁移经过的一组状态,从它首次创建时开始,到 Android 系统为其回收资源时结束Activity
。Activity
在您的应用程序内部和外部从一个导航到另一个导航时,每个用户都会Activity
在生命周期中的状态之间移动Activity
。Activity
都有一个相应的回调方法,您可以在Activity
类中重写。onCreate()
, onStart()
, onPause()
, onRestart()
, onResume()
, onStop()
, onDestroy()
.Activity
转换到该状态时发生的行为。Activity
销毁并重新创建,就好像它是新的一样。Activity
状态在配置更改时保留,包括EditText
元素的当前值。对于所有其他数据,您必须自己明确保存该数据。Activity
实例状态。onSaveInstanceState()
Bundle
. 使用这些Bundle
方法将数据放入并从Bundle
.onCreate()
,这是首选方式,或onRestoreInstanceState()
。