0

我通过深层链接启动了活动 B,我希望活动 A在单击向上按钮时启动。

这是我的清单

<activity
    android:name=".ui.activity.B"
    android:label="@string/title_activity_search"
    android:parentActivityName=".ui.activity.A" >

    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value=".ui.activity.A"/>
        ...
        <!-- deep link -->
        ...     
</activity>

B 活动代码在这里。

public class B extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
Toolbar vToolbar = ((Toolbar) findViewById(R.id.toolbar));
        setSupportActionBar(vToolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        // Respond to the action bar's Up/Home button
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

您可以复制/粘贴此代码,如果Activity B 扩展FragmentActivity ,它就可以工作。但我需要这个与AppCompatActivity一起工作。我究竟做错了什么?

4

1 回答 1

2

您正在Activity从另一个应用程序中打开您的。所以Activity堆栈中没有其他可用的。因此,当您按下向上按钮时,您不应该让父母Activity出现在前面。如果目标父活动在任务的后栈中,则将其提前。来自开发者文档

但是,navigateUpFromSameTask()只有当您的应用程序是当前任务的所有者(即用户从您的应用程序开始此任务)时,才适合使用。如果不是这样,并且您的活动是在属于不同应用程序的任务中启动的,那么向上导航应该会创建一个属于您的应用程序的新任务,这需要您创建一个新的后退堆栈。

因此,在您的情况下,您需要执行文档中所述的类似操作。

如果您的活动提供任何允许其他应用程序启动活动的意图过滤器,您应该实现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);
}
于 2017-09-29T19:52:50.970 回答