web-dev-qa-db-fra.com

Le service d'arrière-plan ne fonctionne pas à Oreo

Je souhaite exécuter mon application en arrière-plan si je tue également l'instance de l'application. Mais après avoir tué mon application, le service cesse également de fonctionner. Voici mon code s'il vous plaît, aidez-moi à résoudre mon problème.

J'ai suivi ce lien pour une exécution en arrière-plan, mais cela ne fonctionne pas si je supprime l'instance. S'il vous plaît, quelqu'un peut-il me montrer comment exécuter un service en arrière-plan si l'instance est également supprimée?

Ceci est mon activité principale

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ctx = this;
    setContentView(R.layout.activity_main);
    Intent alarmIntent = new Intent(MainActivity.this, AlarmReceiver.class);
    pendingIntent = PendingIntent.getBroadcast(MainActivity.this, ALARM_REQUEST_CODE, alarmIntent, 0);
    mSensorService = new SensorService(getCtx());
    mServiceIntent = new Intent(getCtx(), mSensorService.getClass());
    if (!isMyServiceRunning(mSensorService.getClass())) {
        startService(mServiceIntent);
    }
}

C'est ma classe de service

   public class SensorService extends Service{

public int counter=0;
public SensorService(Context applicationContext) {
    super();
    Log.i("HERE", "here I am!");
}

public SensorService() {
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent, flags, startId);
    startTimer();
    return START_STICKY;
}
@Override
public void onDestroy() {
    super.onDestroy();
    Log.i("EXIT", "ondestroy!");
    Intent broadcastIntent = new Intent("uk.ac.shef.Oak.ActivityRecognition.RestartSensor");
    sendBroadcast(broadcastIntent);
  }

private Timer timer;
private TimerTask timerTask;
long oldTime=0;
public void startTimer() {
    //set a new Timer
    timer = new Timer();

    //initialize the TimerTask's job
    initializeTimerTask();

    //schedule the timer, to wake up every 1 second
    timer.schedule(timerTask, 1000, 1000); //
}

/**
 * it sets the timer to print the counter every x seconds
 */
public void initializeTimerTask() {
    timerTask = new TimerTask() {
        public void run() {
            Log.i("in timer", "in timer ++++  "+ (counter++));
        }
    };
}

/**
 * not needed
 */


@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

}

1
gowthami

C'est une longue histoire . J'ai traversé ça. Toujours mis en œuvre. Maintenant, mon service s'exécute sur chaque événement boot_complete et continue à fonctionner tout le temps (avec une notification).

  • Documentation officielle:

Big NO. La documentation destinée aux développeurs de Google Android est médiocre et ne contient pas non plus d'exemple approprié. C'est théorique et juste théorique. Continuez à lire si intéressé

https://developer.Android.com/about/versions/oreo/background

Synopsis 1: Vous ne pouvez recevoir que BOOT_COMPLETE et seulement quelques émissions dans le récepteur traditionnel. Restez tous les récepteurs de diffusion dont vous avez besoin pour implémenter le runtime dans un service en les enregistrant via un code du service qui s'exécute toujours.

Synopsis 2: Encore une fois, vous ne pouvez pas toujours avoir des processus en cours d'exécution supérieurs ou égaux à 8.0 (Oreo) ... Pour obtenir un processus toujours identique ... Créez une Intentservice avec notification appropriée de type ongoing et de OnStartCommandSTART_STICKY et d'inscrire le destinataire avec le code dans OnCreate

Comment l'implémenter: Je l'ai implémenté, prenez référence à partir d'ici: Oreo: Récepteur de diffusion Ne fonctionne pas

Maintenant, votre question: je veux exécuter mon application en arrière-plan si je tue également l'instance d'application .

Avec l'aide du lien ci-dessus de ma mise en œuvre, vous pouvez le réaliser 

*Termes et conditions

Votre système d'exploitation doit avoir le système d'exploitation Android approprié publié et gravé tel quel.

Oui, j'utilise Android:

No... You are Using Funtouch OS : VIVO ( By modifying Android)

COLOR OS comprend de nombreux appareils: OPPO (En modifiant Android) .... ....

  1. Déjà, Google a compliqué les choses ... version par version ....
  2. Sans documentation appropriée et exemples de codes ....
  3. Et maintenant Des fabricants de périphériques mobiles indépendants apportant de nombreux changements de to allow only selective applications run in background Comme WhatsApp, Facebook, GoogleTwitterInstagram

