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

11

我有一个服务,当最上层的Activity发生变化时,其行为必须改变。举个例子,如果Activity A正在运行,那么服务会启动某种处理过程。当Activity A不再可见时(用户按下“Back”、“Home”或执行其他任何使Activity A不可见的操作),这个处理过程必须停止。这个Activity A不能意识到这个服务——也就是说,它不必要显式地通知服务它正在退出。

简而言之,是否有以下方式:

  • 获取最上层Activity的任何标识(对象引用、类名、ID 等)
  • 接收最上层Activity更改的通知?

P.S. 这可能听起来像恶意软件行为,但这是正当的使用情况!

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

2个回答

22

这部分内容已经过时,请查看下方的答案。

我假设您是在提到自己应用程序中的活动:

所有活动在进入前台时都会调用 onResume(),并在离开前台时调用 onPause()。只需重写此方法以实现您的功能(确保分别调用 super.onResume()super.onPause() !)。

至于标识符,也许您可以使您的服务拥有一个静态方法,该方法由进入前台的活动(在 onResume() 中)调用,提供对其自身、其类、一些任意 ID 等的引用。

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


编辑:

您可以通过 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毫秒检查顶部活动。


不,我所指的活动可以是任何事情,不一定是在我的应用程序中。如果是我的Activity,onResume()和onPause()会很有用。 - Ignas Limanauskas
可以了,谢谢!只需要使用 if(className.equals(your classname)){//do stuff}。同时确保输入完整的类名,例如 com.example.appname.class - vergil corleone
想知道这是否会导致应用程序被拒绝? - rishabh

1
创建一个baseActivity并从baseActivity扩展所有其他活动,在onResume中将当前活动保存在全局类(在我的情况下扩展应用程序)的公共静态字段中。
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
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接