Android: как предотвратить запуск активности в фоновом режиме и переход на передний план - PullRequest
1 голос
/ 21 февраля 2012

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

Я создал систему уведомлений, поэтому на экране отображаются поступления от сервера. Я связал с уведомлением прозрачную активность (которая содержит диалог), поэтому, когда пользователь щелкнет по уведомлению, будет выведено диалоговое окно.

Intent notificationIntent = new Intent(CVSApplication.getInstance(), CVSDialogActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent contentIntent = PendingIntent.getActivity(CVSApplication.getInstance(), 0, notificationIntent, 0);

Проблема в том, что приложение все равно выводится на передний план, даже если пользователь не нажимает на уведомление.

Есть ли способ предотвратить возврат CVSDialogActivity из фона при вызове startActivity? Вот намерение, которое запускает CVSDialogActivity:

intent = new Intent(app, CVSDialogActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(USE_CUSTOM_CONTENT, false);
intent.putExtra(INSTANCE, this.hashCode());

Я тоже пробовал этот вариант:

intent = new Intent(app, CVSDialogActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
      .addFlags(Intent.FLAG_FROM_BACKGROUND);
intent.putExtra(USE_CUSTOM_CONTENT, false);
intent.putExtra(INSTANCE, this.hashCode());

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

Спасибо, Alex

1 Ответ

0 голосов
/ 07 марта 2012

Я нашел способ решить эту проблему.Я создал систему, которая сообщает мне, если приложение находится в фоновом режиме или нет (с использованием запущенных процессов), например:

public boolean isInBackground(){
    ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
    List<RunningAppProcessInfo> appProcesses= activityManager.getRunningAppProcesses();     


    for (RunningAppProcessInfo appProcess : appProcesses) {

        PackageInfo p = null;
        try {
            p = this.getPackageManager().getPackageInfo(appProcess.pkgList[0], PackageManager.GET_PERMISSIONS);
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }



        if(p != null && p.packageName.equals(getPackageName()) && appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND){                                
            System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!Is in background: false");
            return false;
        }
    }

    System.out.println("!!!!!!!!!!!!!!!!!!!!!Is in background: true");
    return true;
}

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

Алекс.

...