如何检查android是不是要重新创建活动或销毁?

Posted

技术标签:

【中文标题】如何检查android是不是要重新创建活动或销毁?【英文标题】:how to check if android going to recreate activity or destroy?如何检查android是否要重新创建活动或销毁? 【发布时间】:2019-11-23 08:59:54 【问题描述】:

我有一个安卓工作室项目。当我旋转屏幕时,android 会破坏并重新创建主要活动。如果android要重新创建活动,我如何在销毁期间检查?

【问题讨论】:

在方向改变时,Android 总是会破坏你的活动然后重新创建它。 你为什么想知道系统会重新创建你的活动? 如果你不想系统破坏然后在旋转时重新创建你的活动,我想你可以参考这个解决方案***.com/a/7618926/3728335 【参考方案1】:

您可以使用isFinishing() 中的onDestroy 中的isFinishing() 来确定用户选择是否正在完成活动(例如,用户选择按返回键退出)。

  @Override
  protected void onDestroy() 
    super.onDestroy();
    if (isFinishing()) 
      // wrap stuff up
     else  
      //It's an orientation change.
    
  

另一种选择(如果您只针对 API>=11)是 isChangingConfigurations

  @Override
  protected void onDestroy() 
    super.onDestroy();
    if (isChangingConfigurations()) 
      //It's an orientation change.
    
  

【讨论】:

如果Android由于内存限制或应用程序崩溃而决定终止应用程序怎么办?在这种情况下,onDestroy不会被调用。以一种在不承担最坏情况的情况下解决问题的方式进行编码是不可行的。 没错,MVVM 是要走的路。但是一个问题需要一个答案。 @TaseerAhmad 但我一直发现,不满意的特定原因,崩溃/强制关闭会弄乱你预期的代码(至少对于基本的东西,比如预期的方向变化处理),不管是什么设计练习你跟随。 您可能需要检查noHistory=true 或`Intent.FLAG_ACTIVITY_NO_HISTORY。有关详细信息,请参见此处:***.com/a/62107555/3763032 是的,MVVM 更适合处理 /save 复杂数据 如果由于内存限制而重新创建活动,即使 ViewModel 也会被清除,对吧?【参考方案2】:

重写Activity生命周期方法以查看流程。然后使用适当的方法检查活动当前状态,如isChangingConfigurations() 示例代码sn-p。

MainActivity.java

public class MainActivity extends AppCompatActivity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    

    @Override
    protected void onStart() 
        super.onStart();
        Log.i(MainActivity.class.getSimpleName(),"OnStart Called");
    

    @Override
    protected void onRestart() 
        super.onRestart();
        Log.i(MainActivity.class.getSimpleName(),"OnRestart Called");
    

    @Override
    protected void onDestroy() 
        super.onDestroy();
        Log.i(MainActivity.class.getSimpleName(),"OnDestroy Called");
    


    @Override
    protected void onPause() 
        super.onPause();
        Log.i(MainActivity.class.getSimpleName(),"OnPause Called");
    

   @Override
    public void onConfigurationChanged(Configuration newConfig) 
        super.onConfigurationChanged(newConfig);
        Log.i(MainActivity.class.getSimpleName(),"OnConfiguration Changed Called");
    


更多详情见官网activity-lifecycle

【讨论】:

以上是关于如何检查android是不是要重新创建活动或销毁?的主要内容,如果未能解决你的问题,请参考以下文章

在Android中销毁布局时覆盖的方法

使用 Jetpack 的 Android 导航组件销毁/重新创建的片段

Android Jetpack之ViewModel源码分析

Android活动生命周期 - 重新启动(销毁)应用程序不会删除对(自定义)监听器的引用?

如果在android中打开了移动设备或wifi,如何检查互联网是不是可用[重复]

jetpack之ViewModel