Скрытие приложения от последних программ программно - PullRequest
0 голосов
/ 07 июня 2018

Я хочу скрыть свое приложение программно, когда пользователь нажимает кнопку «Домой» или «Задача».Пользователь может решить, является ли приложение постоянным в фоновом режиме или нет, этот параметр поступает из бэкэнда, поэтому действия перед входом в систему не должны поддерживаться в последних случаях.Я пробовал разные решения, некоторые работают частично, но ни один из них не работает идеально.Я перечислю все методы, которые я использовал.

1-й метод.ручное удаление задач: удаляет каждую задачу и уничтожает процесс

//remove the app from recents. TODO doesn't remove if app list button is pressed instead of home
            if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                ActivityManager am = (ActivityManager) application.getSystemService(Context.ACTIVITY_SERVICE);
                if (am != null) {
                    List<ActivityManager.AppTask> tasks = am.getAppTasks();
                    if (tasks != null && !tasks.isEmpty()) {
                        tasks.get(0).setExcludeFromRecents(true);
                    }
                }
            } else {
                //TODO API 19
            }

            //kills the process
            android.os.Process.killProcess(android.os.Process.myPid());

Это работает довольно хорошо, но не при нажатии кнопки задач и не для API 19 (на который я нацеливаюсь)

2-й метод: ExitActivity: первое решение, найденное в Интернете.

public class RemoveFromRecentsActivity extends ApplicationLayer {
    @Override protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        if(android.os.Build.VERSION.SDK_INT >= 21)
        {
            finishAndRemoveTask();
        }
        else
        {
            finish();
        }
    }

    public static void exitApplicationAndRemoveFromRecent(Context context)
    {
        Intent intent = new Intent(context, RemoveFromRecentsActivity.class);

        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK  | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_ANIMATION);

        context.startActivity(intent);
    }
}

, которое не работает, потому что я не вызываю его из onPause(), поэтому оно выполняетсяпосле того, как приложение перешло в фоновый режим;Я уверен в этом, потому что в следующий раз, когда я нажимаю на иконку или возобновляю ее с последних записей, она запускает фиктивную операцию.

3-й метод: переопределить startActivity() с excludeFromRecents="true" в началеактивность (Splash)

поэтому в основном у меня есть действие, которое расширяет AppCompatActivity, и все мои действия расширяют его.Я переопределил startActivity():

@Override
    public void startActivity(Intent intent) {
        if (isUserOptIn){
            if (intent.getComponent().getShortClassName().equals(HomepageActivity.class.getName())){
                intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
            }
        } 
        super.startActivity(intent);
    }

Здесь я попытался установить excludeFromRecents="true" для активности всплеска, но если пользователь выбрал использование этой функции, перед выполнением команды необходимо создать новую задачу.Пользователь на главной странице, но не работает.В любом случае приложение удаляется из последних событий.

4-й метод: переопределение startActivity() с excludeFromRecents="false" в первом действии (Всплеск)

@Override
        public void startActivity(Intent intent) {
            if (!isUserOptIn){

                intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
            }
            super.startActivity(intent);
        }

Здесь я сделал противоположное, Splash в ведется в последних и EXCLUDE_FROM_RECENTS добавляется к каждому новому действию, но это не работает.Когда пользователь не подписался, приложение не удаляется из последних выпусков.Я также попытался intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);, думая, что приложение не удалялось, потому что первое действие имело excludeFromRecents="false", но тоже не работало.

5-й метод: переопределение startActivity() с помощью excludeFromRecents="true" в первом действии (Splash)

if (! isUserOptIn){
            intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS );
        }
        if (intent.getComponent().getShortClassName().equals(HomepageActivity.class.getName())){
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK );
            }

Здесь я установил excludeFromRecents="true" в Splash и попытался создать новое задание при открытии HomeActivity независимо от выбора пользователя и добавить FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS к каждому действию при необходимости.Таким образом, приложение всегда удаляется.Противоположный результат, если я установлю excludeFromRecents="false", он всегда будет поддерживаться.

Кажется, что intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK ); он вообще не работает.

Кто-нибудь знает, как этого добиться?

1 Ответ

0 голосов
/ 07 июня 2018

Android будет вызывать onUserLeaveHint(), если приложение собирается в фоновом режиме, потому что пользователь нажал кнопку HOME или TASK.Вы можете установить флаг в этом методе.Затем Android вызовет onPause(), где вы можете проверить флаг, и если флаг установлен, вы можете немедленно позвонить finishAndRemoveTask().

. Вы должны реализовать это поведение во всех действиях (или в базовом действии, которое вывсе остальные действия получены из).

ПРИМЕЧАНИЕ. Это работает только для API 21 и выше


Для API <21 вы, вероятно, можете смоделировать <code>finishAndRemoveTask() примерно так:

Вместо вызова finishAndRemoveTask(), сделайте следующее:

Intent clearIntent = new Intent(this, MyRootActivity.class);
clearIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
                     Intent.FLAG_ACTIVITY_CLEAR_TASK |
                     Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
clearIntent.putExtra("exit", true);
startActivity(clearIntent);

В самом начале onCreate() вашего корня Activity (с ACTION = MAIN и CATEGORY = LAUNCHER),сделать это:

Intent intent = getIntent();
if (intent.hasExtra("exit")) {
    // finish immediately
   finish();
   return;
}
...