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 correctement s'il est en arrière-plan:

    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, il n'est pas...

Mais chaque fois que j'efface mes applications récentes en les faisant glisser, il a juste cessé de fonctionner. et après je suis allé à taskmanager et j'ai vu que MyApps forcestop était désactivé comme ci dessous capture d'écran de mon application dans taskmanager

Et je l'ai compris quelques applications comme watsapp et fb toujours gardé en mémoire je dis ce bcoz après le balayage des applications récentes claires encore le Gestionnaire des tâches a l'état suivant comme ci-dessous

état fb dans le Gestionnaire des tâches

Et état watsapp dans taskmanager

Comment puis-je le faire dans mon application.. qu'est-ce qui a fait mon application pour se comporter comme d'autres applications tierces comme watspp et facebook...Comment puis-je faire en sorte que mon application soit toujours en mémoire, je le demande alors seul mon récepteur fonctionnera toujours.. Si je me trompe alors donnez moi une solution à faire ce...

J'ai beaucoup cherché et je ne trouve toujours pas la solution... Suis-je demander de mal? ou est-il vraiment un moyen de le faire? Veuillez quelqu'un de m'aider... Ça me fait une semaine!!! J'espère que j'ai expliqué mon problème ici si Je ne suis pas me demander je vais vous donner une réponse immédiate.

21
demandé sur AndroidHacker 2016-12-22 10:17:34

3 réponses

Sur certains appareils Huawei (et certains appareils LG et Xiaomi), vous devez ajouter votre application à la liste des applications autorisées à fonctionner en arrière-plan. Si vous ne le faites pas, une fois que votre application est arrêtée (en balayant de la liste des tâches récentes, ou par 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 votre application par programme à la liste des "applications protégées". Vous devez indiquer à l'utilisateur qu' il doit le faire après avoir installé votre application. Les 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 D'Android et il peut être différent si l'appareil est "marqué" pour un opérateur mobile spécifique, car les opérateurs mobiles peuvent également bricoler avec les paramètres eux-mêmes.

Voir Paramètres"Applications protégées" sur les téléphones Huawei, et comment gérer pour plus de détails.

Modifier: ajouté ceci:

En outre, Android a cassé le comportement "swipe from recents" dans Android 4.4 (Kitkat) de sorte qu'il provoque des problèmes pour les applications qui ont été balayées. Les services collants ne sont pas retardés et les Intentde diffusion ne sont pas livrés. Il y a quelques informations ici sur les solutions de contournement pour faire face à cela: dans android 4.4, glisser l'application hors des tâches récentes tue définitivement l'application avec son service . Aucune idée Pourquoi?

En outre, avez-vous installé votre application à partir du 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 de téléchargements ou via adb ou autre).

16
répondu David Wasser 2017-05-23 12:34:21

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

En effet, ces fabricants ont ajouté la fonction Gestionnaire des tâches par défaut qui force arrête les applications pour la gestion de la mémoire/batterie. Mais peu d'applications comme Whatsapp, Facebook fonctionne. Cela peut être parce qu'ils auraient whitelisted le plus célèbre application.

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

Cas Xiaomi MIUI appareils basés:

Créez un UX pour communiquer à l'utilisateur afin d'activer l'autorisation "AutoStart" à votre application. Fondamentalement, l'utilisateur doit ouvrir" Sécurité "app - > cliquez sur "Autorisations" - > cliquez sur "Autostart" - > Recherchez votre application et l'activer. Je sais que c'est ridicule et douloureux, mais il n'y a pas d'autre simple option.

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.

Aussi comme un moyen normal de résoudre ce problème pour d'autres périphériques, est de créer un service collant avec la méthode onTaskRemoved de substitution. 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 voulez recommencez après avoir été effacé des applications récentes.

15
répondu Govind 2016-12-29 06:10:20

Si le bouton" arrêt forcé " est désactivé, cela signifie que le fait de balayer l'application dans la vue D'ensemble a provoqué l'arrêt forcé de votre application sur cet appareil. Vous ne recevrez aucune diffusion jusqu'à ce que l'utilisateur interagisse à nouveau avec votre application.

0
répondu Steve M 2016-12-28 07:44:57