startActivity
似乎有一个错误 .
通过在AndroidManifest.xml中将活动设置为 singleTop
,在调用 startActivity
时使用 Intent.FLAG_ACTIVITY_NEW_TASK
,可以在两个任务中创建两个活动(每个任务一个活动) .
再次调用 startActivity
将返回第一个活动/任务并调用 onNewIntent
. 但是,第二次调用 startActivity
将返回第二个活动/任务,但不会调用 onNewIntent
.
两个任务之间的唯一区别是他们的 taskAffinity
. 不知何故,观察到不对称行为 .
但是,如果也使用 Intent.FLAG_ACTIVITY_SINGLE_TOP
,则按预期调用 onNewIntent
.
看起来AndroidManifest.xml中的 singleTop
与 Intent
中的 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 回答
这有点晚了,但是因为我刚刚遇到过这个问题 - 正如马特所提到的那样,清单和意图中的旗帜活动单顶是不一样的(至少在以前版本的android上) .
在
startActivityUncheckedLocked
方法:在姜饼上 - https://github.com/android/platform_frameworks_base/blob/gingerbread/services/java/com/android/server/am/ActivityStack.java
看看2204行 -
所以它只是检查意图上的启动标志,而不是检查清单 . 将其与jellybean mr1版本进行比较:
https://github.com/android/platform_frameworks_base/blob/jb-mr1-release/services/java/com/android/server/am/ActivityStack.java
看看2835行 -
所以似乎在mr1中,除了
launchFlags
(可能是意图本身)之外,它们还在检查r.launchMode(可能是AndroidManifest.xml
值),而在旧版本中,它们只是检查意图标志 .它实际上已于2012年2月16日在此提交中修复:https://github.com/android/platform_frameworks_base/commit/f363dfd26c304bca33f12065a9ed3de291193962
短版本是 - 在intent和manifest中设置单个顶部标志 .
(感谢这个关于android bug跟踪器中相关错误的评论,指出我要查看哪个源文件 - http://code.google.com/p/android/issues/detail?id=4155#c9) .