【问题标题】:parent activity with implicit intents具有隐含意图的父活动
【发布时间】:2015-07-23 08:50:05
【问题描述】:

我在清单中成功地使用了属性 android:parentActivityName,以便在另一个活动(活动 B)通过推送通知启动时设置父活动(活动 A),例如。然后,如果我返回,我会导航到活动 A。

但是,它不适用于隐式意图。我在清单中为活动 B 声明了一个意图过滤器。当活动 B 从应用程序外部启动时,它似乎不会影响属性 android:parentActivityName (或具有较低 API 的元数据 android.support.PARENT_ACTIVITY)。

在这种情况下如何设置父活动?

清单块:

<activity
        android:name="com.domain.app.activities.ActivityB"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="stateUnchanged"
        android:parentActivityName="com.domain.app.activities.ActivityA" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.domain.app.activities.ActivityA" />
        <intent-filter>
            <category android:name="android.intent.category.DEFAULT" />
            <action android:name="android.intent.action.VIEW" />
            <data android:scheme="http" android:host="domain.com" android:pathPattern=".*" />
        </intent-filter>
    </activity>

感谢任何帮助。

谢谢!

【问题讨论】:

    标签: android android-intent android-activity intentfilter


    【解决方案1】:

    来自开发者文档:https://developer.android.com/training/implementing-navigation/ancestral

    使用新的返回堆栈向上导航 如果您的活动提供任何intent filters 允许其他应用程序启动活动,您应该实现onOptionsItemSelected() 回调,这样如果用户在从另一个应用程序的任务输入您的活动后按下向上按钮,您的应用程序将启动一个新任务向上导航之前的适当返回堆栈。

    您可以通过首先调用shouldUpRecreateTask() 来检查当前活动实例是否存在于不同应用的任务中。如果返回 true,则使用 TaskStackBuilder 构建一个新任务。否则,您可以使用如上所示的navigateUpFromSameTask() 方法。

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        // Respond to the action bar's Up/Home button
        case android.R.id.home:
            Intent upIntent = NavUtils.getParentActivityIntent(this);
            if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
                // This activity is NOT part of this app's task, so create a new task
                // when navigating up, with a synthesized back stack.
                TaskStackBuilder.create(this)
                        // Add all of this activity's parents to the back stack
                        .addNextIntentWithParentStack(upIntent)
                        // Navigate up to the closest parent
                        .startActivities();
            } else {
                // This activity is part of this app's task, so simply
                // navigate up to the logical parent activity.
                NavUtils.navigateUpTo(this, upIntent);
            }
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
    

    注意:为了使 addNextIntentWithParentStack() 方法起作用,您必须在清单文件中声明每个活动的逻辑父级,使用 android :parentActivityName 属性(和相应的元素)如上所述。

    【讨论】:

      【解决方案2】:

      正如开发者网站中提到的“指定您的父活动功能”在 API 级别 16 中提供。

      从 Android 4.1(API 级别 16)开始,您可以通过在元素中指定 android:parentActivityName 属性来声明每个 Activity 的逻辑父级。

      并且它还在那里声明,对于较低的 api 的 android 提供支持库。

      如果您的应用支持 Android 4.0 及更低版本,请在您的应用中包含支持库并在 .然后将父活动指定为 android.support.PARENT_ACTIVITY 的值,匹配 android:parentActivityName 属性。

      这里是链接:http://developer.android.com/training/implementing-navigation/ancestral.html#SpecifyParent

      你也可以看到这个post.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多