2013-09-10 2 views
1

Из кода конкретного сервиса я хочу определить, находится ли служба на переднем плане. Я посмотрел на:Как узнать, работает ли мой Android-сервис на переднем плане?

ActivityManager.RunningServiceInfo

специально RunningServiceInfo.foreground, но документация говорит: «Установить истинное значение, если служба попросил для работы в качестве переднего плана процесса.»

Могу ли я полагаться на RunningServiceInfo.foreground? Или есть другой способ?

PS: У меня нет других проблем, моя служба работает нормально. Этот вопрос больше из любопытства. Уже просмотрел АСОП и ничего не видел, но, может быть, я что-то пропустил ...

Если у вас есть подобный вопрос, это может помочь: How to determine if an Android Service is running in the foreground?

... Хотя я нашел принятое решение будет неполный.

+0

Что вы пытаетесь выполнить, посмотрев, работает ли служба на переднем плане? – tyczj

+0

У меня возникла проблема, когда я бы назвал setForeground, но служба все еще была убита под нагрузкой. Оказалось, что я неправильно звонил setForeground (передавая его id = 0). Но прежде чем я понял, что мне пришло в голову, что я на самом деле не знаю, что служба была на переднем плане, просто я попросил ее. Поэтому я искал способ определить, была ли служба первой и не найдена. Поэтому я подумал, что я бы поставил его в SO ... – newbyca

+0

ну его не заданоForeground его 'startForeground()' и используя это, вам нужно создать уведомление, которое отображается на панели уведомлений – tyczj

ответ

-2

Если я правильно понял ваш вопрос, и если предположить, что на переднем плане означает, что ваше приложение имеет некоторую активность, вы можете объявить глобальную статическую переменную в своем приложении, например. boolean bIsForeground. На вас деятельности вы можете установить:

@Override 
protected void onResume() { 
    super.onResume(); 
    bIsForeground = true; 
} 


@Override 
protected void onPause() { 
    super.onResume(); 
    bIsForeground = false; 
} 

поэтому каждый раз, когда ваша деятельность является приоритетной или «на экране» этот переменный должен быть правдой, и таким образом ваша служба может знать, является приоритетной активным.

+0

Нет. Я спрашиваю о том, что услуги не работают, спасибо. – newbyca

-1

Попробуйте этот код:

private boolean isActivityRunning() { 
     List<ActivityManager.RunningTaskInfo> tasks = activityManager.getRunningTasks(1); 
     ComponentName runningActivity = tasks.get(0).topActivity; 
     return runningActivity.getPackageName().startsWith("com.mypackage"); 
    } 
+0

Нет, это не то, о чем я прошу, спасибо. – newbyca

0

Единственное, что я могу думать о проверяет, указывает ли процесс важности этого сервиса в том, что она запущена служба переднего плана или переднего плана деятельности:

private boolean isForegroundOrForegroundService() { 
    //Equivalent of RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE on API 23 
    //On prior versions to API 23, maybe the OS just uses 100 as foreground service importance? 
    int IMPORTANCE_FOREGROUND_SERVICE = 125; 
    return findThisProcess().importance <= IMPORTANCE_FOREGROUND_SERVICE; 
} 

private ActivityManager.RunningAppProcessInfo findThisProcess() { 
    List<ActivityManager.RunningAppProcessInfo> runningAppProcesses = activityManager.getRunningAppProcesses(); 
    for (ActivityManager.RunningAppProcessInfo proc : runningAppProcesses) 
     if (proc.pid == Process.myPid()) 
      return proc; 

    throw new RuntimeException("Couldn't find this process"); 
} 

Для этого для работы существует несколько ограничений:

  • Служба должна быть единственной услугой в процесс, который пытается работать на переднем плане, так как в противном случае вы не будете знать , который сервис заставил процесс войти в режим переднего плана.
  • Не должно быть никаких действий, выполняемых в том же процессе, поскольку открытие активности также приводит к тому, что процесс переходит в режим переднего плана.
  • Ничто другое не должно позволять процессу переходить в режим переднего плана, отличный от самой службы, по тем же причинам, что и выше.

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

Обратите внимание, что это в основном просто теория; Я не тестировал это или использовал его в каких-либо реальных приложениях. Дайте мне знать, как это происходит, если вы будете придерживаться такого подхода.

Смежные вопросы