Android活动生命周期处理

Android活动生命周期处理,android,android-activity,activity-lifecycle,Android,Android Activity,Activity Lifecycle,我是android编程新手,我想澄清一下活动生命周期的概念 为了简单起见,我将案例缩短如下: 有2个活动(MainActivity和Main2Activity) 在MainActivity中,会创建一个按钮以打开Main2Activity 在Main2Activity中,为了模拟用户在显示Main2Activity后返回MainActivity,它调用finish()并在onCreate()中返回MainActivity 当点击按钮时,我发现似乎出现了竞速情况 MainActivity::

我是android编程新手,我想澄清一下活动生命周期的概念

为了简单起见,我将案例缩短如下:

  • 有2个活动(MainActivity和Main2Activity)

  • 在MainActivity中,会创建一个按钮以打开Main2Activity

  • 在Main2Activity中,为了模拟用户在显示Main2Activity后返回MainActivity,它调用finish()并在onCreate()中返回MainActivity

当点击按钮时,我发现似乎出现了竞速情况


  • MainActivity::onCreate()不确定解决方案是否正确,但请尝试一下

    关于Main2Activity.java

    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main2);
    
    // return to MainActivity
    
    new Handler().postDelayed(new Runnable() {
    
         @Override
         public void run() {
           Intent intent = new Intent(this, MainActivity.class);    
           startActivity(intent);
         }
    },5000);
    
    // finish self
    finish();
    }
    

    这将在5秒后调用StartTactivity。。这将给finish足够的时间调用整个生命周期

    不确定这是解决方案,但请尝试一下

    关于Main2Activity.java

    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main2);
    
    // return to MainActivity
    
    new Handler().postDelayed(new Runnable() {
    
         @Override
         public void run() {
           Intent intent = new Intent(this, MainActivity.class);    
           startActivity(intent);
         }
    },5000);
    
    // finish self
    finish();
    }
    

    这将在5秒后调用StartTactivity。。这将使finish有足够的时间调用整个生命周期

    您可以在第一个MainActivity实例上调用
    isFinishing()

    下面是此方法的示例

    这看起来像:

    if (isFinishing()) {
      //onDestroy() has not been called yet
    }
    else {
      //onDestroy() has been called already
    }
    

    您可以在第一个MainActivity实例上调用
    isFinishing()

    下面是此方法的示例

    这看起来像:

    if (isFinishing()) {
      //onDestroy() has not been called yet
    }
    else {
      //onDestroy() has been called already
    }
    

    问得好!你为什么认为这是个问题?(好吧,你对此无能为力,运行时会以自己的速度完成/销毁活动。这取决于Android版本和硬件以及其他因素,如当前有多少其他应用程序请求资源)我计划在活动被销毁时释放资源。如果不保证在创建同一活动的新实例之前调用onDestroy(),它将意外释放另一个实例正在使用的单例资源。问得好!你为什么认为这是个问题?(好吧,你对此无能为力,运行时会以自己的速度完成/销毁活动。这取决于Android版本和硬件以及其他因素,如当前有多少其他应用程序请求资源)我计划在活动被销毁时释放资源。如果不保证在创建同一活动的新实例之前调用onDestroy(),它将意外释放另一个实例正在使用的单例资源。否,
    isFinishing()
    不检查这一点。阅读链接到的文档。谢谢。我将尝试这种方法来检查onPause()中的isFinishing()值,如果为true,则释放资源。@MarcinOrlowski
    finish()
    在这里被显式调用。对该方法的调用最终将触发onDestroy()。有关详细信息,请参阅此答案:
    isFinishing()
    无法说明是否按照您的评论调用了
    onDestroy()
    。事实上,如果是,那么您的实例已经死了。不,这不是
    isFinishing()
    正在检查的。阅读链接到的文档。谢谢。我将尝试这种方法来检查onPause()中的isFinishing()值,如果为true,则释放资源。@MarcinOrlowski
    finish()
    在这里被显式调用。对该方法的调用最终将触发onDestroy()。有关详细信息,请参阅此答案:
    isFinishing()
    无法说明是否按照您的评论调用了
    onDestroy()
    。事实上,如果是的话,那么您的实例已经死了。对于竞争条件,使用延时方法似乎不是一个好的解决方案。无论如何,谢谢。对于比赛情况,使用延时方法似乎不是一个好的解决方案。无论如何,谢谢你。