我有三个 Activity :
-SplashActivity
- 主要 Activity
-PlayerActivity

当然,该应用程序以SplashActivity开始,然后启动MainActivity并关闭。
稍后,MainActivity将启动PlayerActivity并返回到后堆栈。 (MainActivity仍然存在,但处于onStop状态)
然后,我需要打开MainActivity并将PlayerActivity设置为背景(PlayerActivity处于 Activity 状态,但处于onStop状态)。
然后,我需要再次打开PlayerActivity并将MainActivity设置为背景。

因此,当应用程序一个切换到另一个并返回时,PlayerActivity和MainActivity通常会获得onPause()和onStop()而没有onDestroy。

每当用户按下“主页”按钮时,我都需要完成所有 Activity 并启动SplashActivity的应用程序,但是主页按钮的作用类似于在 Activity 之间进行切换(onPause()和onStop())。因此我无法捕获差异来杀死 Activity 。

请帮忙。

编辑:
不幸的是,onUserLeaveHint上的无济于事,它是一样的。
如果用户按下HOME键,则会调用:

onUserInteraction,
onUserLeaveHint,
暂停,
onStop


此 Activity 返回先前的 Activity (主要),而没有任何用户操作。

公共(public)类PlayerActivity扩展了 Activity {

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

    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            startActivity(new Intent(PlayerActivity.this, MyActivity.class));
        }
    }, 5000);
}



但仍具有相同的内容:

onUserInteraction,
onUserLeaveHint,
暂停,
onStop

最佳答案

据我所知,没有任何方法可以覆盖主页按钮或监听主页按钮按下事件。

但是,您的目标是让应用程序知道并在发生以下情况时采取措施:

  • 您的 Activity 均未显示->您的 Activity 之一已显示。

  • 发生这种情况时,您想显示一个启动对话框。

    您可以跟踪用户何时在应用程序中,并检查用户是否从应用程序内导航到您的 Activity 。

    更新:您可以使用ActivityLifecycleCallbacks对象来知道何时调用任何Activity的生命周期回调,而不必像下面的示例所示那样修改所有Activity。您可以以我的示例为例进行修改。我相信ActivityLifecycleCallbacks.onActivityStarted()是在调用super.onStart()之后调用的,因此您必须在调用Activity.onStart()中的super.onStart()之前检查cameFromMyApplication()。这不太容易出错,并且需要更少的代码。


    public class MyApplication extends Application {
    
      public static boolean cameFromMyApplication() {
        return count != 0;
      }
    
      public static void activityStarted() {
        count++;
      }
    
      public static void activityStopped() {
        count--;
      }
    
      private static int count;
    }
    


    <application
        android:name="your.app.package.MyApplication"
        android:icon="@drawable/icon"
        android:label="@string/app_name" >
    


    @Override
    protected void onStart() {
      super.onStart();
      //Do not include this check in the splash screen Activity
      if(!MyApplication.cameFromMyApplication()) {
        //User arrived from outside the application
        //Application specific code (clear Activity backstack & show splash screen in your case)
      }
      MyApplication.activityStarted();
    }
    
    @Override
    protected void onStop() {
      super.onStop();
      MyApplication.activityStopped();
    }
    

    10-05 17:48