Запуск активности из сервиса после нажатия кнопки 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-секундной задержки?

Solutions Collecting From Web of "Запуск активности из сервиса после нажатия кнопки HOME без задержки 5 секунд"

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

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

Поместите свое намерение, которое вы хотите начать немедленно в 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(); } 

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

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

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

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

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

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

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

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

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

Протестировано на 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); }