我的应用程序中有一个特殊的导航,我想知道如何正确设置它。
活动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:请不要告诉我改变我的导航系统: - )
编辑:这是一个代表所需后台组合的流程图。这种情况似乎很正常。我的情况有所不同,不会出现在此图表中。实际上,仅表示后退按钮。每个上下文 - 由不同的颜色表示 - 可以切换到另一个上下文,而不会覆盖此处描述的反向比较。
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");
}
}
}
答案 0 :(得分:1)
你肯定要不为此需要不同的任务。如果用户离开应用程序(按HOME,接听电话等)并想要回来,它将完全搞乱您的导航。如果您具有每个任务根目录下的活动的唯一图标和/或名称,并且任务可以并行运行,则只能使用单独的任务。只有这样你才不会混淆用户。看来你不想要。
的回答这不完全是你想要的,但你可能从这个答案中得到一些想法。如果您在查看此内容后仍有疑问,请添加评论,我可以为您提供更多帮助。
答案 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));