我有三个活动:-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
据我所知,没有办法覆盖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()旨在帮助活动智能地管理状态栏通知;特别是,用于帮助活动确定取消通知的适当时间。