web-dev-qa-db-fra.com

WakefulBroadcastReceiver est déconseillé

Pour créer un récepteur, je suis étendu WakefulBroadcastReceiver dans mon ancien projet. Mais maintenant c'est deprecated. Au lieu de WakefulBroadcastReceiver quelle Receiver dois-je utiliser maintenant et comment convertir le code ci-dessous avec une nouvelle méthode?

Voici mon code:

 public class TaskFinishReceiver extends WakefulBroadcastReceiver {
    private PowerManager mPowerManager;
    private PowerManager.WakeLock mWakeLock;
    @Override
    public void onReceive(Context context, Intent intent) {
        mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        turnOnScreen();
        Intent wakeIntent = new Intent();

        wakeIntent.setClassName("com.packagename", "com.packagename.activity.TaskFinished");
        wakeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(wakeIntent);
    }


    public void turnOnScreen(){
        mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag");
        mWakeLock.acquire();
    }
}
16
Yeahia2508

Vous pouvez réécrire votre code comme ceci:

    public class TaskFinishReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            //do your stuff in the JobIntentService class
            MyJobIntentService.enqueueWork(context, intent);
        }
    }

Cela fonctionnera puisque, selon la documentation, la nouvelle classe JobIntentService gérera les verrous de réveil et la compatibilité descendante:

Vous n'avez pas besoin d'utiliser WakefulBroadcastReceiver lorsque vous utilisez cette classe. Lors de l'exécution sur Android O, le JobScheduler s'occupera des verrous de réveil pour vous (en tenant un verrou de réveil à partir du moment où vous mettez en file d'attente le travail jusqu'à ce que la tâche soit envoyée et pendant son exécution). exécuté sur les versions précédentes de la plate-forme, cette gestion de verrouillage de réveil est émulée dans la classe ici en appelant directement le PowerManager; cela signifie que l'application doit demander l'autorisation WAKE_LOCK.

8
Bolling

WakefulBroadcastReceiver Obsolète  au niveau API 26.1.0 .

À partir de Android O, les restrictions de vérification des antécédents rendent cette classe plus généralement inutile. (Il n'est généralement pas sûr de démarrer un service à partir de la réception d'une diffusion, car vous n'avez aucune garantie) que votre application est au premier plan à ce stade et donc autorisée à le faire.) À la place, les développeurs doivent utiliser Android.app.job.JobScheduler pour planifier un travail, et cela ne nécessite pas que l'application maintienne un verrou de réveil pendant ce temps (le système se chargera de maintenir un verrou de réveil pour le travail).

public class JobSchedulerService extends JobService {

    @Override
    public boolean onStartJob(JobParameters params) {

        return false;
    }

    @Override
    public boolean onStopJob(JobParameters params) {

        return false;
    }

}

Pour le cas de démonstration, vérifiez

6
IntelliJ Amiya