我有活动A,B,C,用户之间可以进行导航。
活动B还提供了类似(B1,B2,B3)的子流。当用户完成子流时,他将与一些数据一起发送回B。
我应该使用什么意图标志或启动模式在A-B-C之间以及B1- B2-B3之间提供反向导航。但是当返回B并意图传递一些数据时,也清除/完成了此子流程吗?
我尝试将FLAG_ACTIVITY_CLEAR_TOP
和FLAG_ACTIVITY_SINGLE_TOP
添加到子活动(B1,B2,B3)中,但这没用。
答案 0 :(得分:0)
在活动B2中:
public void finish(){
Bundle bundle = new Bundle();
bundle.putString("KEY_NAVIGATION", "B");
Intent intent = new Intent(B2.this, A.class);
intent.putExtra("EXTRA", bundle);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
您的活动A:
@Override
protected void onCreate(Bundle savedInstanceState) {
component.inject(this);
super.onCreate(savedInstanceState);
if (getIntent().hasExtra("EXTRA")) {
Intent intent = new Intent(A.this, B.class);
startActivity(intent);
}
// do your logic
}
通过这种方式,您可以在从B2导航后从B返回到A
希望这会有所帮助
答案 1 :(得分:0)
您可以使用链接的onActivityResult
调用,因此,您不会从B2到B而是自动回溯通过同一条链接(B2-> B1-> B)调用finish()
从后面的堆栈中取出链条。这样,您仍然可以在B1或B2处按预期使用后退按钮,但是一旦按A-> B-> B1-> B2-> B后按Back,将使您回到A,而不是B2。
无论您在B之前访问了多少活动(无论您是从Aa-> Ab-> Ac-> B然后通过B-> B1-> B2-> B循环来进行,这都将起作用)然后仍然可以通过B-> Ac-> Ab-> Aa)返回。
public class ActivityB extends AppCompatActivity {
private static final int LAUNCH_B1 = 11;
void launch_subloop() {
Intent intent = new Intent(ActivityB.this, ActivityB1.class);
startActivityForResult(intent, LAUNCH_B1);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if( resultCode == Activity.RESULT_OK && requestCode == LAUNCH_B1) {
// do stuff upon loop completion
}
}
}
public class ActivityB1 extends AppCompatActivity {
private static final int LAUNCH_B2 = 12;
void go_to_next_step() {
Intent intent = new Intent(this, ActivityB2.class);
startActivityForResult(intent, LAUNCH_B2);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if( resultCode == Activity.RESULT_OK && requestCode == LAUNCH_B2) {
// This will finish B1 and bring us back to B, with B1 and B2 now
// removed from the back stack
setResult(Activity.RESULT_OK);
finish();
}
}
}
public class ActivityB2 extends AppCompatActivity {
void finish_subloop() {
// when you finish, this should go back through the
// activities and finish B1 and B2, so if you go on from B to C, you can
// still go back from C -> B -> A
// This will bring us back to B1 and finish B2 (remove from back stack)
setResult(Activity.RESULT_OK);
finish();
}
}
答案 2 :(得分:0)
尝试制作活动B的清单:
launchMode = “singleTask”
因此,在活动B2之后,您可以 startActivity(“活动b2的意图,将一些数据放入此意图中”),并在活动B中的 onNewIntent()中处理您的意图
如果活动B,B1,B2是相同的活动,为什么不仅仅将其片段化?
您也可以通过标志在没有LunchMode的情况下做同样的事情:
来自活动A
startActivity("intent for activity b with putting some data in this intent", Intent.FLAG_ACTIVITY_NEW_TASK)
活动B
startActivity("intent for activity B with data (if needs)", Intent.FLAG_ACTIVITY_NO_HISTORY)
活动B1
startActivity("intent for activity B with data (if needs)", Intent.FLAG_ACTIVITY_NO_HISTORY)
活动B2
startActivity("intent for activity B with data (if needs)", Intent.FLAG_ACTIVITY_NEW_TASK)
答案 3 :(得分:0)
最后,我通过执行以下操作获得了预期的结果。在活动B中,我创建了两种方法来启动活动
class ActivityB : AppCompatActivity() {
fun startFromActivityA(context: Context) {
val intent = Intent(context, ActivityB::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
context.startActivity(intent)
}
fun startFromActivityB2(context: Context, intentData: IntentData) {
val intent = Intent(context, ActivityB::class.java)
intent.putExtra(INTENT_DATA, intentData)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
context.startActivity(intent)
}
}
因此,当我进入子流并且想要完成子流时,我将呼叫startFromActivityB2
。它将清除整个子流,并仍提供向回导航到活动A