如何获得最顶层活动的任何标识符?

时间:2010-08-03 05:56:39

标签: android

我有一个服务,当最顶层的Activity更改时,它的行为必须改变。比如,活动A处于活动状态,然后服务开始某种处理。当活动A不再可见时,此处理必须停止:用户按下“返回”,“主页”或执行任何使活动A不可见的操作。此活动A必须不知道该服务 - 即它必须不必明确告知服务它将要离开。

简而言之,有办法:

  • 获取最顶层活动的任何类型的标识(对象引用,类名,ID等),
  • 当最顶层的活动发生变化时收到通知?

P.S。这可能听起来像恶意软件行为,但事实并非如此!这是合法的用例!

编辑:活动不在我的申请中。它们可以是任何东西 - 浏览器,地图应用程序,设置等。

2 个答案:

答案 0 :(得分:22)

这个顶部已经过时了。见底部以获得答案。

我假设您在自己的应用程序中引用了活动:

所有活动在前往前景时调用onResume(),在离开前景时调用onPause()。只需使用您的功能覆盖此方法(请务必分别致电super.onResume()super.onPause()。)。

对于标识符,也许你可以让你的服务有一个静态方法,由一个活动调用到前台(在onResume()中),提供对它自己的引用,它的类,一些任意ID,等

参考:http://developer.android.com/reference/android/app/Activity.html


编辑:

您可以通过ActivityManager - &gt;访问热门活动的最高身份正在运行的任务 - &gt; 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毫秒检查一次活动。

答案 1 :(得分:1)

创建baseActivity并从baseActivity扩展所有其他活动,在onResume中将当前活动保存在Global类中的公共静态中(在我的案例中扩展应用程序)

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
    }