Maintenant, vous allez poser une question aux développeurs Si ces applications fonctionnent en arrière-plan, je peux les exécuter en arrière-plan aussi ....

Non ... Ce sont des modifications basées sur le système d'exploitation permettant de vérifier si un service provient de fournisseurs autorisés, il est le seul à pouvoir y être actif en arrière-plan. S'ils refusent ces fournisseurs, personne ne prend de téléphones qui n'exécutent pas ces fameuses applications sociales.

Hushhhhhhhh .......

1
sandhya sasane

Oreo Introduit

nouveau Concept PIP (mode Image dans Image) et contrôle des catégories de services en créant des canaux et leur priorité. Vous devez modifier le code uniquement pour oreo afin de créer des notifications et des services. 

lisez attentivement la documentation destinée aux développeurs google ici. https://developer.Android.com/guide/topics/ui/notifiers/notifications Les codes Java et Kotlin sont disponibles ici pour créer notification dans oreo 

https://developer.Android.com/training/notify-user/build-notification

c'était mon effort pour trouver la solution après avoir cherché et partagé avec vous.

voici un exemple de code:

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this, CHANNEL_ID)
    .setSmallIcon(R.drawable.notification_icon)
    .setContentTitle("My notification")
    .setContentText("Much longer text that cannot fit one line...")
    .setStyle(new NotificationCompat.BigTextStyle()
            .bigText("Much longer text that cannot fit one line..."))
    .setPriority(NotificationCompat.PRIORITY_DEFAULT);

pour créer des canaux, écrivez ce code:

private void createNotificationChannel() {
// Create the NotificationChannel, but only on API 26+ because
// the NotificationChannel class is new and not in the support library
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    CharSequence name = getString(R.string.channel_name);
    String description = getString(R.string.channel_description);
    int importance = NotificationManager.IMPORTANCE_DEFAULT;
    NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
    channel.setDescription(description);
    // Register the channel with the system; you can't change the importance
    // or other notification behaviors after this
    NotificationManager notificationManager = getSystemService(NotificationManager.class);
    notificationManager.createNotificationChannel(channel);
}

}

vous pouvez voir les détails complets des notifications Push et de l'envoi de messages en cliquant sur les liens ci-dessus.

0
Najaf Ali

Vous devez créer ForegroundService afin de poursuivre le traitement lorsque votre application est supprimée, comme suit:

 public class SensorService extends Service{
    ... 
    private PowerManager.WakeLock wakeLock;
    @Override
    public void onCreate() {
        super.onCreate();
        ...
        //wake lock is need to keep timer alive when device goes to sleep mode          
        final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "PARTIAL_WAKE_LOCK_TAG");
        createNotificationChannel(this);
        Notification notification = new NotificationCompat.Builder(this, "NOTIFICATION_CHANNEL").setSmallIcon
                (<icon>).setContentTitle("Title")
                .setContentText("Content").build();

        startForeground(1001, notification);
    }
    ...
    @Override
    public void onDestroy() {
        super.onDestroy();
        if (wakeLock.isHeld()) {
            wakeLock.release();
        }
        ...
    }

     public void createNotificationChannel() {
        // Create the NotificationChannel, but only on API 26+ because
        // the NotificationChannel class is new and not in the support library
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

            CharSequence name = "Channel name";
            String description = "Description";
            int importance = NotificationManager.IMPORTANCE_DEFAULT;
            NotificationChannel channel = new NotificationChannel("NOTIFICATION_CHANNEL", name, importance);
            channel.setDescription(description);
            NotificationManager notificationManager = getApplicationContext().getSystemService(NotificationManager.class);
            notificationManager.createNotificationChannel(channel);
        }
    }
    ...
}

Pour démarrer le service:

Intent i = new Intent(context, SensorService.class);
ContextCompat.startForegroundService(context, i)

Remarque:

  • Vous ne pouvez pas exécuter le service sans fin avec cette approche. Pendant le mode assoupissement, si le système d'exploitation le reconnaît comme une utilisation intensive du processeur, votre service sera interrompu.
  • Vous devez appeler stopSelf() lorsque votre tâche de minuterie a été exécutée avec succès.
0
Sagar