我必须在 Android Manifest 中指定父活动名称吗?
Posted
技术标签:
【中文标题】我必须在 Android Manifest 中指定父活动名称吗?【英文标题】:Must I specify the parent activity name in the Android Manifest? 【发布时间】:2013-10-13 00:26:34 【问题描述】:我有一个开始另一个活动的活动。 我是否必须在 android Manifest 中指定父活动? 我问这个是因为可能还有其他活动也会开始这个活动,所以我应该指定所有这些活动吗?
android:parentActivityName="com.example.myfirstapp.MainActivity"
【问题讨论】:
【参考方案1】:根据docs -> 部分android:parentActivityName
:
系统读取此属性以确定当用户按下操作栏中的向上按钮时应启动哪个活动。系统还可以使用此信息与
TaskStackBuilder
合成一个回溯堆栈。
因此,您只需指定是否要使用向上导航(而不是通过后退按钮导航)或TaskStackBuilder。在其他情况下,您不需要它。
有关详细信息,请参阅up-navigation docs。 (从original 存档,现在重定向到Jetpack Navigation docs on designing navigation graphs)
【讨论】:
【参考方案2】:如果需要向上导航或回栈合成,则应对其进行定义,但请注意,android:parentActivityName
属性是在 API 级别 16 中引入的。
对于以前的版本,父活动信息是从在子 <activity>
标记内声明的 <meta-data>
标记内定义的属性访问的。
例子:
<activity
android:name=".DetailActivity"
android:parentActivityName=".MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity"/>
</activity>
在<meta-data>
标签内,将android:name
属性设置为android.support.PARENT_ACTIVITY
,并将android:value
属性设置为父活动类名(即与分配给android:parentActivityName
的类名相同)。
除非已知 API 级别,否则建议使用 <meta-data>
和内联规范。
有关指定父活动的更多信息,请参阅:https://developer.android.com/training/implementing-navigation/ancestral.html#SpecifyParent
此外,考虑在您的主要<activity>
标记内定义android:launchMode
属性以设置所需的向上导航行为:https://developer.android.com/guide/topics/manifest/activity-element.html#lmode
【讨论】:
【参考方案3】:您不一定需要在AndroidManifest.xml
中定义parentActivity
。您可以使用以下代码启用后退导航:
ActionBar actionBar = getSupportActionBar();
if (actionBar != null)
actionBar.setDisplayHomeAsUpEnabled(true);
并实现这个:
public boolean onOptionsItemSelected(MenuItem item)
int itemId = item.getItemId();
if (itemId == android.R.id.home)
onBackPressed();
return super.onOptionsItemSelected(item);
但是如果你在manifest中定义了parentActivity
,那么系统会读取这个属性来决定当用户按下action bar中的Up按钮时应该启动哪个activity。即,它将创建parentAcivity
的新实例,这意味着它将调用父活动的onCreate()
。
【讨论】:
如你所说,manifest方法创建了一个新实例,那么onOptionsItemSelected不这样做吗?【参考方案4】:您必须在清单中指定您通过 Intent 或 Launchers 调用的每个 Activity,以便系统可以找到它。因此,将一个 Activity 标记为您的应用可以启动的 Launcher,并注册您在应用中调用的所有其他 Activity。
如果你有这样的 BaseActivity:
public class BaseActivity extends Activity
public class MyActivity extends BaseActivity
你只需要注册 MyActivity,因为 BaseActivity 不是由系统调用而是由你调用的。
【讨论】:
如果 BaseActivity 和 MyActivity 有不同的父活动怎么办?【参考方案5】:没有必要像这样在manifest
中指定父活动
android:parentActivityName="com.example.myfirstapp.MainActivity"
对于navigationUp
,您也可以使用setDisplayHomeAsUpEnabled(true);
和onSupportNavigateUp()
方法Take a Look at this
【讨论】:
以上是关于我必须在 Android Manifest 中指定父活动名称吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Android 中指定 Spotify Web API 的国家代码?