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

Принудительное применение приложения после нажатия на кнопку пользователя

Мое приложение находится в режиме работы [переднем плане], и пользователь нажимает кнопку "домой", которая помещает приложение в фон [и все еще работает]. У меня есть функция будильника в моем приложении, которое срабатывает. Я хочу, когда моя тревога отключается, я хочу, чтобы мое фоновое приложение запускалось на переднем плане и из последнего состояния, в котором оно было.

    <application
            android:name="nl.ziggo.android.state.management.MainEPGApp"
            android:icon="@drawable/icon"
            android:label="@string/app_name"
            android:largeHeap="true"
            android:logo="@drawable/app_logo" >
            <activity
                android:name=".SplashScreen"
                android:label="@string/app_name"
                android:launchMode="singleTop"
                android:screenOrientation="nosensor"
                android:theme="@style/Theme.Sherlock" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        <activity
                    android:name=".Starter"
                    android:configChanges="orientation|screenSize"
                    android:screenOrientation="behind"
                    android:launchMode="singleTop"
                    android:uiOptions="none"
                    android:windowSoftInputMode="adjustPan" />
</application>
4b9b3361

Ответ 1

Intent intent = new Intent(context, MyRootActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);

Вы должны использовать свою начальную или корневую активность для MyRootActivity.

Это приведет к выполнению существующей задачи на передний план без фактического создания нового действия. Если ваше приложение не запущено, оно создаст экземпляр MyRootActivity и запустит его.

ИЗМЕНИТЬ

Я добавил Intent.FLAG_ACTIVITY_SINGLE_TOP в Intent, чтобы он действительно работает!

Второй EDIT

Есть и другой способ сделать это. Вы можете имитировать "запуск" приложения так же, как Android запускает приложение, когда пользователь выбирает его из списка доступных приложений. Если пользователь запускает приложение, которое уже запущено, Android просто выводит текущую задачу на передний план (что вам и нужно). Сделайте это так:

Intent intent = new Intent(context, SplashScreen.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // You need this if starting
                                                //  the activity from a service
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(intent);

Ответ 2

Вы можете использовать приведенный ниже код, чтобы перенести приложение на передний план:

private void bringApplicationToFront()
    {

        Log.d(TAG, "====Bringging Application to Front====");

        Intent notificationIntent = new Intent(this, MainActivity.class);
        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
        try 
        {
            pendingIntent.send();
        }
        catch (CanceledException e) 
        {
            e.printStackTrace();
        }
    }

Ответ 3

Я нахожу новый способ принести приложение на передний план, Он имитирует щелчок на значке для запуска приложения.

    PackageManager packageManager = context.getPackageManager();
    Intent intent = packageManager.getLaunchIntentForPackage(pkName);
    if (intent != null)
    {
            //模拟点击桌面图标的启动参数
            intent.setPackage(null);
         // intent.setSourceBounds(new Rect(804,378, 1068, 657));
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
           context.startActivity(intent);

    }

он работает для меня, но кто может сказать мне, почему пакет должен быть пустым

Ответ 4

Комбинация, которая работает для меня, заключается в использовании:

Intent bringToForegroundIntent = new Intent(context, RootActivity.class);
bringToForegroundIntent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(bringToForegroundIntent);

Если вы проверяете журналы на устройстве всякий раз, когда вы запускаете действие из значка запуска, это намерение, которое передается для запуска приложения или переноса его на передний план, если, например, пользователь нажал кнопку "Домой".

Ответ 5

Из моего теста, чтобы воспроизвести поведение Launcher, ключ должен:

intent.setPackage(null);

после

Intent intent = packageManager.getLaunchIntentForPackage(pkName);

Другие методы в этом потоке не работают в моем случае.

Благодаря ответу jiaqing, я отправляю этот ответ, поскольку у меня нет права комментировать. Я тоже не знаю логики, я думаю, это связано с владельцем задачи. Кто-нибудь знает, был бы рад узнать.

Ответ 6

Для сигнала тревоги вы хотите взглянуть на запуск Служба Android

Эта услуга будет более устойчивой, чем ваше приложение, которое может быть убито в фоновом режиме и может отключить intent, чтобы перенести ваше приложение на передний план ( или перезапустить его, если он был убит), когда пришло время для выхода тревоги.