活动生命周期方法:onPostResume意义

时间:2017-02-07 17:00:14

标签: android android-activity android-lifecycle

关于Activity的官方文档列出了7种生命周期方法。

onPostResume()未被引用为生命周期方法。

但我觉得这种方法很重要。

在生命周期中,当活动从隐藏状态显示为显示状态时,

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()

5 个答案:

答案 0 :(得分:21)

onPostResume:

活动恢复完成后调用(活动的{@link #onResume}之后)       被称为)。应用程序通常不会实现此方法;       它适用于系统类在应用后进行最终设置       恢复代码已经运行。

它会做以下事情

  1. 它将确保用户可以看到屏幕并进行最终操作 为活动而设。

  2. 删除所有待处理的邮件帖子,其中包含代码“what”     该           消息队列。

  3. 检查所有片段是否已恢复并移动所有由其管理的片段     控制器的FragmentManager进入恢复状态。

  4. 执行由管理的片段的所有待处理操作               控制器的FragmentManager。

  5. 如果你检查它的生命周期老虎钳就像下面那样工作

    1. onResume() - 活动

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

    3. onPostResume() - 活动

答案 1 :(得分:5)

angular.module('MainViewController', []).controller('DashboardController', function ($scope,$http, DashboardService) { $scope.jobsData = []; DashboardService.getDashboardData().then(function (response) { if (!response) return; $scope.jobsData = response; }); $scope.getPagedDataAsync = function (pageSize, page) { setTimeout(function () { $scope.setPagingData($scope.jobsStatus, page, pageSize); }, 100); }; 主要用于希望在任何子类完成恢复后完成某种设置的系统操作。

它有用的两件事(可能会让你觉得它很重要)是之后执行的行动当应用程序保证对用户可见时(在onResume期间可能尚未显示)。

在查看来源时,方法名称可能会有些混乱,但如果您记录流程,您将看到会发生什么

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

    我会为任何未来的读者添加一个警告 - 如果你使用onPostResume来等待你的片段,调用一些get方法(例如),那么你就会有一个糟糕的,不可靠的设计。你应该从你的片段中获得一个回调模式,然后让片段"发送"准备好后将数据返回活动

答案 2 :(得分:0)

  

onPostResume()未被引用为生命周期方法。

     

但我觉得这种方法很重要。

很可能你的感觉是错的。而我对其原因的回答有点长而且有点抽象。

抽象(但重要)部分

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

  1. 在进行任何其他处理之前进行一些初始化
  2. 对事件进行实际处理,包括可自定义逻辑
  3. 完成所有可自定义处理后,请执行一些完成逻辑
  4. 现在假设您正在制作类似Activity类的东西 - 一个带有一些逻辑的基类,以及一个可能会继承很多的基类,可能具有深层次的继承。现在,您应该考虑在基类中逻辑的子类逻辑的哪些(何时)。这里最重要的部分是你希望你的子类将其附加逻辑放在第2步(即#1之后和#3之前)。您无法通过简单的虚拟方法轻松实现此目标,因为子类可以在调用super之后将其逻辑放在{3}之后,或者在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方法,除非你有充分的理由把它放在其中一个中,即你希望你的类也被子类化,并且你想确保一些执行顺序。

    还有几点值得注意:

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

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

    3. 可能是onPreXyzonPostXyz方法之一 如果您的案例不需要执行3步,则完全省略 分离和两步就足够了。这是Android中经常发生的事情:onPostXyz方法比onPreXyz更多,但AsyncTask似乎是一个以两者为特色的明显异常。

    4. 仔细查看Android (和onPostResume)

      因此,经过长时间的介绍,Android如何将这种方法用于onPostResume?如果您查看Activity.onPostResume处的代码,您会注意到它在基类中做的事情很少,而且与UI内容紧密相关,可能希望所有数据结构都完全就绪。这当然不是很令人惊讶。

      更有趣的是如何在子类中使用它。极少数覆盖之一是来自v4支持库的FragmentActivity,它提供了backported" Fragments"旧设备的功能。 FragmentActivity.onPostResume包含恢复子片段的逻辑。您可能会注意到,在标准Activity类中,恢复片段的类似逻辑会直接放在mInstrumentation.callActivityOnResume(this);onPostResume();调用之间的performResume方法中,因此它似乎是步骤的一部分我之前的抽象描述中的#3只是放入了调用者代码中。显然FragmentActivity无法向Activity.performResume添加任何新代码,以确保在活动恢复完成后执行该代码。因此,它将逻辑放入被覆盖的FragmentActivity.onPostResume,并以这种方式保留相同的语义,即在活动已经恢复之后应该恢复片段。另请注意,在ActivityFragmentActivity类中明确保留此语义的事实表明,这是更好的方式。因此,如果您的代码实际上使用了片段,那么 不会将 广泛的逻辑放入您的onPostResume或者可能发生的错误(不确定究竟是什么)

答案 3 :(得分:0)

在使用活动生命周期的日志和覆盖方法后,我得出以下结论:  如果你想在父活动中执行任何特定任务,在恢复片段后(加载片段后),这种方法非常有用....

我使用/尝试了以下代码片段来得出这个结论:

父活动中的

//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:reach_Startfragment  V / testPostResume:reach_postResume

我们可以清楚地看到在执行Fragment的onResume方法之后调用post resume。所以在调用/加载片段后,如果你想在活动中执行任何代码(加载片段后通过acivity执行任何任务)你可以这样做

我希望这可以澄清查询

答案 4 :(得分:0)

在回答您的问题之前,请谈谈onPostResume() 根据android

onPostResume()

在API级别1中添加

void onPostResume ()

activity简历完成后调用(after onResume() has been called)。 应用程序通常不会实现此方法;它适用于系统类在应用程序恢复代码运行后进行最终设置

因为他们说一旦活动恢复就会被召唤。因此,如果您想在恢复活动后执行某些操作,则可以使用此方法。但大多数情况下,我们会在onResume()中完成所有内容,例如开始动画,打开独占访问设备(例如相机)等等。一旦恢复活动onPostResumed()就会被调用。所以,你认为它与简历有什么不同吗?因为onPostResume()根据os活动已经恢复。对于onPause和onStop()。它们是不同的。它们是当一个活动进入后台但是当你不再对用户可见时尚未被杀死和调用的时候。因此,它们与onResume()onPostResume()不同。

现在在依赖onPostResume()之前,你应该阅读这两件事 至于developers.android 1 - 申请通常不会实施此方法;它适用于系统类在应用程序恢复代码运行后进行最终设置。 (但无论这意图如何,我们都可以将它用于我们的目的)。 2 - 检查link。他说onPostResume()不是总是调用。他的案子是针对片段的(当然他们是一个活动家)。 这是回复, 该问题已在API级别16和支持库rev 9中完全解决。 新方法" FragmentActivity.onResumeFragments()"应该使用。

所以他们中的一些人在依赖这种方法时遇到了问题,所以你可以理解。