Я хочу скрыть свое приложение программно, когда пользователь нажимает кнопку «Домой» или «Задача».Пользователь может решить, является ли приложение постоянным в фоновом режиме или нет, этот параметр поступает из бэкэнда, поэтому действия перед входом в систему не должны поддерживаться в последних случаях.Я пробовал разные решения, некоторые работают частично, но ни один из них не работает идеально.Я перечислю все методы, которые я использовал.
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 );
он вообще не работает.
Кто-нибудь знает, как этого добиться?