我有三项活动: - 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
答案 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
}
}