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)) {