Запуск активности из службы после нажатия кнопки HOME без 5-секундной задержки - PullRequest
35 голосов
/ 08 апреля 2011

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

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

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

"android.permission.STOP_APP_SWITCHES"

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

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

Ответы [ 4 ]

43 голосов
/ 20 марта 2017

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

Поместите ваше намерение, которое вы хотите немедленно запустить, в 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();
                }
15 голосов
/ 08 апреля 2011

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

1 голос
/ 07 мая 2016

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

Протестировано на 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);
}
1 голос
/ 18 апреля 2011

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

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...