gpt4 book ai didi

android - 错误 : onNewIntent not called for singleTop activity with Intent. FLAG_ACTIVITY_NEW_TASK

转载 作者:IT王子 更新时间:2023-10-28 23:32:03 25 4
gpt4 key购买 nike

startActivity 中似乎存在错误.

通过将 Activity 设置为 singleTop与不同taskAffinity在 AndroidManifest.xml 中并使用 Intent.FLAG_ACTIVITY_NEW_TASK调用startActivity时,可以在两个任务中创建两个 Activity (每个任务一个 Activity )。

调用startActivity再次将返回到第一个 Activity/任务和 onNewIntent叫做。但是,调用 startActivity第四次将返回到第二个 Activity/任务,但 onNewIntent没有被调用。

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

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

似乎 singleTop AndroidManifest.xml 中的 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> 

最佳答案

这有点晚了,但因为我刚刚遇到这个 -正如马特所提到的, list 和 Intent 中的标志 Activity 单顶是不一样的(至少在以前版本的 android 上)。

startActivityUncheckedLocked方法中:

Gingerbread - https://github.com/android/platform_frameworks_base/blob/gingerbread/services/java/com/android/server/am/ActivityStack.java

查看第 2204 行 --

 if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
&& taskTop.realActivity.equals(r.realActivity)) {

所以它只是检查 Intent 上的启动标志,而不是检查 list 。将此与 jellybean mr1 版本进行比较:

https://github.com/android/platform_frameworks_base/blob/jb-mr1-release/services/java/com/android/server/am/ActivityStack.java

查看第 2835 行 --

                if (((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
|| r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP)
&& taskTop.realActivity.equals(r.realActivity)) {

所以似乎在 mr1 中,除了 launchFlags (可能是 Intent 本身)之外,他们正在检查 r.launchMode (可能是 AndroidManifest.xml 值) ,而在旧版本中,它们只检查 Intent 标志。

它实际上是在 2012 年 2 月 16 日修复的,在这个提交中: https://github.com/android/platform_frameworks_base/commit/f363dfd26c304bca33f12065a9ed3de291193962

短版本是 - 在 Intent 和 list 中设置单个顶部标志。

(感谢对 android bug tracker 中相关 bug 的评论指出要查看哪个源文件 - http://code.google.com/p/android/issues/detail?id=4155#c9)。

关于android - 错误 : onNewIntent not called for singleTop activity with Intent. FLAG_ACTIVITY_NEW_TASK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4020909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com