Android 检查启动新活动时是否调用了activity onStop

Android 检查启动新活动时是否调用了activity onStop,android,performance,android-activity,android-lifecycle,Android,Performance,Android Activity,Android Lifecycle,我正在努力解决一个问题。在我的应用程序中,我需要确定调用onStop方法是因为启动了一个新活动,还是在用户单击主页按钮或切换到另一个应用程序后调用了该方法 我有BaseActivity类,我需要在这里检查它 我试图找到一种方法来做到这一点,但不幸的是仍然没有找到解决办法 也许有一个解决办法 其思想是区分onStop方法调用的发起方 如有任何帮助,我将不胜感激。您可以使用SharedReferences查看: @Override protected void onStop() {

我正在努力解决一个问题。在我的应用程序中,我需要确定调用
onStop
方法是因为启动了一个新活动,还是在用户单击主页按钮或切换到另一个应用程序后调用了该方法

我有BaseActivity类,我需要在这里检查它

我试图找到一种方法来做到这一点,但不幸的是仍然没有找到解决办法

也许有一个解决办法

其思想是区分
onStop
方法调用的发起方


如有任何帮助,我将不胜感激。

您可以使用SharedReferences查看:

@Override
    protected void onStop() {
        super.onStop();
        SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
        pref.edit().putBoolean("IfOnStopCalled", true).apply();
    }
签入您的基本活动:

SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
Boolean IfOnStopCalled = pref.getBoolean("IfOnStopCalled",false);

if(IfOnStopCalled){
  //Do your action
}
else{
 //Do your action
}

一种可能的解决方案是注册ActivityLifecycleCallbacks并保存上次调用onResume的活动的引用名称:

public class ActivityChecker implements Application.ActivityLifecycleCallbacks {
  private static ActivityChecker mChecker;
  private String mCurrentResumedActivity = "";

  public static ActivityChecker getInstance() {
    return mChecker = mChecker == null ? new ActivityChecker() : mChecker;
  }

  // If you press the home button or navigate to another app, the onStop callback will be called without touching the mCurrentResumedActivity property.
  // When a new activity is open, its onResume method will be called before the onStop from the current activity.
  @Override 
  public void onActivityResumed(Activity activity) {
    // I prefer to save the toString() instead of the activity to avoid complications with memory leaks. 
    mCurrentResumedActivity = activity.toString();
  }   


  public boolean isTheLastResumedActivity(@NonNull Activity activity) {
    return activity.toString().equals(mCurrentResumedActivity);
  }

  // [...] All other lifecycle callbacks were left empty
}
可以在应用程序类中注册ActivityLifecycleCallbacks:

public class App extends Application {

  public App() {
    registerActivityLifecycleCallbacks(ActivityChecker.getInstance());
  }

}
别忘了在您的舱单中注册:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="your.package.name">    

    <application
        ...
        android:name=".App"
        > ...
    </application>
</manifest>
参考文献:

注册自定义应用程序类和ActivityLifecycleCallbacks:


写了这篇文章后,我找到了这个链接,其中有一些其他选项可以检索当前恢复的活动:。

您可以添加一个
受保护的布尔值otherActivityCalled=falseotherActivity
时,code>将此项设置为
true
,并在您的
onStop
钩子中进行检查。如果
false
则表示您的
currentActivity
由于其他原因已停止。
public class MyBaseActivity {
  @Override protected void onStop() {
    if(ActivityChecker.getInstance().isTheLastResumedActivity(this)) {
      // Home button touched or other application is being open.
    }
  }
}