Как узнать, видно ли мое приложение для Android? - PullRequest
18 голосов
/ 27 июля 2011

У меня есть таймер, который запускает уведомление, когда оно заканчивается.Но я хотел бы запустить уведомление с помощью NotificationManager, только если приложение в данный момент не отображается, и показать alertDialog, если таймер заканчивается, когда приложение находится на переднем плане.1003 *

ActivityManager actMngr = (ActivityManager) ValeoMobileApplication.getContext().getSystemService(Activity.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> runningAppProcesses = actMngr.getRunningAppProcesses();
Tools.log("TimerBroadcastReceiver", "onReceive", "All running processes are listed below :");
for (RunningAppProcessInfo pi : runningAppProcesses) {
    //Check pi.processName and do your stuff
    //also check pi importance - check if process is in foreground or background
    Tools.log("TimerBroadcastReceiver", "onReceive", pi.processName + " importance = "+pi.importance);
    if(pi.processName.equalsIgnoreCase("MY_APP_PROCESS_NAME")){
        if (pi.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
            isApplicationInForeground = true;
        }
    }
}

Но, похоже, не имеет значения, является ли приложение на переднем плане или нет.Как я могу это сделать?

Ответы [ 4 ]

25 голосов
/ 27 июля 2011

Но я хотел бы запустить уведомление с помощью NotificationManager, только если приложение в данный момент не отображается, и показать alertDialog, если таймер заканчивается, когда приложение находится на переднем плане.

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

Вотсообщение в блоге с изложением этой техники.

ОБНОВЛЕНИЕ 2018-01-04 : Описанный выше подход работает, но он включает в себя системные трансляции, что не является хорошим выбором для большинства (одиночный-процесс) приложения.Вместо этого можно использовать шину событий (LocalBroadcastManager, EventBus от Greenrobot), с более высокой производительностью и безопасностью.См. этот пример приложения, в котором используются LocalBroadcastManager и этот пример приложения, в котором используется EventBus greenrobot , оба из которых реализуют этот шаблон.

10 голосов
/ 27 июля 2011

Вы можете определить, является ли ваше приложение видимым или нет, следующим образом:

Во всех ваших Activity установите:

@Override
protected void onResume() {
    super.onResume();

    myVisibilityManager.setIsVisible(true);
}

@Override
protected void onPause() {
    myVisibilityManager.setIsVisible(false);

    super.onPause();
}

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

Затем создайте VisibilityManager (это очень просто, вам может понадобиться что-то более продвинутое):

public class VisibilityManager {
    private boolean mIsVisible = false;

    public void setIsVisible(boolean visible) { 
         mIsVisible = visible; 
    }

    public boolean getIsVisible() {
         return mIsVisible;
    }
}

И затем,в вашей ветке таймера, когда обратный отсчет достиг нуля:

if (VisibilityManager.getIsVisible()) {
    showAlertDialog();
}
else {
    showNotification();
}

РЕДАКТИРОВАТЬ: но я даже предпочитаю подход CommonsWare, описанный здесь на этой странице.Это более элегантно.

0 голосов
/ 04 июня 2016

Вот решение:

public static boolean uygulamaCalisiyormu(Context context)
    {
        ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> islemler = activityManager.getRunningAppProcesses();
        for (ActivityManager.RunningAppProcessInfo uygulamaIslemi : islemler)
        {
            if (uygulamaIslemi.processName.equals(context.getPackageName()))
            {
                if (uygulamaIslemi.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE || uygulamaIslemi.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND)
                {
                    return true;
                }
            }
        }
        return false;
    }


...
 if (uygulamaCalisiyormu(getApplicationContext()))
        {
            Log.d("asd","App Already Started");
        }
      else
        {
Log.d("asd","App Started");
}

РЕДАКТИРОВАТЬ: Если вы хотите проверить конкретную деятельность (класс), используйте это;

  if (uygulamaIslemi.processName.equals("com.TRSoft.timetab:PIN"))
            {
                if (uygulamaIslemi.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE || uygulamaIslemi.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) // Lanet olasıca şey Visible ile Foreground arasındaki fark ne oç illaha ya da yı kullanarak olduğunu keşfetmem mi lazım!
                {
                    return true;
                }
            }

И в вашем файле манифеста:

 <activity android:name=".PINSayfasi"
            android:process=":PIN"></activity>

Итак, основная логика - процесс открытия и чтения.

0 голосов
/ 27 июля 2011

Я бы посоветовал вам использовать Службу вместо действия в этом случае.

Служба работает в фоновом режиме и не зависит от жизненного цикла операции, если она запущена правильно.

Следует помнить одну важную вещь: когда вы возвращаетесь к пользовательскому интерфейсу, служба должна явно вызывать поток пользовательского интерфейса, в противном случае вы получите ошибки ANR, поскольку поток пользовательского интерфейса не является потокобезопасным.

Пожалуйста, прочитайте этот документ, он должен помочь вам найти лучшее решение для того, что вы пытаетесь сделать!

Надеюсь, это помогло

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