【问题标题】:Must I specify the parent activity name in the Android Manifest?我必须在 Android Manifest 中指定父活动名称吗?
【发布时间】:2013-10-13 00:26:34
【问题描述】:

我有一个开始另一个活动的活动。
我是否必须在 Android Manifest 中指定父活动? 我问这个是因为可能还有其他活动也会开始这个活动,所以我应该指定所有这些活动吗?

android:parentActivityName="com.example.myfirstapp.MainActivity" 

【问题讨论】:

    标签: android android-activity android-manifest android-navigation


    【解决方案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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多