How to get any identifier of the topmost activity?
Asked Answered
A

2

11

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.

Adrenalin answered 3/8, 2010 at 5:56 Comment(0)
F
22

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 and onPause() when leaving the foreground. Simply override this method with your functionality (be sure to call super.onResume() and super.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.

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();

As for getting a notification, you'll probably have to just check the top Activity every x milliseconds.

Factfinding answered 3/8, 2010 at 7:1 Comment(3)
No, activities I am referring to can be just about anything, not necessarily in my own application. onResume() and onPause() would be useful if it was my own Activity.Adrenalin
It works, thanks! Just use if(className.equals(your classname)){//do stuff}. Also make sure you put in the full classname, like com.example.appname.class.Laband
Wondering if that would cause any app rejections?Syringomyelia
G
1

Create a baseActivity and extends all other Activities from baseActivity, in onResume save Current Activity in a public static Filed in a Global class (in my case extends Application)

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

Other Activities

    public class mainActivity extends baseActivity {
        // You Can Use Global.Activity Everywhere ! , Even in a Object Extended Class
    }
Grandnephew answered 10/10, 2014 at 21:31 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.