Maison  >  Article  >  Comment lancer automatiquement une application Android lors de l'allumage du téléviseur ?

Comment lancer automatiquement une application Android lors de l'allumage du téléviseur ?

王林
王林avant
2024-02-22 13:04:14407parcourir

L'éditeur PHP Xinyi vous propose une séance de questions-réponses Java sur le lancement automatique des applications Android lors de l'allumage du téléviseur. Dans le développement réel, il est parfois nécessaire d'implémenter une telle fonction. Cet article partagera une solution pour vous aider à réaliser facilement cette exigence. Avec le développement continu de la technologie, les développeurs doivent constamment acquérir de nouvelles connaissances et améliorer leur niveau technique. Voyons comment implémenter cette fonctionnalité !

Contenu de la question

J'ai ajouté ces autorisations au manifeste

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

J'ai ajouté bootreceiver à la liste :

<receiver
            android:name="com.portlmedia.streets.bootreceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter android:directbootaware="true">
                <action android:name="android.intent.action.boot_completed" />
                <action android:name="android.intent.action.locked_boot_completed" />
                <action android:name="android.intent.action.quickboot_poweron" />
                <action android:name="android.intent.action.reboot"/>
            </intent-filter>
        </receiver>

J'ai créé bootreceiver dans mon projet :

public class BootReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
            Intent activityIntent = new Intent(context, MainActivity.class);
            context.startActivity(activityIntent);
        }
    }
}

Ma question est la suivante : si vous pouvez m'aider, comment puis-je le tester à l'aide de l'émulateur d'Android Studio ?

J'ai mis un point d'arrêt dans la méthode onreceive mais lorsque je lance l'application, elle ne l'atteint pas J'ai également essayé d'utiliser un redémarrage à froid mais rien n'a fonctionné et je voulais tester si cela fonctionne réellement ou peut-être qu'il y a un problème avec mon code ?

Solution

Étape 1 : Code manifeste

Ajouter des autorisations

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

Dans la classe d'application

<receiver
            android:name=".bootreceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <category android:name="android.intent.category.default" />

                <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>

       <service
            android:name=".appstartservice"
            android:enabled="true"
            android:exported="true"
            android:stopwithtask="false" />

Étape 2 : Obtenez l'autorisation de superposition accordée par l'utilisateur ou

adb shell pm grant com.example.appstart android.permission.system_alert_window

Étape 3 : bootreceiver

class bootreceiver : broadcastreceiver() {

    override fun onreceive(context: context, intent: intent?) {
        log.i(tag, "onreceive: boot received ${intent?.action}")
        val serviceintent = intent(context, appstartservice::class.java)
        contextcompat.startforegroundservice(context, serviceintent)
    }

    companion object {
        private const val tag = "bootreceiver"
    }
}

Étape 4 : Code de service

class AppStartService: Service() {

    override fun onBind(intent: Intent?): IBinder? {
        return null
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        return START_STICKY
    }

    override fun onCreate() {
        super.onCreate()

        startForeground(1, createNotification())

        GlobalScope.launch {
            withContext(Dispatchers.Main) {
                try {
                    val intent = Intent(this@AppStartService, MainActivity::class.java)
                    intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
                    startActivity(intent)
                } catch (ex: Exception) {
                    Log.e(TAG, "onCreate: ", ex)
                }
            }
        }

    }

    private fun createNotification(): Notification {
        val serviceChannel = NotificationChannel(
            CHANNEL_ID,
            "${getString(R.string.app_name)} Service",
            NotificationManager.IMPORTANCE_DEFAULT
        )
        val manager = getSystemService(
            NotificationManager::class.java
        )
        manager.createNotificationChannel(serviceChannel)

        return NotificationCompat.Builder(this, CHANNEL_ID)
            .setContentTitle("${getString(R.string.app_name)} Service")
            .setSilent(true)
            .setContentText("Please restart this device if this service is not running")
            .setSmallIcon(R.mipmap.ic_launcher)
            .build()
    }


    companion object {
        private const val TAG = "AppStartService"
        private const val CHANNEL_ID = "app-start-service"
    }

}

Dans mon cas, la classe bootreceiver reçoit les opérations de fin de démarrage. Alors, travaille pour moi ! Assurez-vous que l'action de fin de démarrage fonctionne sur un périphérique spécifique.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer