Android Intent FLAG_ACTIVITY_TASK_ON_HOME 按下后退键时不会 return 回家
Android Intent FLAG_ACTIVITY_TASK_ON_HOME doesn't return to home when pressing back
我有一个聊天应用遇到这种情况:
A - MainActivity
B - 聊天 activity
C - 前锋activity
假设我想将 Bill 的消息转发到 John 的聊天,我打开 A -> B -> C,在 C 上我必须 select 用户转发,所以我点击 John throw a新的 B 意图,现在在堆栈中我有 A-B-C-B,如果从 John 的聊天中我按下后退按钮我想返回 A(MainActivity),但实际上我返回 B(Bill 的聊天),这是一个问题,因为Chat activity 必须只有一个。
出于必要,聊天 activity 在清单中设置为 android:launchMode="singleTop",因为如果我在前台有一个聊天并且我点击 "new message" android 通知,当前聊天已关闭,新聊天已打开。阅读开发人员指南我发现 FLAG_ACTIVITY_TASK_ON_HOME,正如我可以理解的那样,我应该能够直接从 John 的聊天(B)返回到 MainActivity(A),但没有发生。
这是一个(滑动tab布局的MainActivity,Intent是从ListFragment Tab启动的activity)
Intent intent = new Intent(getContext(), Chats.class);
Bundle b = new Bundle();
b.putString("nid", list_id.toString());
b.putString("user_id_key", list_user_id.toString());
b.putString("name", list_name.toString());
b.putString("number", list_number.toString());
intent.putExtras(b);
startActivityForResult(intent, 101);
这是 B(聊天 activity - AppCompatActivity)
Intent intent = new Intent(getApplicationContext(), Forward.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
Bundle b = new Bundle();
b.putString("forward_mess", MessText);
b.putString("number", number);
b.putString("conv_id", convId);
intent.putExtras(b);
startActivity(intent);
这是C(转发activity - AppCompatActivity)
Intent intent = new Intent(getApplicationContext(), Chats.class);
intent.addFlags(Intent.FLAG_ACTIVITY_TASK_ON_HOME);
Bundle b = new Bundle();
b.putString("nid", sel_nid);
b.putString("user_id_key", sel_user_receiver);
b.putString("name", sel_name);
b.putString("number", sel_number);
b.putString("forward_mess", forward_mess);
intent.putExtras(b);
startActivityForResult(intent, 101);
finish();
也尝试使用 FLAG_ACTIVITY_CLEAR_TOP,但这直接将我带到 A->B
已在聊天中使用 onActivityResult 方法解决 activity。
这里是正确的活动流程:
MainActivity -> startActivityForResult(chat_intent, 101);
聊天 -> startActivityForResult(forward_intent, 5);
设置onActivityResult方法:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//If is 5 means Forward activity was closed
if (requestCode == 5) {
// If 10 means a new Chat was opened, so this one must be closed
if (resultCode == 10) {
finish();
}
}
}
前进
startActivityForResult(chat_intent, 101);
setResult(10);
finish();
我有一个聊天应用遇到这种情况:
A - MainActivity
B - 聊天 activity
C - 前锋activity
假设我想将 Bill 的消息转发到 John 的聊天,我打开 A -> B -> C,在 C 上我必须 select 用户转发,所以我点击 John throw a新的 B 意图,现在在堆栈中我有 A-B-C-B,如果从 John 的聊天中我按下后退按钮我想返回 A(MainActivity),但实际上我返回 B(Bill 的聊天),这是一个问题,因为Chat activity 必须只有一个。 出于必要,聊天 activity 在清单中设置为 android:launchMode="singleTop",因为如果我在前台有一个聊天并且我点击 "new message" android 通知,当前聊天已关闭,新聊天已打开。阅读开发人员指南我发现 FLAG_ACTIVITY_TASK_ON_HOME,正如我可以理解的那样,我应该能够直接从 John 的聊天(B)返回到 MainActivity(A),但没有发生。
这是一个(滑动tab布局的MainActivity,Intent是从ListFragment Tab启动的activity)
Intent intent = new Intent(getContext(), Chats.class);
Bundle b = new Bundle();
b.putString("nid", list_id.toString());
b.putString("user_id_key", list_user_id.toString());
b.putString("name", list_name.toString());
b.putString("number", list_number.toString());
intent.putExtras(b);
startActivityForResult(intent, 101);
这是 B(聊天 activity - AppCompatActivity)
Intent intent = new Intent(getApplicationContext(), Forward.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
Bundle b = new Bundle();
b.putString("forward_mess", MessText);
b.putString("number", number);
b.putString("conv_id", convId);
intent.putExtras(b);
startActivity(intent);
这是C(转发activity - AppCompatActivity)
Intent intent = new Intent(getApplicationContext(), Chats.class);
intent.addFlags(Intent.FLAG_ACTIVITY_TASK_ON_HOME);
Bundle b = new Bundle();
b.putString("nid", sel_nid);
b.putString("user_id_key", sel_user_receiver);
b.putString("name", sel_name);
b.putString("number", sel_number);
b.putString("forward_mess", forward_mess);
intent.putExtras(b);
startActivityForResult(intent, 101);
finish();
也尝试使用 FLAG_ACTIVITY_CLEAR_TOP,但这直接将我带到 A->B
已在聊天中使用 onActivityResult 方法解决 activity。
这里是正确的活动流程:
MainActivity -> startActivityForResult(chat_intent, 101);
聊天 -> startActivityForResult(forward_intent, 5);
设置onActivityResult方法:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//If is 5 means Forward activity was closed
if (requestCode == 5) {
// If 10 means a new Chat was opened, so this one must be closed
if (resultCode == 10) {
finish();
}
}
}
前进
startActivityForResult(chat_intent, 101);
setResult(10);
finish();