web-dev-qa-db-fra.com

effacer les applications récentes effacer la mémoire des applications et mon récepteur a cessé de fonctionner

Le récepteur de MyApp fonctionne très bien s'il est en arrière-plan, ce qui est:

    public class MySmsReceiver extends WakefulBroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("triggered sms");
        if(intent.getAction().equals(Telephony.Sms.Intents.SMS_RECEIVED_ACTION)) {
          Toast.makeText(context, "message Received", Toast.LENGHT_SHORT).show();
    }
}

et mon fichier manifeste pour le récepteur est

        <receiver Android:name=".MySmsReceiver">
        <intent-filter>
            <action Android:name="Android.provider.Telephony.SMS_RECEIVED" />

        </intent-filter>
    </receiver>

Le document dit que si je déclare un récepteur dans un fichier manifeste, cela devrait toujours fonctionner. mais dans mon cas ce n'est pas ...

Mais chaque fois que j'efface mes applications récentes en les faisant glisser, cela cesse de fonctionner. et après je suis allé à taskmanager et j'ai vu que MyApps forcestop était désactivé comme ci-dessous screenshot of my app in taskmanager

et j'ai compris que certaines applications comme watsapp et fb gardaient toujours en mémoire je dis ce bcoz après le balayage d'applications récentes claires, le gestionnaire de tâches a l'état suivant comme ci-dessous

fb state in task manager

et watsapp state in taskmanager

Comment puis-je faire cela dans mon application .. qu'est-ce qui fera que mon application se comportera comme d'autres applications tierces comme watspp et facebook ... comment puis-je faire en sorte que mon application soit en mémoire toujours Je demande ceci Alors seulement Mon récepteur fonctionnera toujours .. Si je me trompe, donnez-moi une solution pour ce faire ...

J'ai beaucoup cherché et je ne trouve toujours pas la solution ... Est-ce que je demande mal? ou est-il vraiment possible de le faire? S'il vous plaît, quelqu'un m'aide ... Cela me fait une semaine !!! J'espère que j'ai expliqué mon problème ici si je ne me demande pas, je vous donnerai une réponse immédiate.

25
Mr.Popular

Sur certains appareils Huawei (et certains LG et appareils Xiaomi), vous devez ajouter votre application à la liste des applications autorisées à s'exécuter en arrière-plan. Si vous ne le faites pas, une fois votre application est arrêté (en glissant dans la liste des tâches récentes ou en Android tuant l'application pour des raisons de ressources), il ne sera PAS redémarré automatiquement.

Sur les appareils Huawei, le paramètre est appelé "applications protégées". Vous ne pouvez pas ajouter par programme votre application à la liste des "applications protégées". Vous devez dire à l'utilisateur qu'il doit le faire après avoir installé votre application. Des applications bien connues (comme Whatsapp, Facebook, Google Mail) sont automatiquement ajoutées par le fabricant.

Ce comportement peut être différent sur différents appareils et il peut être différent sur différentes versions de Android et il peut être différent si l'appareil est "marqué" pour un opérateur mobile spécifique, comme les opérateurs mobiles peuvent bricoler également avec les paramètres eux-mêmes.

Voir paramètre "Applications protégées" sur les téléphones Huawei et comment le gérer pour plus de détails.

EDIT: ajouté ceci:

En outre, Android Android a brisé le comportement "glisser des recents" dans Android 4.4 (KitKat) afin que cela cause des problèmes pour les applications qui ont été glissées. Les services collants ne ne sont pas redémarrés et diffusés Intents ne sont pas livrés. Il y a ici des informations sur les solutions de contournement pour y faire face: In Android 4.4, swiping app out of recent) tâches tue définitivement l'application avec son service. Une idée pourquoi?

De plus, avez-vous installé votre application sur le Google Play Store? Il est possible que le comportement soit différent pour les applications qui ont été installées à partir du Play Store par rapport aux applications qui sont installées localement (à partir des téléchargements ou via adb ou autre).

19
David Wasser

On dirait que ce scénario se produit dans quelques appareils (Ex: Xiaomi, appareils Honor, appareils Samsung avec fonctionnalité SmartManager, etc.) où l'application est forcée arrêtée lorsque l'utilisateur supprime l'application à partir de tâches récentes.

Cela est dû au fait que ces fabricants ont ajouté la fonction de gestionnaire de tâches par défaut, ce qui force les applications à gérer la mémoire/la batterie. Mais peu d'applications comme Whatsapp, Facebook fonctionnent. Cela peut être dû au fait qu'elles auraient ajouté à la liste blanche les applications les plus célèbres.

Aller par Android Documentation développeur/UX recommandations, une solution de contournement possible pour ce scénario,

Cas des appareils basés sur Xiaomi MIUI:

Créez une UX pour communiquer avec l'utilisateur afin d'activer l'autorisation "AutoStart" sur votre application. Fondamentalement, l'utilisateur doit ouvrir l'application "Sécurité" -> cliquer sur "Autorisations" -> cliquer sur "Démarrage automatique" -> rechercher votre application et l'activer. Je sais que c'est ridicule et douloureux, mais il n'y a pas d'autre option simple.

Faites ce qui précède après avoir vérifié si le fabricant est Xiaomi

String manufacturer = "xiaomi";
        if(manufacturer.equalsIgnoreCase(Android.os.Build.MANUFACTURER)) {
            //this will open auto start screen where user can enable permission for your app
            Intent intent = new Intent();
            intent.setComponent(new ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity"));
            startActivity(intent);
        }

Remarque: Cette procédure peut être différente pour les appareils Honor, les appareils Samsung étant très spécifiques au fabricant.

Également comme un moyen normal de résoudre ce problème pour d'autres appareils, consiste à créer un service collant avec la méthode onTaskRemoved prioritaire. Utilisez le code ci-dessous:

public class BackgroundService extends Service {

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }

    @Override
    public void onTaskRemoved(Intent rootIntent) {
        //create a intent that you want to start again..
        Intent intent = new Intent(getApplicationContext(), BackgroundService.class);
        PendingIntent pendingIntent = PendingIntent.getService(this, 1, intent, PendingIntent.FLAG_ONE_SHOT);
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP, SystemClock.elapsedRealtime() + 5000, pendingIntent);
        super.onTaskRemoved(rootIntent);
    }
}

Ici, le service redémarre après 5 secondes. Vous pouvez le remplacer par n'importe quelle intention que vous souhaitez recommencer après avoir été supprimé des applications récentes.

16
Govind

Si le bouton "Forcer l'arrêt" est désactivé, cela signifie que le fait de glisser l'application dans Aperçu a entraîné l'arrêt forcé de votre application sur cet appareil. Vous ne recevrez aucune diffusion tant que l'utilisateur n'aura plus interagi avec votre application.

0
Steve M