我正在开发一个只有一个登录活动和一个主要活动的应用。我将片段替换为三个级别,例如A-> B-> C或A-> B-> D以及更多这样的场景。我将它们放在后面的堆栈上并在后面按下它们取回它们。就像在背压上一样C,B出现。我有一个场景,我收到推送通知然后点击它应用程序应重定向到C.现在要实现它我必须通过启动屏幕。这意味着在点击通知之前,如果我在D上并且我收到C的通知,那么我将登陆C,但是在背压时我不会来D而是B,因为A-> B> C。那么是否存在一个活动和所有片段的结构,即使我点击通知,我也可以在通知到达之前恢复流程。???即直接将C维持到D,然后按原样定期流动。 谢谢。
答案 0 :(得分:0)
这可能略微取决于这些片段的内容是什么,但我认为Android文档实际上会建议你现在的行为实际上是正确的。基本上,一旦您从通知中导航到应用程序,您的导航应该与您通常通过浏览屏幕在应用程序中输入该点相同。它应该清除以前的导航历史记录。
文档详细说明了这一点: https://developer.android.com/design/patterns/navigation.html#into-your-app
答案 1 :(得分:0)
首先将TabLayout.OnTabSelectedListener实现到您的片段托管活动,然后覆盖方法onTabSelected get tab position(比如tabPosition),从这个位置尝试在同一个活动中跟随代码(需要更改):
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
// TODO Auto-generated method stub
if ((keyCode == KeyEvent.KEYCODE_BACK))
{
if(tabPosition!=0)
{
pager.setCurrentItem(tabPosition- 1);
return true;
}
else
{
onBackPressed();
}
}
return super.onKeyDown(keyCode, event);
}
答案 2 :(得分:0)
您可以实现自己的自定义backstack。
因此,如果您的历史记录如下:
A-> B-> C-> d
如果事件导致历史记录再次添加C,例如您在上面指定的通知,然后您在上面指定的内容表明您希望历史记录如下所示:
A-> B-> C-> D-&以及c
你目前得到的,你不想要的是:
A-> B-&以及c
为此,您可以在Activity中实现自定义片段历史记录处理。您通常会将片段转换添加到Backstack,而是将片段添加到ArrayList或类似实体。我在下面拼凑了一些代码:
private ArrayList<Fragment> mFragmentHistory = new ArrayList<>();
private void loadFragment(Fragment fragment, boolean addToHistory) {
// your fragment transition code here without adding to backstack
// add the fragment to your custom history
if (addToHistory) {
mFragmentHistory.add(fragment);
}
}
然后,您需要在同一个Activity的onBackPressed方法中实现处理代码:
@Override
public void onBackPressed() {
// if the history is not at the "top", i.e. only one (or 0) fragments in history
if (mFragmentHistory.size() > 1) {
// remove the last (==current) fragment from history
mFragmentHistory.remove(mFragmentHistory.size() - 1);
// get new last fragment from history - this is now the one to load
Fragment loadFragment = mFragmentHistory.get(mFragmentHistory.size() - 1);
// load this fragment, don't add it to the history
loadFragment(loadFragment, false);
} else {
// perform default system back or implement your custom handler here
super.onBackPressed();
}
}
您必须考虑将状态维持在活动重启(屏幕旋转等)上。