Как получить идентификатор самой верхней активности?
У меня есть служба, и ее поведение должно измениться при изменении самой последней активности. Скажем, активность А активна, а затем служба начинает какую-то обработку. Эта обработка должна прекратиться, когда действие A больше не видно: пользователь нажал "Назад", "Домой" или сделал что-то еще, что делает Activity A невидимым. Эта операция A не должна знать об услуге - то есть она не должна явно указывать Службе, что она уходит.
В двух словах есть ли способ:
- Получить любую идентификацию (ссылку на объект, имя класса, идентификатор и т.д.) самого верхнего действия,
- Получить уведомление при внесении изменений в максимальную активность?
P.S. Это может звучать как поведение вредоносных программ, но это не так! Это законный прецедент!
Изменить: действия в моем приложении отсутствуют. Они могут быть примерно чем угодно - браузер, приложение для карт, настройки и т.д.
Ответы
Ответ 1
Эта верхняя часть устарела. См. Внизу для ответа.
Я предполагаю, что вы имеете в виду действия в своем собственном приложении:
Все действия вызовут onResume()
при выходе на передний план и onPause()
при выходе из переднего плана. Просто переопределите этот метод своей функциональностью (обязательно вызовите super.onResume()
и super.onPause()
соответственно!).
Что касается идентификатора, возможно, вы можете сделать свой сервис статическим методом, который вызывается Activity, выходящим на передний план (в onResume()
), предоставляя ссылку на себя, свой класс, некоторый произвольный идентификатор и т.д.
Ссылка: 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 миллисекунд.
Ответ 2
Создайте baseActivity
и расширьте все другие действия из baseActivity
, в onResume сохраните текущую активность в публичном статическом Filed в глобальном классе (в моем случае расширяет приложение)
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
}