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