Android 导航组件 Activity 意图标志
Android Navigation Component Activity Intent Flags
我已经创建了一个从片段到 activity 的导航操作,但我无法清除返回堆栈。当我执行从片段到新 activity 的导航操作并按下后退按钮时,我将返回到前一个 activity 和前一个片段。我无法使用导航图设置 Intent 标志,以从返回堆栈中清除之前的 activity。
<fragment
android:id="@+id/loginFragment"
android:name="com.myapp.auth.LoginFragment"
android:label="login_fragment"
tools:layout="@layout/login_fragment" >
<action
android:id="@+id/action_loginFragment_to_webActivity"
app:destination="@id/webActivity"
app:popUpTo="@id/loginFragment"
app:popUpToInclusive="true" />
</fragment>
<activity
android:id="@+id/webActivity"
android:name="com.myapp.web.WebActivity"
android:label="activity_web"
tools:layout="@layout/activity_web" >
</activity>
PopTo 和 Inclusive 标志在从片段导航到新 activity 时对后退按钮没有影响,即使它们可以在图形编辑器中设置。我可以使用后退按钮导航到堆栈中不再需要的前一个 activity。
在迁移到导航图之前,我可以使用 Intent 标志指定此行为:
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
如何使用导航图实现相同的目的?
如果您要从一个 activity 转到另一个。
我就是这样解决了同样的问题。希望对你有帮助。
firstIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
我不得不破解同样的问题。要解决这个问题,您要做的第一件事就是创建一个操作来导航到 Activity,正如您已经完成的那样。
例如:
<action
android:id="@+id/action_frag_to_myActivity"
app:destination="@id/myActivity"
app:popUpTo="@id/myActivity" />
现在,您可以将参数作为 intent extra 传递给 Activity,这样您就可以利用它让目标 Activity 执行 "dirty work" 并清除返回堆栈给你。
假设您的导航图中有这个 Activity 标签:
<activity
android:id="@+id/myActivity"
android:name="com.dummy.MyActivity"
android:label="activity_my" />
您可以在其中添加一个参数并添加一个默认值。例如:
<activity
android:id="@+id/myActivity"
android:name="com.dummy.MyActivity"
android:label="activity_my">
<argument
android:name="clearBackstack"
app:argType="boolean"
android:defaultValue="true" />
</activity>
然后,一旦您调用 findNavController().navigate(R.id.myActivity)
,它就会通过键 "clearBackstack"
传递一个额外的意图,您可以在 Activity onCreate()
方法中阅读它。类似于下面的示例。
MyActivity.kt
private val EXTRA_LOGOUT = "clearBackstack"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (intent.extras?.getBoolean(EXTRA_LOGOUT) == true) {
clearBackstack()
} else {
setContentView(R.layout.activity_my)
}
}
private fun clearBackstack() {
startActivity(Intent(this, MyActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
})
finish()
}
请记住,您可以修改参数并自定义要在目标上执行的操作 Activity。您也可以在导航到该值后对其进行修改。您可以阅读更多相关信息 here in the docs.
您可以在导航定义中的操作元素中控制 singleTop 等属性。
这些属性在导航编辑器中也可用。
您可以向附加导航器添加意图标志。
val extras = ActivityNavigator.Extras.Builder()
// Add your flags
.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
.build()
// Navigate with extras
findNavController().navigate(destination, extras)
您可以从 source code
查看 ActivityNavigator.navigate()
中如何处理意向标志
或者,如果您要设置的唯一标志是 FLAG_ACTIVITY_SINGLE_TOP
,则可以使用导航选项。
val navOptions = NavOptions.Builder().setLaunchSingleTop(true).build()
findNavController().navigate(destination, navOptions)
您可以从 source code
查看 ActivityNavigator.navigate()
中导航选项的检查方式
引用
val extras = ActivityNavigator.Extras.Builder()
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.build()
findNavController().navigate(BlaBlaActivityDirections.actionFooBarToBlaBlaActivity(), extras)
注意您需要将这些标志添加到 activity 堆栈:
FLAG_ACTIVITY_CLEAR_TASK
:设置activity为根任务。用于
FLAG_ACTIVITY_NEW_TASK
:将 activity 视为启动器 activity。
FLAG_ACTIVITY_REORDER_TO_FRONT
:将 activity 置于最前面。仅当您在堆栈上有其他活动并且您不想清除它时才使用它。
我已经创建了一个从片段到 activity 的导航操作,但我无法清除返回堆栈。当我执行从片段到新 activity 的导航操作并按下后退按钮时,我将返回到前一个 activity 和前一个片段。我无法使用导航图设置 Intent 标志,以从返回堆栈中清除之前的 activity。
<fragment
android:id="@+id/loginFragment"
android:name="com.myapp.auth.LoginFragment"
android:label="login_fragment"
tools:layout="@layout/login_fragment" >
<action
android:id="@+id/action_loginFragment_to_webActivity"
app:destination="@id/webActivity"
app:popUpTo="@id/loginFragment"
app:popUpToInclusive="true" />
</fragment>
<activity
android:id="@+id/webActivity"
android:name="com.myapp.web.WebActivity"
android:label="activity_web"
tools:layout="@layout/activity_web" >
</activity>
PopTo 和 Inclusive 标志在从片段导航到新 activity 时对后退按钮没有影响,即使它们可以在图形编辑器中设置。我可以使用后退按钮导航到堆栈中不再需要的前一个 activity。
在迁移到导航图之前,我可以使用 Intent 标志指定此行为:
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
如何使用导航图实现相同的目的?
如果您要从一个 activity 转到另一个。
我就是这样解决了同样的问题。希望对你有帮助。
firstIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
我不得不破解同样的问题。要解决这个问题,您要做的第一件事就是创建一个操作来导航到 Activity,正如您已经完成的那样。
例如:
<action
android:id="@+id/action_frag_to_myActivity"
app:destination="@id/myActivity"
app:popUpTo="@id/myActivity" />
现在,您可以将参数作为 intent extra 传递给 Activity,这样您就可以利用它让目标 Activity 执行 "dirty work" 并清除返回堆栈给你。
假设您的导航图中有这个 Activity 标签:
<activity
android:id="@+id/myActivity"
android:name="com.dummy.MyActivity"
android:label="activity_my" />
您可以在其中添加一个参数并添加一个默认值。例如:
<activity
android:id="@+id/myActivity"
android:name="com.dummy.MyActivity"
android:label="activity_my">
<argument
android:name="clearBackstack"
app:argType="boolean"
android:defaultValue="true" />
</activity>
然后,一旦您调用 findNavController().navigate(R.id.myActivity)
,它就会通过键 "clearBackstack"
传递一个额外的意图,您可以在 Activity onCreate()
方法中阅读它。类似于下面的示例。
MyActivity.kt
private val EXTRA_LOGOUT = "clearBackstack"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (intent.extras?.getBoolean(EXTRA_LOGOUT) == true) {
clearBackstack()
} else {
setContentView(R.layout.activity_my)
}
}
private fun clearBackstack() {
startActivity(Intent(this, MyActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
})
finish()
}
请记住,您可以修改参数并自定义要在目标上执行的操作 Activity。您也可以在导航到该值后对其进行修改。您可以阅读更多相关信息 here in the docs.
您可以在导航定义中的操作元素中控制 singleTop 等属性。
这些属性在导航编辑器中也可用。
您可以向附加导航器添加意图标志。
val extras = ActivityNavigator.Extras.Builder()
// Add your flags
.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
.build()
// Navigate with extras
findNavController().navigate(destination, extras)
您可以从 source code
查看ActivityNavigator.navigate()
中如何处理意向标志
或者,如果您要设置的唯一标志是 FLAG_ACTIVITY_SINGLE_TOP
,则可以使用导航选项。
val navOptions = NavOptions.Builder().setLaunchSingleTop(true).build()
findNavController().navigate(destination, navOptions)
您可以从 source code
查看ActivityNavigator.navigate()
中导航选项的检查方式
引用
val extras = ActivityNavigator.Extras.Builder()
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.build()
findNavController().navigate(BlaBlaActivityDirections.actionFooBarToBlaBlaActivity(), extras)
注意您需要将这些标志添加到 activity 堆栈:
FLAG_ACTIVITY_CLEAR_TASK
:设置activity为根任务。用于FLAG_ACTIVITY_NEW_TASK
:将 activity 视为启动器 activity。FLAG_ACTIVITY_REORDER_TO_FRONT
:将 activity 置于最前面。仅当您在堆栈上有其他活动并且您不想清除它时才使用它。