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.

很可能你的感觉是错误的。我对为什么会这样的回答有点长而且有点抽象。

抽象(但重要)部分

通常,各种 onPreXyzonPostXyz(又名 onBeforeXyzonAfterXyz)方法是尝试使基础 class 对 sub 的扩展开放classes 但仍然保留了一些重要的行为方面。假设您正在设计自己的基础 class 并且您有一个生命周期事件 "Xyz" 并且您的默认处理行为如下:

  1. 在任何其他处理之前进行一些初始化
  2. 对事件进行实际处理,包括可自定义的逻辑
  3. 完成所有可自定义处理后,执行一些整理逻辑

现在假设您正在制作类似 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 并且你想确保一些执行顺序。

还有几点值得注意:

  1. 入口点方法 performXyzfinal(即非虚拟)。通过这种方式,您可以确保没有人可以覆盖它并破坏您的执行顺序执行逻辑。

  2. 基地class甚至可能离开onPreXyzonPostXyz 通过将其步骤 #1 和 #3 逻辑直接放入 performXyz 来清空方法。但是,如果基础 class 的设计者期望可能的深层继承层次结构,其中一些中间子 class,那将是许多其他更深层次子 class 的基础 class(例如 Layer supertype),可能需要相同的执行顺序执行功能,无论如何在基础 class 中提供此类方法是有意义的。

  3. onPreXyzonPostXyz 方法之一可能是 如果您的案例不需要三步执行,则完全省略 分离和两步就足够了。这是 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 已经恢复后应恢复片段的相同语义。另请注意,在 ActivityFragmentActivity classes 中明确保留此语义的事实表明,这是更好的方式。因此,如果您的代码实际上使用了片段,您最好 [=7​​5=] 不要将 大量逻辑放入 onPostResume 中,否则可能会发生一些不好的事情(不是确定到底是什么)。

onPostResume 主要保留给系统操作,这些操作希望在任何子类完成恢复后完成某种设置。

它有两个好处(这可能会让您觉得它很重要)用于执行操作您的嵌套片段也恢复后 当应用程序 保证 对用户可见时(在 onResume 期间它可能还不可见)。

在查看源代码时,方法名称可能有点令人困惑,但如果您记录流程,您会看到发生了什么

  1. Activity 恢复
  2. 片段简历
  3. onPostResume 在 Activity
  4. 中调用

我会为任何未来的读者添加一句警告 - 如果您使用 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} 完成后调用 被调用)。应用程序一般不会实现这个方法; 它旨在供系统 类 在应用后进行最终设置 简历代码有 运行.

它会做以下事情

  1. 它将确保屏幕对用户可见,并会做最后的处理 设置 activity.

  2. 删除所有待处理的代码为 'what' 的帖子 这 消息队列。

  3. 检查所有片段是否恢复并移动由以下人员管理的所有片段 controller的FragmentManager进入resume状态。

  4. 对由 控制器的 FragmentManager.

如果你检查它的生命周期,它的工作原理如下

  1. onResume() - Activity

  2. onResume() - 片段 check third point as explained above

  3. 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()”。

所以他们中的一些人在依赖这种方法时遇到了问题,所以这取决于您。