单实例:启动器活动的启动模式

4
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.jatin.notification">

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
            android:launchMode="singleInstance" > <!-- Activity A -->
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".NotificationActivity"
            >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".MainActivity" />
        </activity>
        <activity
            android:name=".DialogActivity"
            android:excludeFromRecents="true"
            android:noHistory="true"
            android:theme="@style/Theme.AppCompat.Dialog.MinWidth" />
        <activity
            android:name=".SecondActivity" /><!-- Activity B -->
    </application>

</manifest>

根据Single Instance的规则,系统不会在持有该实例的任务中启动任何其他活动。该活动始终是其任务的唯一成员;由此启动的任何活动都会在单独的任务中打开。
但是,当我通过startActivity(intent *)从Activity A(启动器Activity) - > Activity B导航时,B活动并没有在新任务中打开,而是位于A活动所在任务的顶部。 尽管当我通过startActivity(intent *)从B到A导航时,它显示A的单个实例。
* 没有添加任何标志。 为什么将Activity B推到Activity A的顶部(因为Activity的启动模式为“singleInstance”),而不是创建一个新任务? 活动列表:
TaskRecord {14ba4a25#18 A = com.example.nischay.notification U = 0 sz = 2} 运行#1:ActivityRecord {2a37b313 u0 com.example.nischay.notification / .SecondActivity t18} 运行#0:ActivityRecord {1ab16fa7 u0 com.example.nischay.notification / .MainActivity t18}
mResumedActivity:ActivityRecord {2a37b313 u0 com.example.nischay.notification / .SecondActivity t18} mLastPausedActivity:ActivityRecord {1ab16fa7 u0 com.example.nischay.notification / .MainActivity t18} 详情: 设备:Lenovo k50a40 Android版本:5.0 CompileSdkVersion:25 代码 Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivityForResult(intent, REQUEST_CODE_NOTIFY);

谢谢。我已经按照您说的做了,并发布了活动的堆栈跟踪,但两者都在同一个任务中。 - Jatin Sachdeva
嗯...你在测试哪个设备?该设备上安装的是哪个版本的Android系统?你使用的是哪个SDK进行编译? - David Wasser
请提供您在ActivityA中启动ActivityB所使用的代码。 - David Wasser
设备:联想k50a40 安卓版本:5.0 编译SDK版本:25代码: Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivityForResult(intent, REQUEST_CODE_NOTIFY); - Jatin Sachdeva
1
请添加问题的详细信息。 - Amit Vaghela
显示剩余3条评论
1个回答

4

太好了!终于有一个解释这种奇怪行为的方法了!

你说你是这样从MainActivity启动SecondActivity:

Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivityForResult(intent, REQUEST_CODE_NOTIFY);

当使用startActivityForResult()时,启动的Activity必须在与期望结果的Activity(即启动的Activity)相同的任务中运行。因此,Android会忽略MainActivitylaunchMode并在同一任务中启动SecondActivity
您已经创建了一个未记录的冲突。要解决问题,您需要决定自己想要什么。您不能同时拥有一个调用startActivityForResult()singleInstanceActivity。要么选择另一种机制来在SecondActivityMainActivity之间通信,要么移除MainActivity的特殊启动模式。
那么,为什么要让MainActivity成为singleInstance呢?这个原因是什么?

非常感谢。是的,这就是原因。我之前也有这个想法,但是根据文档描述,例如:如果你启动的活动使用FLAG_ACTIVITY_NEW_TASK,它将不会在你的任务中运行,因此你将立即收到取消结果。基本上,我正在创建一个实现“singleInstance”的编辑器(MainActivity)。 - Jatin Sachdeva
我仍然不明白为什么你认为你需要 singleInstance。通常只有在创建 HOME 屏幕替代品时才需要它(而你并没有这样做)。 - David Wasser
如果我的回答有帮助的话,您可以接受我的答案。这将从未回答问题的列表中移除该问题。或者您还有问题吗? - David Wasser
是的,非常有帮助。谢谢。 根据要求,我将把它更新为主屏幕替代品。 - Jatin Sachdeva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接