TransWikia.com

Как включить приложение после перезагрузки или зарядки на Api 27+?

Stack Overflow на русском Asked by Binary on November 5, 2021

Приложение должно включатся после рестарта телефона и при подключении зарядки, я сделал это так:

manifest

<receiver android:name=".ChargingReceiver">
    <intent-filter>
         <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
    </intent-filter>
</receiver>


<receiver
     android:name=".RestartReceiver" >
     <intent-filter>
         <action
            android:name="android.net.conn.CONNECTIVITY_CHANGE"
            tools:ignore="BatteryLife" />
         <action android:name="android.intent.action.BOOT_COMPLETED" />
         <action android:name="android.intent.action.QUICKBOOT_POWERON" />
         <action android:name="com.htc.intent.action.QUICKBOOT_POWERON" />
     </intent-filter>
</receiver>

RestartReceiver

class RestartReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        if (intent!!.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {

            val intent = Intent(context, MainActivity::class.java)
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
            context!!.startActivity(intent)
        }
    }
}

ChargingReceiver

class ChargingReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        val intent = Intent(context, MainActivity::class.java)
        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
        context.startActivity(intent)
    }
}

Все работает до Api27+. Почитал что на Api27+ нужно использовать JobScheduler, но не могу найти информацию по конкретно моей задаче, это вообще можно сделать на 27+? Если да подскажите пожалуйста как.

One Answer

Начиная c версии 8 (api 26) согласно документации броадкаст ресиверы зарегистрированные статически(в манифесте) не принимают неявные (без указания класса) интенты. Вам надо в методе onResume() зарегистрировать свои ресиверы, а так же передать им интент фильтр с необходимыми действиями

private lateinit var chargingReceiver: ChargingReceiver

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    chargingReceiver = ChargingReceiver()
}

override fun onResume() {
        super.onResume()
        val intentFilter = IntentFilter()
        intentFilter.addAction(Intent.ACTION_POWER_CONNECTED)
        registerReceiver(chargingReceiver, intentFilter)
}

А в методе onStop() убрать регистрацию

override fun onStop() {
        super.onStop()
        unregisterReceiver(chargingReceiver)
}

Но это не решит все ваши проблемы. Я лишь ответил на вопрос почему ваши ресиверы не реагируют на интенты. Для решения всех остальных задач я рекомендую детальнее ознакомится с использованием сервисов и процессом автозагрузки приложений.

Answered by blind.falcon on November 5, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP