Подтвердить что ты не робот

Clear Недавние приложения уничтожают память приложений, и мой ресивер перестает работать

MyApp Receiver работает нормально, если он находится в фоновом режиме:

    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();
    }
}

и мой файл манифеста для получателя

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

        </intent-filter>
    </receiver>

В документе говорится, что если я объявляю приемник в файле манифеста, он всегда должен работать. но в моем случае это не...

Но когда я очищаю свои последние приложения, читая их, он просто перестает работать. и после того, как я подошел к taskmanager и увидел, что MyApps forcestop отключен, как показано ниже снимок экрана моего приложения в taskmanager

и я понял, что некоторые приложения, такие как watsapp и fb, всегда хранятся в памяти, когда я говорю об этом bcoz после прокрутки ясных недавних приложений, все же диспетчер задач имеет следующее состояние, как показано ниже

состояние fb в диспетчере задач

и состояние watsapp в taskmanager

Как я могу сделать это в своем приложении.. что заставит мое приложение вести себя как другие приложения третьей стороны, такие как watspp и facebook... как я могу заставить мое приложение быть в памяти всегда? Я спрашиваю об этом. Тогда только Мой приемник всегда будет работать. Если я ошибаюсь, то дайте мне решение, чтобы сделать это...

Я много искал и все еще не могу найти решение... Я спрашиваю неправильно? или действительно есть способ сделать это? Пожалуйста, помогите мне... Это делает меня неделю!!! Надеюсь, я объяснил свою проблему здесь, если я не спрошу, я дам вам немедленный ответ.

4b9b3361

Ответ 1

На некоторых устройствах Huawei (и некоторых устройствах LG и Xiaomi) вам нужно добавить свое приложение в список приложений, которым разрешено работать в фоновом режиме. Если вы этого не сделаете, как только ваше приложение будет остановлено (путем выбора из списка недавних задач или Android, убивающего приложение по причинам ресурса), он НЕ будет перезагружен автоматически.

На устройствах Huawei этот параметр называется "защищенные приложения". Вы не можете программно добавить свое приложение в список "защищенных приложений". Вы должны сообщить пользователю, что он должен это сделать после того, как вы установили приложение. Известные приложения (например, Whatsapp, Facebook, Google Mail) автоматически добавляются производителем.

Такое поведение может отличаться на разных устройствах, и оно может быть разным в разных версиях Android, и может отличаться, если устройство "заклеймировано" конкретным оператором мобильной связи, поскольку мобильные операторы также могут изменять сами настройки.

См. "Защищенные приложения" настройка на телефонах Huawei и способы их устранения для получения более подробной информации.

EDIT: добавлено следующее:

Кроме того, Android нарушил поведение "перебирать от ретентатов" в Android 4.4 (Kitkat), так что это создает проблемы для прокрутки приложений. Липкие сервисы не распространяются, а трансляция Intent не предоставляется. Существует некоторая информация об обходных решениях для решения этой проблемы: В android 4.4, прокручивание приложения из последних задач постоянно убивает приложение службой. Любая идея, почему?

Также, вы установили приложение из магазина Google Play? Возможно, что поведение отличается от приложений, установленных из магазина Play, и приложений, которые установлены локально (из загрузок или через adb или что-то еще).

Ответ 2

Похоже, что этот сценарий происходит в нескольких устройствах (например: Xiaomi, устройства Honor, устройства Samsung с функцией SmartManager и т.д.), где приложение прекращается, когда пользователь удаляет приложение из последних задач.

Это связано с тем, что по умолчанию эти производители добавили функцию диспетчера задач, которая блокирует приложения для управления памятью/батареей. Но мало работает таких приложений, как Whatsapp, Facebook. Это может быть связано с тем, что они включили бы самые известные приложения.

Следуя документации разработчика Android/рекомендациям UX, возможно обходное решение для этого сценария,

Случаи, основанные на Xiaomi MIUI:

Создайте UX для связи с пользователем, чтобы включить разрешение "AutoStart" для вашего приложения. В основном пользователь должен открыть приложение "Безопасность" → нажать "Разрешения" → нажать "Автозапуск" → найти приложение и включить его. Я знаю его смешное и болезненное, но нет другого простого варианта.

Выполните вышеуказанное, проверив, является ли производитель 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);
        }

Примечание.. Эта процедура может отличаться для устройств Honor, устройств Samsung, которые очень специфичны для производителя.

Также как обычный способ решить эту проблему для других устройств - создать липкую услугу с переопределяющим методом onTaskRemoved. Используйте приведенный ниже код:

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);
    }
}

Здесь услуга начнется через 5 секунд. Вы можете заменить его любыми намерениями, которые вы хотите начать заново после очистки из последних приложений.

Ответ 3

Если кнопка "Силовая остановка" отключена, это означает, что отключение приложения в режиме "Обзор" привело к тому, что ваше приложение остановилось на этом устройстве. Вы не будете получать какие-либо трансляции, пока пользователь не будет снова взаимодействовать с вашим приложением.