我必须在 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>

&lt;meta-data&gt; 标签内,将android:name 属性设置为android.support.PARENT_ACTIVITY,并将android:value 属性设置为父活动类名(即与分配给android:parentActivityName 的类名相同)。

除非已知 API 级别,否则建议使用 &lt;meta-data&gt; 和内联规范。

有关指定父活动的更多信息,请参阅:https://developer.android.com/training/implementing-navigation/ancestral.html#SpecifyParent

此外,考虑在您的主要&lt;activity&gt; 标记内定义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 的国家代码?

从 Java 代码中指定 DIP 尺寸的正确方法是啥?

在 .NET 中指定 DllImport 的搜索路径

为啥我必须在 Java 正则表达式中指定整个字符串? [复制]

如何在python函数中指定传递的参数必须是函数[重复]

如何在 Android Studio 中指定 JDK 版本?