Activity 生命周期方法:onPostResume 意义
Activity life cycle methods : onPostResume significance
官方文档Activity列出了7种生命周期方法。
onPostResume()
未被引用为生命周期方法。
但我觉得这个方法很重要。
在生命周期中,当一个activity从隐藏状态变为可见状态时,
onRestart()
onStart()
onResume()
onPostResume()
已按顺序调用。
我的代码片段:
package ravindra.projects.my_app_1;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.PersistableBundle;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private EditText txtUserName;
private EditText txtPassword;
Button loginButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("Ravi","Main OnCreate");
txtUserName=(EditText) findViewById(R.id.username);
txtPassword=(EditText) findViewById(R.id.password);
loginButton = (Button) findViewById(R.id.login);
loginButton.setOnClickListener(this);
}
@Override
public void onClick(View view) {
Log.d("Ravi", "Login processing initiated");
Intent intent = new Intent(this,LoginActivity.class);
Bundle bundle = new Bundle();
bundle.putString("userName",txtUserName.getText().toString());
bundle.putString("password",txtPassword.getText().toString());
intent.putExtras(bundle);
startActivityForResult(intent,1);
// IntentFilter
}
public void onActivityResult(int requestCode, int resultCode, Intent resIntent){
Log.d("Ravi back result:", "start");
String result = resIntent.getStringExtra("result");
Log.d("Ravi back result:", result);
TextView txtView = (TextView)findViewById(R.id.txtView);
txtView.setText(result);
}
@Override
protected void onStart() {
super.onStart();
Log.d("Ravi","Main Start");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d("Ravi","Main ReStart");
}
@Override
protected void onPause() {
super.onPause();
Log.d("Ravi","Main Pause");
}
@Override
protected void onResume() {
super.onResume();
Log.d("Ravi","Main Resume");
}
@Override
protected void onStop() {
super.onStop();
Log.d("Ravi","Main Stop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("Ravi","Main OnDestroy");
}
@Override
protected void onPostResume() {
super.onPostResume();
Log.d("Ravi","Main PostResume");
}
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}
}
通过跳过以下方法来实现 onPostResume()
不能达到目的吗?
onRestart(), onStart(), onResume()
如果我实现onPostResume()
,实现这三个方法有什么好处?
onRestart(), onStart(), onResume()
onPostResume()
was not quoted as life cycle method.
But I feel that this method is important method.
很可能你的感觉是错误的。我对为什么会这样的回答有点长而且有点抽象。
抽象(但重要)部分
通常,各种 onPreXyz
和 onPostXyz
(又名 onBeforeXyz
和 onAfterXyz
)方法是尝试使基础 class 对 sub 的扩展开放classes 但仍然保留了一些重要的行为方面。假设您正在设计自己的基础 class 并且您有一个生命周期事件 "Xyz" 并且您的默认处理行为如下:
- 在任何其他处理之前进行一些初始化
- 对事件进行实际处理,包括可自定义的逻辑
- 完成所有可自定义处理后,执行一些整理逻辑
现在假设您正在制作类似 Activity
class 的东西 - 一个具有一些逻辑位的基础 class 以及将大量继承的基础,可能具有很深的层次结构的继承。现在您应该考虑在您的基础 class 中的逻辑将在何处(何时)执行子 classes 逻辑。这里重要的棘手部分是您希望您的子 classes 将他们的附加逻辑放在步骤 #2 周围(即在 #1 之后和 #3 之前)。你不能用简单的虚拟方法轻松实现这个目标,因为 subclass 可以在调用后将它们的逻辑放在 #3 之后的 super
或者(很少)在 super
调用之前,即之前#1。那你会怎么做? Template method pattern 来救援。您按照以下方式组织您的代码
class Activity {
public final void performXyz(XyzEventData eventData) {
onPreXyz(eventData);
onXyz(eventData);
onPostXyz(eventData);
}
protected void onPreXyz(XyzEventData eventData) {
// put you logic from step #1 here
}
protected void onXyz(XyzEventData eventData) {
// put you logic from step #2 here
}
protected void onPostXyz(XyzEventData eventData) {
// put you logic from step #3 here
}
}
所以你有一个外部入口点 performXyz
,当 Xyz 事件发生时,无论上下文生成生命周期事件,它都会调用它,并且它在内部将事件分派给 3 个不同的方法,强制执行一些执行顺序。通常,您将所有代码放在 "main" onXyz
方法中的子 classes 中,除非您有充分的理由将其放在其他两个方法之一中,即您希望 class 也被 subclassed 并且你想确保一些执行顺序。
还有几点值得注意:
入口点方法 performXyz
是 final
(即非虚拟)。通过这种方式,您可以确保没有人可以覆盖它并破坏您的执行顺序执行逻辑。
基地class甚至可能离开onPreXyz
和onPostXyz
通过将其步骤 #1 和 #3 逻辑直接放入 performXyz
来清空方法。但是,如果基础 class 的设计者期望可能的深层继承层次结构,其中一些中间子 class,那将是许多其他更深层次子 class 的基础 class(例如 Layer supertype),可能需要相同的执行顺序执行功能,无论如何在基础 class 中提供此类方法是有意义的。
onPreXyz
或 onPostXyz
方法之一可能是
如果您的案例不需要三步执行,则完全省略
分离和两步就足够了。这是 Android 中经常发生的事情:onPostXyz
方法比 onPreXyz
多得多,但 AsyncTask
似乎是一个明显的例外,同时具有这两种方法。
仔细查看 Android(和 onPostResume)
经过这么长的介绍,Android 如何将这种方法用于 onPostResume
?如果您查看 Activity.onPostResume
处的代码,您会注意到它在基础 class 和与 UI 密切相关的代码中做的事情很少,并且可能期望所有数据-结构要完全准备好。这当然不足为奇。
更有趣的是它在子classes中是如何使用的。极少数覆盖之一是 v4 支持库中的 FragmentActivity
,它为旧设备提供向后移植的 "Fragments" 功能。 mInstrumentation.callActivityOnResume(this);
和 onPostResume();
调用之间的 FragmentActivity.onPostResume
contains logic to resume child fragments. You may notice that in the standard Activity
class similar logic to resume fragments is put directly into performResume
方法,因此它似乎是我之前放入调用方代码的抽象描述中步骤 #3 的一部分。很明显FragmentActivity
不能往Activity.performResume
里面放任何新的代码来保证activity的resume完成后它会被执行。因此,它将逻辑置于被覆盖的 FragmentActivity.onPostResume
中,并以这种方式保留了在 activity 已经恢复后应恢复片段的相同语义。另请注意,在 Activity
和 FragmentActivity
classes 中明确保留此语义的事实表明,这是更好的方式。因此,如果您的代码实际上使用了片段,您最好 [=75=] 不要将 大量逻辑放入 onPostResume
中,否则可能会发生一些不好的事情(不是确定到底是什么)。
onPostResume
主要保留给系统操作,这些操作希望在任何子类完成恢复后完成某种设置。
它有两个好处(这可能会让您觉得它很重要)用于执行操作在您的嵌套片段也恢复后和 当应用程序 保证 对用户可见时(在 onResume 期间它可能还不可见)。
在查看源代码时,方法名称可能有点令人困惑,但如果您记录流程,您会看到发生了什么
- Activity 恢复
- 片段简历
- onPostResume 在 Activity
中调用
我会为任何未来的读者添加一句警告 - 如果您使用 onPostResume 来等待您的片段,调用一些 get 方法(例如),那么您的设计很糟糕,不可靠。相反,您应该从片段中获得回调模式,并在片段 "send" 准备就绪时将数据返回给 activity
在使用 activity 生命周期的日志和覆盖方法后,我得出以下结论:
如果您想在恢复片段后(加载片段后)执行父 activity 中的任何特定任务,此方法将非常有用....
我 used/tried 以下代码片段得出了这个结论:
在父 activity 中:
//postResumemethod
@Override
protected void onPostResume() {
super.onPostResume();
Log.v("testPostResume","reached_postResume") ;
}
In called Fragment :
//On ResumeMethod
@Override
public void onResume() {
super.onResume();
Log.v("testStartFragment","reached_Startfragment") ;
}
这是我的日志:
V/testStartFragment: reached_Startfragment
V/testPostResume: reached_postResume
我们可以清楚的看到postresume是在Fragment的onResume方法执行完之后调用的。因此,在 calling/loading 片段之后,如果您想执行 activity 中的任何代码(加载片段后通过活动执行的任何任务),您可以这样做
我希望这能澄清问题
onPostResume :
在 activity 恢复完成时调用(在 activity 的 {@link #onResume} 完成后调用
被调用)。应用程序一般不会实现这个方法;
它旨在供系统 类 在应用后进行最终设置
简历代码有 运行.
它会做以下事情
它将确保屏幕对用户可见,并会做最后的处理
设置 activity.
删除所有待处理的代码为 'what' 的帖子
这
消息队列。
检查所有片段是否恢复并移动由以下人员管理的所有片段
controller的FragmentManager进入resume状态。
对由
控制器的 FragmentManager.
如果你检查它的生命周期,它的工作原理如下
onResume() - Activity
onResume() - 片段 check third point as explained above
onPostResume() - Activity
在回答你的问题之前让我们谈谈onPostResume()
根据android
onPostResume()
已添加到 API 级别 1
void onPostResume ()
在 activity
简历完成时调用 (after onResume() has been called
)。 应用程序一般不会实现这个方法;它旨在供系统 类 在应用程序恢复代码具有 运行.
后进行最终设置
正如他们所说,一旦 activity 恢复,它就会被调用。所以如果你想在 activity 恢复后做一些事情,你可以使用这个方法。但是 mos 我们只做 onResume()
中的所有事情,比如开始动画、打开独占访问设备(例如相机)等,所以一旦 Activity 恢复 [=16= 】 接到电话。所以你不认为它与简历上的不同吗?因为在 onPostResume() 中,根据 os activity 对于 onPause 和 onStop() 已经是 resumed.And。它们是不同的。它们是当 activity 进入后台但尚未(尚未)被杀死并在您不再对用户可见时被调用。所以它们不同于 onResume()
和 onPostResume()
.
现在在依赖 onPostResume() 之前你应该阅读这两件事
据 developers.android
1 - 应用程序一般不会实现这个方法;它旨在供系统 类 在应用程序恢复代码具有 运行 后进行最终设置。
(但我们可以将它用于我们的 purose,无论其意图是什么)。
2 - 检查此 link 。他说 onPostResume() 不是 ALWAYS 调用的。他的案子是为了碎片(当然他们是在一个 activity 男人身上)。
这是回复,
该问题已在 API 级别 16 和支持库版本 9 中完全解决。
应使用新方法“FragmentActivity.onResumeFragments()
”。
所以他们中的一些人在依赖这种方法时遇到了问题,所以这取决于您。
官方文档Activity列出了7种生命周期方法。
onPostResume()
未被引用为生命周期方法。
但我觉得这个方法很重要。
在生命周期中,当一个activity从隐藏状态变为可见状态时,
onRestart()
onStart()
onResume()
onPostResume()
已按顺序调用。
我的代码片段:
package ravindra.projects.my_app_1;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.PersistableBundle;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private EditText txtUserName;
private EditText txtPassword;
Button loginButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("Ravi","Main OnCreate");
txtUserName=(EditText) findViewById(R.id.username);
txtPassword=(EditText) findViewById(R.id.password);
loginButton = (Button) findViewById(R.id.login);
loginButton.setOnClickListener(this);
}
@Override
public void onClick(View view) {
Log.d("Ravi", "Login processing initiated");
Intent intent = new Intent(this,LoginActivity.class);
Bundle bundle = new Bundle();
bundle.putString("userName",txtUserName.getText().toString());
bundle.putString("password",txtPassword.getText().toString());
intent.putExtras(bundle);
startActivityForResult(intent,1);
// IntentFilter
}
public void onActivityResult(int requestCode, int resultCode, Intent resIntent){
Log.d("Ravi back result:", "start");
String result = resIntent.getStringExtra("result");
Log.d("Ravi back result:", result);
TextView txtView = (TextView)findViewById(R.id.txtView);
txtView.setText(result);
}
@Override
protected void onStart() {
super.onStart();
Log.d("Ravi","Main Start");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d("Ravi","Main ReStart");
}
@Override
protected void onPause() {
super.onPause();
Log.d("Ravi","Main Pause");
}
@Override
protected void onResume() {
super.onResume();
Log.d("Ravi","Main Resume");
}
@Override
protected void onStop() {
super.onStop();
Log.d("Ravi","Main Stop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("Ravi","Main OnDestroy");
}
@Override
protected void onPostResume() {
super.onPostResume();
Log.d("Ravi","Main PostResume");
}
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}
}
通过跳过以下方法来实现 onPostResume()
不能达到目的吗?
onRestart(), onStart(), onResume()
如果我实现onPostResume()
,实现这三个方法有什么好处?
onRestart(), onStart(), onResume()
onPostResume()
was not quoted as life cycle method.But I feel that this method is important method.
很可能你的感觉是错误的。我对为什么会这样的回答有点长而且有点抽象。
抽象(但重要)部分
通常,各种 onPreXyz
和 onPostXyz
(又名 onBeforeXyz
和 onAfterXyz
)方法是尝试使基础 class 对 sub 的扩展开放classes 但仍然保留了一些重要的行为方面。假设您正在设计自己的基础 class 并且您有一个生命周期事件 "Xyz" 并且您的默认处理行为如下:
- 在任何其他处理之前进行一些初始化
- 对事件进行实际处理,包括可自定义的逻辑
- 完成所有可自定义处理后,执行一些整理逻辑
现在假设您正在制作类似 Activity
class 的东西 - 一个具有一些逻辑位的基础 class 以及将大量继承的基础,可能具有很深的层次结构的继承。现在您应该考虑在您的基础 class 中的逻辑将在何处(何时)执行子 classes 逻辑。这里重要的棘手部分是您希望您的子 classes 将他们的附加逻辑放在步骤 #2 周围(即在 #1 之后和 #3 之前)。你不能用简单的虚拟方法轻松实现这个目标,因为 subclass 可以在调用后将它们的逻辑放在 #3 之后的 super
或者(很少)在 super
调用之前,即之前#1。那你会怎么做? Template method pattern 来救援。您按照以下方式组织您的代码
class Activity {
public final void performXyz(XyzEventData eventData) {
onPreXyz(eventData);
onXyz(eventData);
onPostXyz(eventData);
}
protected void onPreXyz(XyzEventData eventData) {
// put you logic from step #1 here
}
protected void onXyz(XyzEventData eventData) {
// put you logic from step #2 here
}
protected void onPostXyz(XyzEventData eventData) {
// put you logic from step #3 here
}
}
所以你有一个外部入口点 performXyz
,当 Xyz 事件发生时,无论上下文生成生命周期事件,它都会调用它,并且它在内部将事件分派给 3 个不同的方法,强制执行一些执行顺序。通常,您将所有代码放在 "main" onXyz
方法中的子 classes 中,除非您有充分的理由将其放在其他两个方法之一中,即您希望 class 也被 subclassed 并且你想确保一些执行顺序。
还有几点值得注意:
入口点方法
performXyz
是final
(即非虚拟)。通过这种方式,您可以确保没有人可以覆盖它并破坏您的执行顺序执行逻辑。基地class甚至可能离开
onPreXyz
和onPostXyz
通过将其步骤 #1 和 #3 逻辑直接放入performXyz
来清空方法。但是,如果基础 class 的设计者期望可能的深层继承层次结构,其中一些中间子 class,那将是许多其他更深层次子 class 的基础 class(例如 Layer supertype),可能需要相同的执行顺序执行功能,无论如何在基础 class 中提供此类方法是有意义的。onPreXyz
或onPostXyz
方法之一可能是 如果您的案例不需要三步执行,则完全省略 分离和两步就足够了。这是 Android 中经常发生的事情:onPostXyz
方法比onPreXyz
多得多,但AsyncTask
似乎是一个明显的例外,同时具有这两种方法。
仔细查看 Android(和 onPostResume)
经过这么长的介绍,Android 如何将这种方法用于 onPostResume
?如果您查看 Activity.onPostResume
处的代码,您会注意到它在基础 class 和与 UI 密切相关的代码中做的事情很少,并且可能期望所有数据-结构要完全准备好。这当然不足为奇。
更有趣的是它在子classes中是如何使用的。极少数覆盖之一是 v4 支持库中的 FragmentActivity
,它为旧设备提供向后移植的 "Fragments" 功能。 mInstrumentation.callActivityOnResume(this);
和 onPostResume();
调用之间的 FragmentActivity.onPostResume
contains logic to resume child fragments. You may notice that in the standard Activity
class similar logic to resume fragments is put directly into performResume
方法,因此它似乎是我之前放入调用方代码的抽象描述中步骤 #3 的一部分。很明显FragmentActivity
不能往Activity.performResume
里面放任何新的代码来保证activity的resume完成后它会被执行。因此,它将逻辑置于被覆盖的 FragmentActivity.onPostResume
中,并以这种方式保留了在 activity 已经恢复后应恢复片段的相同语义。另请注意,在 Activity
和 FragmentActivity
classes 中明确保留此语义的事实表明,这是更好的方式。因此,如果您的代码实际上使用了片段,您最好 [=75=] 不要将 大量逻辑放入 onPostResume
中,否则可能会发生一些不好的事情(不是确定到底是什么)。
onPostResume
主要保留给系统操作,这些操作希望在任何子类完成恢复后完成某种设置。
它有两个好处(这可能会让您觉得它很重要)用于执行操作在您的嵌套片段也恢复后和 当应用程序 保证 对用户可见时(在 onResume 期间它可能还不可见)。
在查看源代码时,方法名称可能有点令人困惑,但如果您记录流程,您会看到发生了什么
- Activity 恢复
- 片段简历
- onPostResume 在 Activity 中调用
我会为任何未来的读者添加一句警告 - 如果您使用 onPostResume 来等待您的片段,调用一些 get 方法(例如),那么您的设计很糟糕,不可靠。相反,您应该从片段中获得回调模式,并在片段 "send" 准备就绪时将数据返回给 activity
在使用 activity 生命周期的日志和覆盖方法后,我得出以下结论: 如果您想在恢复片段后(加载片段后)执行父 activity 中的任何特定任务,此方法将非常有用....
我 used/tried 以下代码片段得出了这个结论:
在父 activity 中:
//postResumemethod
@Override
protected void onPostResume() {
super.onPostResume();
Log.v("testPostResume","reached_postResume") ;
}
In called Fragment :
//On ResumeMethod
@Override
public void onResume() {
super.onResume();
Log.v("testStartFragment","reached_Startfragment") ;
}
这是我的日志: V/testStartFragment: reached_Startfragment V/testPostResume: reached_postResume
我们可以清楚的看到postresume是在Fragment的onResume方法执行完之后调用的。因此,在 calling/loading 片段之后,如果您想执行 activity 中的任何代码(加载片段后通过活动执行的任何任务),您可以这样做
我希望这能澄清问题
onPostResume :
在 activity 恢复完成时调用(在 activity 的 {@link #onResume} 完成后调用 被调用)。应用程序一般不会实现这个方法; 它旨在供系统 类 在应用后进行最终设置 简历代码有 运行.
它会做以下事情
它将确保屏幕对用户可见,并会做最后的处理 设置 activity.
删除所有待处理的代码为 'what' 的帖子 这 消息队列。
检查所有片段是否恢复并移动由以下人员管理的所有片段 controller的FragmentManager进入resume状态。
对由 控制器的 FragmentManager.
如果你检查它的生命周期,它的工作原理如下
onResume() - Activity
onResume() - 片段
check third point as explained above
onPostResume() - Activity
在回答你的问题之前让我们谈谈onPostResume()
根据android
onPostResume()
已添加到 API 级别 1
void onPostResume ()
在 activity
简历完成时调用 (after onResume() has been called
)。 应用程序一般不会实现这个方法;它旨在供系统 类 在应用程序恢复代码具有 运行.
正如他们所说,一旦 activity 恢复,它就会被调用。所以如果你想在 activity 恢复后做一些事情,你可以使用这个方法。但是 mos 我们只做 onResume()
中的所有事情,比如开始动画、打开独占访问设备(例如相机)等,所以一旦 Activity 恢复 [=16= 】 接到电话。所以你不认为它与简历上的不同吗?因为在 onPostResume() 中,根据 os activity 对于 onPause 和 onStop() 已经是 resumed.And。它们是不同的。它们是当 activity 进入后台但尚未(尚未)被杀死并在您不再对用户可见时被调用。所以它们不同于 onResume()
和 onPostResume()
.
现在在依赖 onPostResume() 之前你应该阅读这两件事
据 developers.android
1 - 应用程序一般不会实现这个方法;它旨在供系统 类 在应用程序恢复代码具有 运行 后进行最终设置。
(但我们可以将它用于我们的 purose,无论其意图是什么)。
2 - 检查此 link 。他说 onPostResume() 不是 ALWAYS 调用的。他的案子是为了碎片(当然他们是在一个 activity 男人身上)。
这是回复,
该问题已在 API 级别 16 和支持库版本 9 中完全解决。
应使用新方法“FragmentActivity.onResumeFragments()
”。
所以他们中的一些人在依赖这种方法时遇到了问题,所以这取决于您。