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

Запуск активности из сервиса после нажатия кнопки HOME без задержки 5 секунд

Я столкнулся с проблемой, описанной в этой проблеме с Android: http://code.google.com/p/android/issues/detail?id=4536

Проще говоря, после нажатия кнопки HOME, андроид не позволяет службам и вещательным приемникам вызывать startActivity в течение 5 секунд.

Я также заметил, что (ну, теоретически), имея следующее разрешение:

"android.permission.STOP_APP_SWITCHES"

позволяет вам вызвать resumeAppSwitches (который определен в ActivityManagerService). Если посмотреть на последнюю версию ActivityManagerService, этот код будет удален.

Вопрос: Как запустить активность с использованием startActivity без этой 5-секундной задержки?

4b9b3361

Ответ 1

Я не думаю, что есть способ сделать это с помощью существующих API. Я думаю, именно так они намеревались работать, чтобы приложение не могло заставить себя открыться, когда пользователь выходит с домашним нажатием клавиши. Вы можете добавить намерение home/launcher к фильтру для любой активности, которую вы пытаетесь запустить. Тогда у пользователя будет выбор, чтобы в основном рассматривать это приложение, как будто это рабочий стол. Затем он запускается без каких-либо задержек, когда пользователь нажимает кнопку "домой" (им нужно будет выбрать его из списка, который появится, чтобы спросить, какое приложение они хотят использовать для завершения этого действия, но они могут всегда проверять использование это приложение, чтобы отложить этот шаг в будущем.)

Ответ 2

Вот решение, которое я нашел.

Поместите свое намерение, которое вы хотите немедленно запустить в PendingIntent, затем вызовите метод send() на нем.

Итак, вместо этого

Intent intent = new Intent(context, A.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);

просто сделайте это

Intent intent = new Intent(context, A.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                PendingIntent pendingIntent =
                        PendingIntent.getActivity(context, 0, intent, 0);
                try {
                    pendingIntent.send();
                } catch (PendingIntent.CanceledException e) {
                    e.printStackTrace();
                }

Ответ 3

Я тоже заинтригован этой "особенностью" и как ее избежать. Чтение сообщения: http://code.google.com/p/android/issues/detail?id=4536 (читайте комментарий # 10).

Я цитирую соответствующую часть ниже:

Обходные пути:

1) Не используйте деятельности, делать все от оказание услуг.

2) Есть какие-то промежуточный дом (WidgetLocker HomeHelper, QuickDesk, PowerStrip, и т.д). Они делают startActivity немедленно начать "настоящий" Дом и это обходит правило 5 секунд. Эта это плохая идея, поскольку Android уделяет первоочередное внимание сохранение системы Home в памяти, но не промежуточный набор. Поэтому это может привести к Launcher перезагружается, что не забавно. плюс это очень запутывает пользователей.

3) Корень может начать работу во время этого период.

Среди тех, кто считает, что лучший способ сделать это - создать "домашний помощник", подобный активности. Итак, вместо запуска нового действия вы бы назвали это вместо. Это особенно верно, поскольку вы создаете приложение для запуска.

Как я уже сказал в своем предыдущем комментарии к вопросу, я бы об этом обратился к разработчику WidgetLocker. Кроме того, вы можете использовать APK Manager, чтобы увидеть, как он его реализовал (он даже рекомендовал использовать APK Manager для создания разных модов в своем приложении, ссылка на поток xda-разработчиков приведена в комментарии выше)

Ответ 4

Я использую AlarmManager для немедленного запуска Activity из Service. Активность начинается без задержки, даже если вы нажали кнопку "Домой" раньше.

Протестировано на Android 5.0.1 (Galaxy Alpha).

Не работает в 6.0.1 (Nexus 7 2013): - (

Не работайте в 4.1.2 (Galaxy S II): - (

Не работает на 4.3 (ASUS MeMO Pad FHD 10 ME302C): - (

@TargetApi(Build.VERSION_CODES.KITKAT)
private void startActivity() {

    Intent intent = new Intent(this, Main.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    long now = Calendar.getInstance().getTimeInMillis();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, now, pendingIntent);
    else
        alarmManager.set(AlarmManager.RTC_WAKEUP, now, pendingIntent);
}