区分推动"家庭"按钮并打开另一个Activity

时间:2014-10-29 00:02:58

标签: android android-activity android-lifecycle activity-lifecycle

我有三项活动:   - SplashActivity  - 主要活动   - PlayerActivity

当然应用程序以SplashActivity开头,然后启动MainActivity并关闭。 MainActivity在某个时刻启动了PlayerActivity并进入了Backstack。 (MainActivity还活着,但是在onStop上) 然后我需要打开MainActivity并将PlayerActivity设置为后台(PlayerActivity是活着的但是在onStop上)。 然后我需要再次打开PlayerActivity并将MainActivity设置为background。

因此,当app将一个切换到另一个并返回时,PlayerActivity和MainActivity通常会在没有onDestroy的情况下获得onPause()和onStop()。

每次用户推送" home"我需要完成所有活动并启动SplashActivity应用程序。按钮但主页按钮与活动之间的切换相同(onPause()和onStop())。所以我无法发现杀死活动的不同。

请帮忙。

编辑: 不幸的是, onUserLeaveHint 并没有帮助,它是一样的。 如果用户按下HOME,则调用:

onUserInteraction, onUserLeaveHint, 在onPause, 的onStop

此活动返回上一个活动(主要),没有任何用户操作。

公共类PlayerActivity扩展了活动{

@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, 在onPause, 的onStop

4 个答案:

答案 0 :(得分:2)

据我所知,无法覆盖主页按钮或收听主页按钮事件。

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

  • 您的所有活动均未显示 - >您的其中一项活动正在展示。

发生这种情况时,您需要显示启动对话框。

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

更新:您可以使用ActivityLifecycleCallbacks对象来了解您的任何活动时间,而不是像下面的示例所示修改所有活动。生命周期回调被调用。你可以拿我的例子并修改它。我相信在super.onStart()调用之后调用ActivityLifecycleCallbacks.onActivityStarted(),因此在调用Activity.onStart()中的super.onStart()之前,必须检查cameFromMyApplication()。这不容易出错,需要的代码更少。

  

修改How to check if activity is in foreground or in visible background?以适合此问题

     

示例   实现自定义应用程序类:

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;
}
  

在AndroidManifest.xml中注册您的应用程序类:

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

将onStart和onStop添加到项目中的每个Activity(您可以   如果您愿意,请为您的活动创建一个共同的祖先:

@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();
}

答案 1 :(得分:1)

您可以使用可覆盖的onUserLeavesHint()功能捕捉“主页按钮点击”,这可能足以满足您的需求。

@Override
public void onUserLeaveHint() {
    super.onUserLeaveHint();
    // Do your thing
}

来自http://developer.android.com/reference/android/app/Activity.html#onUserLeaveHint()

的文档
  

protected void onUserLeaveHint()

     

当活动即将到来时,被称为活动生命周期的一部分   作为用户选择的结果进入后台。例如,何时   用户按下Home键,将调用onUserLeaveHint(),但是   当来电通话导致通话活动时   自动带到前台,onUserLeaveHint()不会   呼吁活动被打断。在调用它的情况下,   在活动的onPause()回调之前调用此方法。

     

此回调和onUserInteraction()旨在帮助活动   智能地管理状态栏通知;特别是   帮助活动确定取消通知的适当时间。

答案 2 :(得分:1)

你可以这样检查:

ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> tasks = am.getRunningTasks(1);
    // check if home was pressed
    if (tasks.get(0).topActivity.getPackageName().equals("com.android.launcher")) {
        // HOME button pressed
    } else {
        // RECENT APPS pressed (you can listen for the key event before)
        // activity with FLAG_ACTIVITY_NEW_TASK started
        // etc.
    }

答案 3 :(得分:0)

我正在寻找类似问题的解决方案,上面提供的 ungalcrys 代码让我朝着正确的方向前进,所以这是一个更普遍的问题解决方案,也适合需要它的人

@Override
protected void onStop() {
        super.onStop();

        ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1);

        // check if the app is still visible
        if (!tasks.get(0).topActivity.getPackageName().equals(getPackageName())) {
            // for some reason(HOME, BACK, RECENT APPS, etc.) the app is no longer visible
            // do your thing here
            } else {
            // app is still visible, switched to other activity
        }
    }