【发布时间】:2012-08-27 04:25:49
【问题描述】:
在我的应用程序中,A 是主要的 Activity。它导航像这样的A,B,C,D等。 我实现了谷歌云推送通知。当推送通知来时,通知产生并单击它转到活动 X。当堆栈不为空时没有问题。当堆栈为空并且从推送通知启动的活动 x 充当启动活动时。这意味着如果我们再次长按主页按钮并选择应用程序导航到 X 活动(从通知启动的活动)而不是 A 活动,则堆栈再次为空.请帮帮我。
【问题讨论】:
标签: android
在我的应用程序中,A 是主要的 Activity。它导航像这样的A,B,C,D等。 我实现了谷歌云推送通知。当推送通知来时,通知产生并单击它转到活动 X。当堆栈不为空时没有问题。当堆栈为空并且从推送通知启动的活动 x 充当启动活动时。这意味着如果我们再次长按主页按钮并选择应用程序导航到 X 活动(从通知启动的活动)而不是 A 活动,则堆栈再次为空.请帮帮我。
【问题讨论】:
标签: android
最简单的方法是覆盖onUserLeaveHint() 并完成您的活动,
来自关于受保护的无效onUserLeaveHint()的文档
在活动即将开始时作为活动生命周期的一部分调用 作为用户选择的结果进入后台。例如,当 用户按下 Home 键,onUserLeaveHint() 将被调用,但是 当来电导致通话中活动 自动带到前台,onUserLeaveHint() 不会 调用被中断的活动。在调用它的情况下, 在活动的 onPause() 回调之前调用此方法。
此回调和 onUserInteraction() 旨在帮助活动 智能管理状态栏通知;具体来说,对于 帮助活动确定取消通知的适当时间。
伪代码,
@Override
protected void onUserLeaveHint() {
super.onUserLeaveHint();
finish();
}
您也可以查看this answer 以获取更多参考。
UPDATE:
检测您的 HOME 键是否被按下的另一个解决方法是检查 ActivityManager 中的 Activity。当按下 HOME 按钮时,您的 BaseActivity 将保持在 Activity Lists 中的第二个位置。因此,您可以使用 ActivityManager 进行检查,如下所示,
@Override
protected void onUserLeaveHint() {
super.onUserLeaveHint();
Log.e("onUserLeaveHint()", "Yes");
ActivityManager activityManager = (ActivityManager)
getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> recentTasks = activityManager
.getRunningTasks(Integer.MAX_VALUE);
for (int i=0; i<recentTasks.size(); i++) {
if (i == 1 && recentTasks.get(i).baseActivity.toShortString()
.indexOf(getPackageName()) > -1) {
Log.e("Home Pressed", "Yes");
break;
}
}
}
另外,别忘了添加
<uses-permission android:name="android.permission.GET_TASKS"/>
AndroidManifest 文件中的权限。进一步的参考可以从this blog找到。
【讨论】: