如何为我的自定义导航配置清单文件(任务相关性?)

时间:2012-08-29 08:00:43

标签: android navigation android-manifest task

我的应用程序中有一个特殊的导航,我想知道如何正确设置它。

活动H是我的应用程序的主屏幕。通过此活动,我们可以启动活动A,B,C和D.从活动A我们可以启动A'启动A',从活动B我们可以启动B',启动B''等。

问题在于,从任何活动,我们都可以进入活动H,A,B,C或D.但是,当用户启动A-> A' - > A'' - > C时,然后回到A,他必须被重定向到A''。此外,仍然有这个例子,如果用户按回A'',他必须被重定向到A'而不是C。如果他再次按回去,他必须被重定向到A,然后再返回应该重定向到A H(主屏幕)活动,而不是C!

最后,当用户从H向后按,并且仅在此时,应用程序(以及解决方案选择的所有任务是创建分离的任务)应该关闭。

其他例子:H - > A - > B - > H - >回来 - >申请结束

我怎样才能做到这一点? 我曾经想过要用这样的任务:

<!-- A-->
<activity
    android:name=".A"
    android:excludeFromRecents="true"
    android:taskAffinity=".A"
    android:label="@string/my_A_label">
</activity>
<activity
    android:name=".A'"
    android:taskAffinity=".A"
    android:label="@string/my_A'_label">
</activity>
<activity
    android:name=".A''"
    android:taskAffinity=".A"
    android:label="@string/my_A''_label">
</activity>


<!-- B-->
<activity
    android:name=".B"
    android:excludeFromRecents="true"
    android:taskAffinity=".B"
    android:label="@string/my_B_label">
</activity>
<activity
    android:name=".B'"
    android:taskAffinity=".B"
    android:label="@string/my_B'_label">
</activity>
<activity
    android:name=".B''"
    android:taskAffinity=".B"
    android:label="@string/my_B''_label">
</activity>

...

如您所见,我为每个主页创建了任务:A,B,C,D。 我不知道这是否是件好事,因为,例如,使用任务,用户可以通过“最后任务”选项长按其主页按钮看到所有这些活动,我不希望这样行为。为此,活动A,B,C,D(每个任务的根屏幕)具有属性android:excludeFromRecents =“true”。但现在,另一个问题是:当用户点击他的主页按钮,然后回到我的应用程序时,他会回到主屏幕,而不是上次启动的活动......

此外,我的第二个例子没有得到尊重。

您有想法解决所有这些问题吗?

P.S:请不要告诉我改变我的导航系统: - )

编辑:这是一个代表所需后台组合的流程图。这种情况似乎很正常。我的情况有所不同,不会出现在此图表中。实际上,仅表示后退按钮。每个上下文 - 由不同的颜色表示 - 可以切换到另一个上下文,而不会覆盖此处描述的反向比较。

back comportment

EDIT2:感谢David Wasser的建议,我已经实现了两个完全按照我所描述的方式进行操作的类,而不使用android任务。感谢JoxTraex的帮助:-)这里我做了什么:我的活动A,B,C,D扩展RootActivity,另外除了H扩展CustomNavigationActivity。

RootActivity:

import android.content.Intent;

public abstract class RootActivity extends CustomNavigationActivity{

@Override
public void onBackPressed(){

    Intent intent = new Intent(this, HomeScreen.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);

}

}

CustomNavigationActivity:

import android.content.Intent;

public abstract class CustomNavigationActivity extends Activity{

private int actualRequestCode;
private int menuRequestCode = -1;

@Override
protected void onResume(){

    if (getIntent().hasExtra("childLaunched")){

        Intent intent = new Intent(this, (Class<?>) getIntent().getExtras().get("childLaunched"));
        intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
        startActivity(intent);

    }

    super.onResume();       

}

@Override
public void startActivity (Intent intent) {

    this.startActivityForResult(intent, 0);

}

@Override
public void startActivityForResult(Intent intent, int requestCode){

    Class<?> targetClass = null;
    this.actualRequestCode = requestCode;

    if (this.actualRequestCode == this.menuRequestCode){
        this.menuRequestCode -= 1;
    }

    try {
        if (intent.getComponent() != null){
            targetClass = Class.forName(intent.getComponent().getClassName());
        }
    }
    catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    if (targetClass == null){
        super.startActivityForResult(intent, this.actualRequestCode);
    }
    else if (!targetClass.equals(Menu.class)){
        getIntent().putExtra("childLaunched", targetClass);
        super.startActivityForResult(intent, this.actualRequestCode);
    }
    else{
        super.startActivityForResult(intent, this.menuRequestCode);     
    }

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){

    if (requestCode == this.actualRequestCode){
        getIntent().removeExtra("childLaunched");
    }

}

}

3 个答案:

答案 0 :(得分:1)

你肯定要为此需要不同的任务。如果用户离开应用程序(按HOME,接听电话等)并想要回来,它将完全搞乱您的导航。如果您具有每个任务根目录下的活动的唯一图标和/或名称,并且任务可以并行运行,则只能使用单独的任务。只有这样你才不会混淆用户。看来你不想要。

查看我对Activities Stack Issue

的回答

这不完全是你想要的,但你可能从这个答案中得到一些想法。如果您在查看此内容后仍有疑问,请添加评论,我可以为您提供更多帮助。

答案 1 :(得分:0)

不要这样控制它。只需使用Intents的控制,它就更直接了。通过这种方式,您可以防止那些无序的悬挂活动。

此外,在标记您的活动时不要使用ACTION_MAIN标记所有

参考文档以找出原因。

A -> B -> C

A -> B

Intent intent = new Intent((context), MyClassB.class);

B -> C

Intent intent = new Intent((context), MyClassC.class);

C -> A

Intent intent = new Intent((context), MyClassA.class);

但要妥善处理这个问题你必须对你想要的流程有一个很好的了解。流程图可能会让您受益,或者解释您当前的问题。如果我可以说,你当前的实施/流程是一团糟。我建议使用上面提到的流程图清理这个想法。

此外,如果您只想 ONE 活动作为主要根,那么您的主要活动的IntentFilter应为ACTION_MAIN,其他人应

答案 2 :(得分:0)

您可以提示活动运行另一项活动     startActivity(new Intent(MainActivity.this,MenuActivity.class));