Подтвердить что ты не робот

Как получить идентификатор самой верхней активности?

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

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

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

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

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

4b9b3361

Ответ 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
    }