Android 错误:未为具有Intent.FLAG\u activity\u NEW\u任务的singleTop活动调用onNewIntent

Android 错误:未为具有Intent.FLAG\u activity\u NEW\u任务的singleTop活动调用onNewIntent,android,Android,startActivity中似乎存在错误 通过在AndroidManifest.xml中将活动设置为具有不同的任务亲缘关系的singleTop,并在调用startActivity时使用Intent.FLAG\u ACTIVITY\u NEW\u TASK,可以在两个任务中创建两个活动(每个任务一个活动) 再次调用startActivity将返回到第一个活动/任务,并调用onNewIntent。但是,第四次调用startActivity将返回到第二个活动/任务,但不会调用onNewIntent 这

startActivity
中似乎存在错误

通过在AndroidManifest.xml中将活动设置为具有不同的任务亲缘关系的
singleTop
,并在调用
startActivity
时使用
Intent.FLAG\u ACTIVITY\u NEW\u TASK
,可以在两个任务中创建两个活动(每个任务一个活动)

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

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

但是,如果还使用了
Intent.FLAG\u ACTIVITY\u SINGLE\u TOP
,则会按预期调用
onNewIntent

AndroidManifest.xml中的
singleTop
似乎与
Intent
中的
Intent.FLAG\u ACTIVITY\u SINGLE\u 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()"); } } 公共类ActivityA扩展活动实现OnClickListener{ 私有字符串标签; @凌驾 创建时的公共void(最终捆绑包savedInstanceState){ super.onCreate(savedInstanceState); tag=getClass().getName(); Log.v(标记“onCreate()”); setContentView(R.layout.main); Button Button=(Button)findViewById(R.id.Button); button.setText(标记.endsWith(“活动A”)?“活动B” :“活动A”); setOnClickListener(此); } @凌驾 公共void onClick(视图v){ 意图; int flags=Intent.FLAG\u活动\u新任务 //| Intent.FLAG_活动_单个_顶部 ; Log.v(标记“onClick()”); 意向=新意向(本, 标记.endsWith(“活动A”)?活动B.class :ActivityA.class); 意图。设置标志(标志); 星触觉(意向); } @凌驾 受保护的void onNewIntent(意图){ Log.v(标记“onNewIntent()”); } } 公共类ActivityB扩展ActivityA{ }
这有点晚了,但因为我刚刚遇到这个- 正如Matt提到的,清单和意图中的标志活动single top并不相同(至少在以前的android版本上是如此)

startActivityUncheckedLocked
方法中:

姜饼-

请看第2204行--

所以它只是检查意图上的启动标志,而不是检查清单。将其与jellybean mr1版本进行比较:

请看第2835行--

因此,似乎在mr1中,除了
launchFlags
(可能是意图本身)之外,他们还检查r.launchMode(可能是
AndroidManifest.xml
值),而在旧版本中,他们只检查意图标志

它实际上是在2012年2月16日固定的,在此提交中:

短版本是-在意图和清单中设置单个顶部标志

(感谢android bug tracker中的相关bug评论,它为我指明了要查找的源文件-)

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>
 if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
                                && taskTop.realActivity.equals(r.realActivity)) {
                if (((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
                        || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP)
                        && taskTop.realActivity.equals(r.realActivity)) {