Одиночный экземпляр: режим запуска активности программы запуска

<?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, система не запускает никаких других действий в задаче, содержащей экземпляр. Деятельность всегда является единственным членом своей задачи; любые действия, начатые этим, открываются в отдельной задаче.

Но, когда я перешел из Activity A (Launcher Activity) -> Activity B через startActivity (intent *) вместо того, чтобы находиться в новой задаче, Activity B становится поверх задачи Activity A. Хотя, когда я перешел к A из B через startActivity(intent*), он показывает один экземпляр A.

* ФЛАГИ НЕ БЫЛИ ДОБАВЛЕНЫ.

Почему действие B было помещено поверх действия A (поскольку у действия был режим запуска: "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);


person Jatin Sachdeva    schedule 11.09.2017    source источник
comment
опубликуйте свой манифест, пожалуйста   -  person David Wasser    schedule 11.09.2017
comment
@DavidWasser Опубликовал манифест. Спасибо.   -  person Jatin Sachdeva    schedule 11.09.2017
comment
Пожалуйста, попробуйте следующее: установите приложение на телефон. Теперь закройте приложение (перейдите в «Настройки» -> «Приложения» -> «Ваше приложение» -> «Принудительно закрыть»). Теперь запустите приложение с главного экрана, щелкнув значок приложения. Теперь запустите ActivityB. Теперь используйте adb shell dumpsys activity activities и проверьте свои задачи в списке. 1 задание или 2? Разместите соответствующую информацию в своем вопросе, пожалуйста.   -  person David Wasser    schedule 11.09.2017
comment
Спасибо. Выполнили то, что вы сказали, и опубликовали трассировку стека действий, но оба находятся в одной задаче.   -  person Jatin Sachdeva    schedule 12.09.2017
comment
Хм... На каком устройстве вы тестируете? Какая версия Android на этом устройстве? Какой SDK вы компилируете?   -  person David Wasser    schedule 12.09.2017
comment
Также, пожалуйста, опубликуйте код, который вы используете для запуска ActivityB из ActivityA.   -  person David Wasser    schedule 12.09.2017
comment
Устройство: Lenovo k50a40 Версия Android: 5.0 CompileSdkVersion: 25 Код: Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivityForResult(intent, REQUEST_CODE_NOTIFY);   -  person Jatin Sachdeva    schedule 12.09.2017
comment
пожалуйста, добавьте эти детали в вопросе   -  person Amit Vaghela    schedule 12.09.2017


Ответы (1)


Бинго! Наконец-то объяснение этому странному поведению!

Вы сказали, что начинаете SecondActivity с MainActivity следующим образом:

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

При использовании startActivityForResult() запускаемый Activity должен выполняться в той же задаче, что и Activity, ожидающий результата (то есть запускающий Activity). Из-за этого Android игнорирует launchMode из MainActivity и запускает SecondActivity в той же задаче.

Вы создали конфликт, который не задокументирован. Чтобы решить свою проблему, вам нужно решить, чего вы хотите. У вас не может быть singleInstance Activity, который вызывает startActivityForResult(). Либо выберите другой механизм для связи между SecondActivity и MainActivity, либо удалите специальный режим запуска для MainActivity.

Почему вы все равно хотите, чтобы MainActivity было singleInstance? Есть причина для этого?

person David Wasser    schedule 12.09.2017
comment
Большое спасибо. Да, это было причиной. Я думал об этом, но запутался, как указано в документации, Например: если активность, которую вы запускаете, использует FLAG_ACTIVITY_NEW_TASK, она не будет выполняться в вашей задаче, и поэтому вы немедленно получите результат отмены.. В основном я создавал редактор (MainActivity), выполняющий singleInstance . - person Jatin Sachdeva; 12.09.2017
comment
Я до сих пор не понимаю, почему вы думаете, что вам нужно singleInstance. В общем, вам это нужно только в том случае, если вы создаете замену HOME-экрану (которой вы не являетесь). - person David Wasser; 12.09.2017
comment
Вы могли бы принять мой ответ, если он был полезен. Это удалит вопрос из списка вопросов без ответа. Или у вас все еще есть проблемы?? - person David Wasser; 13.09.2017
comment
Да, это было очень полезно. Спасибо. По мере необходимости я обновлю это до замены домашнего экрана. - person Jatin Sachdeva; 14.09.2017