2010-08-03 4 views
11

У меня есть служба, и ее поведение должно измениться при изменении самой последней активности. Скажем, активность А активна, а затем служба начинает какую-то обработку. Эта обработка должна прекратиться, когда действие A больше не видно: пользователь нажал «Назад», «Домой» или сделал что-то еще, что делает Activity A невидимым. Эта операция A не должна знать об услуге - то есть она не должна явно указывать Службе, что она уходит.Как получить идентификатор самого верхнего действия?

В двух словах, есть способ:

  • Получить какой-либо идентификации (ссылка на объект, имя класса, ID и т.д.) в верхней деятельности,
  • Получение уведомления, когда верхняя активность изменения?

P.S. Это может звучать как поведение вредоносных программ, но это не так! Это законный вариант использования!

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

ответ

21

Эта верхняя часть устарела. См. Нижнюю часть ответа.

Я предполагаю, что вы имеете в виду деятельности в пределах вашего собственного приложения:

Все развлечения называют onResume(), когда приходят на первый план и onPause() при выходе на переднем плане. Просто переопределите этот метод с вашей функциональностью (обязательно вызовите super.onResume() и super.onPause() соответственно!).

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

Ссылка: http://developer.android.com/reference/android/app/Activity.html


Edit:

Вы можете получить доступ к идентичности началу активность с помощью ActivityManager -> запущенных задач ->ComponentName. Обязательно объявите <uses-permission android:name="android.permission.GET_TASKS" /> в своем манифесте.

Context context = someArbitraryContext; 
ActivityManager am = (ActivityManager) context. 
    getSystemService(Activity.ACTIVITY_SERVICE); 
String packageName = am.getRunningTasks(1).get(0).topActivity.getPackageName(); 
String className = am.getRunningTasks(1).get(0).topActivity.getClassName(); 

Что касается получения уведомления, вам, вероятно, придется просто проверять верхнюю активность каждые x миллисекунд.

+0

Нет, деятельность, на которую я имею в виду, может быть примерно любой, не обязательно в моем собственном приложении. onResume() и onPause() было бы полезно, если бы это была моя собственная деятельность. –

+0

Нашел ваш ответ (частично) и отредактировал мой пост. –

+0

Отлично! Посмотрите, как это работает! –

1

Создать baseActivity и расширяет все другие виды деятельности от baseActivity, в onResume сохранить текущую активность в общественной статики Поданный в глобальном классе (в моем случае распространяется приложение)

public class baseActivity extends Activity { 
    @Override 
    protected void onResume() { 
     super.onResume(); 
     Global.Activity = this; 
    } 
} 

Другие виды деятельности

public class mainActivity extends baseActivity { 
     // You Can Use Global.Activity Everywhere ! , Even in a Object Extended Class 
    } 
Смежные вопросы