提问者:小点点

区分按下“主页”按钮和打开另一个活动


我有三个活动:-SplashActivity-MainActivity-PlayerActivity

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

所以当app从一个切换到另一个再切换回来时,PlayerActivity和MainActivity经常得到onPause()和onStop()而没有onDestroy。

我需要完成所有活动并在每次用户按下“主页”按钮时启动 SplashActivity 的应用程序,但主页按钮就像在活动之间切换一样(onPause() 和 onStop())。所以我无法抓住杀戮活动的区别。

请帮帮忙。

已编辑:可惜onUserLeaveHint无济于事,还是老样子。如果用户将此呼叫推回家:

onUserInteraction、onUserLeaveHint、onPoke、onStop

该活动返回上一个活动(Main ),没有任何用户操作。

公共类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、onPoke、onStop


共3个答案

匿名用户

据我所知,没有办法覆盖home键或监听home键按下事件。

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

  • 您的任何活动均未显示 -

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

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

更新:不是像下面的例子那样修改所有的活动,您可以使用ActivityLifeycleCallback对象来知道何时调用您的任何活动的生命周期回调。您可以以我的例子为例进行修改。我相信 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;
}

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

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

向项目中的每个活动添加onStart和onStop(如果愿意,您可以为活动创建一个公共祖先):

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

匿名用户

你可以这样检查:

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

匿名用户

您可以使用可重写的< code>onUserLeavesHint()函数捕获“主页按钮点击”,这在您的情况下可能就足够了。

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

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

受保护的无效onUserLeaveHint()

作为活动生命周期的一部分,当一个活动由于用户的选择即将进入后台时调用。例如,当用户按下Home键时,将调用onUserLeaveHint(),但当来电导致通话中的活动自动带到前台时,不会对被中断的活动调用onUserLeaveHint()。在被调用的情况下,这个方法在活动的onPause()回调之前被调用。

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