Что может привести к тому, что startTaskLock закрепит, а затем сразу же открепит действие?

Я пытался использовать блокировку/закрепление задач Android 6.0, чтобы заблокировать свою активность. Вроде работает ненадежно. Иногда, когда я запускаю свое приложение, оно закрепляется, и все скрыто, как и должно быть. В других случаях он пытается, но на самом деле не принимает. Например, я получаю тост с надписью «Экран закреплен», за которым сразу следует всплывающее сообщение с надписью «Экран не закреплен». Конечным результатом является то, что приложение не полностью закреплено (скрываются значки дома и переключателя задач). Но когда это происходит в этом цикле, кажется, что это не работает, даже если я продолжаю пытаться. Это также проблема при загрузке, аналогичная тому, что сообщается здесь:

Активность PIN-кода Android при загрузке

Есть ли способ узнать, что заставляет Android открепить мою активность? Это расстраивает, потому что не дает никаких указаний, почему это не работает.


person Will Young    schedule 01.05.2017    source источник
comment
Недавно я узнал, что запуск другого действия приведет к тому, что закрепленное действие больше не будет закреплено.   -  person portfoliobuilder    schedule 22.07.2017


Ответы (1)


Наш планшет Lenovo не смог закрепить задачу там, где жила домашняя активность. Решение состояло в том, чтобы иметь две активности в двух разных задачах.

Домашняя деятельность

Это действие запускается при загрузке в качестве средства запуска, и его единственная ответственность заключается в немедленном открытии основного действия. Обратите внимание, что он прозрачен и имеет разное соответствие задачам.

<activity
    android:name=".HomeActivity"
    android:clearTaskOnLaunch="true"
    android:configChanges="orientation|screenSize"
    android:launchMode="singleTask"
    android:resumeWhilePausing="true"
    android:stateNotNeeded="true"
    android:taskAffinity="${applicationId}.home"
    android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>

        <category android:name="android.intent.category.HOME"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

Активность также запустит основную активность в своих onCreate и onNewIntent (поскольку это активность singleTask). Вот код на Котлине:

class HomeActivity : Activity() {
    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        handleIntent(intent)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        handleIntent(intent)
    }

    private fun handleIntent(intent: Intent) {
        val i = packageManager.getLaunchIntentForPackage(packageName)
        startActivity(i)
    }
}

Основная деятельность

Это ваша основная деятельность - основная точка входа в ваше приложение, его можно запустить из любого лаунчера. Он имеет сходство задач по умолчанию (которое равно идентификатору приложения).

<activity
    android:name=".webview.activity.RealWebViewActivity"
    android:clearTaskOnLaunch="true"
    android:configChanges="orientation|screenSize"
    android:exported="false"
    android:launchMode="singleTask"
    android:resumeWhilePausing="true"
    android:stateNotNeeded="true">

    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>

        <category android:name="android.intent.category.LAUNCHER"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>

</activity>
person Eugen Pechanec    schedule 30.08.2017