首页 文章

错误:onNewIntent没有使用Intent.FLAG_ACTIVITY_NEW_TASK调用singleTop活动[关闭]

提问于
浏览
18

startActivity 似乎有一个错误 .

通过在AndroidManifest.xml中将活动设置为 singleTop ,在调用 startActivity 时使用 Intent.FLAG_ACTIVITY_NEW_TASK ,可以在两个任务中创建两个活动(每个任务一个活动) .

再次调用 startActivity 将返回第一个活动/任务并调用 onNewIntent . 但是,第二次调用 startActivity 将返回第二个活动/任务,但不会调用 onNewIntent .

两个任务之间的唯一区别是他们的 taskAffinity . 不知何故,观察到不对称行为 .

但是,如果也使用 Intent.FLAG_ACTIVITY_SINGLE_TOP ,则按预期调用 onNewIntent .

看起来AndroidManifest.xml中的 singleTopIntent 中的 Intent.FLAG_ACTIVITY_SINGLE_TOP 不同 .

public class ActivityA extends Activity implements OnClickListener {
    private String tag;

    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        tag = getClass().getName();
        Log.v(tag, "onCreate()");

        setContentView(R.layout.main);
        Button button = (Button)findViewById(R.id.button);
        button.setText(tag.endsWith("ActivityA") ? "Activity B"
                : "Activity A");
        button.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Intent intent;
        int flags = Intent.FLAG_ACTIVITY_NEW_TASK
        // | Intent.FLAG_ACTIVITY_SINGLE_TOP
        ;

        Log.v(tag, "onClick()");

        intent = new Intent(this,
                tag.endsWith("ActivityA") ? ActivityB.class
                        : ActivityA.class);
        intent.setFlags(flags);
        startActivity(intent);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        Log.v(tag, "onNewIntent()");
    }
}
public class ActivityB extends ActivityA {

}
<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.test"
    android:versionCode="1"
    android:versionName="1.0">
    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name">

        <activity
            android:name=".ActivityA"
            android:launchMode="singleTop"
            android:label="Activity A">
            <intent-filter>
                <action
                    android:name="android.intent.action.MAIN" />
                <category
                    android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name=".ActivityB"
            android:launchMode="singleTop"
            android:label="Activity B"
            android:taskAffinity="activity.B">
        </activity>

    </application>
</manifest>

1 回答

相关问题