I have a service and its behavior must change when topmost Activity changes. Say, Activity A is active and then service starts some kind of processing. This processing must stop when Activity A is no longer visible: user pressed “Back”, “Home” or did anything else that makes Activity A invisible. This Activity A must not be aware of the service — i.e. it must not have to explicitly inform the Service that it is going away.
In the nutshell, is there a way to:
- Get any kind of identification (object reference, class name, ID, etc.) of the topmost Activity,
- Receive notification when topmost Activity changes?
P.S. This may sound like malware behavior, but it is not! It is legitimate use-case!
Edit: Activities are not in my application. They can be just about anything — browser, maps app, settings, etc.
This top part is outdated. See bottom for answer.
I’m assuming you’re referring to Activities within your own application:
All Activities call
onResume()when coming to the foreground andonPause()when leaving the foreground. Simply override this method with your functionality (be sure to callsuper.onResume()andsuper.onPause()respectively!).As for the identifier, perhaps you could make your Service have a static method that is called by an Activity coming to the foreground (in
onResume()), supplying a reference to itself, its class, some arbitrary ID, etc.Reference: http://developer.android.com/reference/android/app/Activity.html
Edit:
You can access the top Activity’s identity via
ActivityManager-> running tasks ->ComponentName. Be sure to declare<uses-permission android:name="android.permission.GET_TASKS" />in your manifest.As for getting a notification, you’ll probably have to just check the top Activity every x milliseconds.