1

我有一个简单的应用程序。它由活动 A 和活动 B 组成。

当我从 Activity A(从启动器图标)开始,然后导航到 Activity B,然后点击向上按钮。我到达活动 A。完美。

然而,当我从命令行启动活动 B(模拟另一个应用程序或启动此活动的通知)并点击向上按钮时,我只是被带到主屏幕。

这是我的设置:

活动一

public class ActivityA extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(ActivityA.this, ActivityB.class);
                startActivity(intent);
            }
        });

    }


}

活动 B

public class ActivityB extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_b);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }
}

我的清单。请注意,父活动已定义,我的 app min api 为 16(因此父活动声明对 16 及以上有效)。

   <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".ActivityA"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".ActivityB"
            android:exported="true"
            android:label="@string/title_activity_b"
            android:parentActivityName=".ActivityA"
            android:theme="@style/AppTheme.NoActionBar" />
    </application>

要从 cmd 行启动 ActivityB,我使用:adb shell am start com.example.demo/com.example.demo.ActivityB

编辑 1

根据这里的文档:https ://developer.android.com/training/appbar/up-action.html

您不需要在活动的 onOptionsItemSelected() 方法中赶上行动。相反,该方法应该调用其超类,如响应操作中所示。超类方法通过导航到应用清单中指定的父 Activity 来响应 Up 选择。

编辑2:

只是为了好玩,我在这里尝试了两个代码片段。一次一个,看看他们是否会成功。但他们没有。ActivityA 没有打开。ActivityB 刚刚关闭。

https://developer.android.com/training/implementing-navigation/ancestral.html

@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);
}

@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);
}

发生了什么与预期? 当我通过 cmd 行打开 ActivityB 并点击时,我希望在 ActivityB 关闭时转到 ActivityA。实际发生的是 ActivityB 刚刚关闭。

4

1 回答 1

0

这是默认行为,向上导航按钮与 一起使用Activity Stack,如果ActivityA不在堆栈中,Android则将返回上一个屏幕,在本例中为 Home。

于 2017-04-13T23:58:22.827 回答