【问题标题】:Android - Dynamically Get the Current Activity in ForegroundAndroid - 在前台动态获取当前活动
【发布时间】:2013-08-07 23:29:18
【问题描述】:

情况如下:

  1. 在线程中触发事件。
  2. 需要检索当前活动。
  3. 然后在该活动上创建一个对话框并显示出来。

问题: 据我搜索,没有办法在前台检索当前活动。

额外信息: 这需要能够在多个活动中处理。所以,它可以在Activity-A或B或C中弹出。

【问题讨论】:

标签: java android dynamic android-activity get


【解决方案1】:

我不确定这是否是您要查找的内容,但它看起来很简单。 http://iamvijayakumar.blogspot.com/2011/09/get-current-activity-and-package-name.html

  ActivityManager am = (ActivityManager) this .getSystemService(ACTIVITY_SERVICE);
  List<RunningTaskInfo> taskInfo = am.getRunningTasks(1);
  ComponentName componentInfo = taskInfo.get(0).topActivity;
  Log.d(WebServiceHelper.TAG, "CURRENT Activity ::" + taskInfo.get(0).topActivity.getClassName()+"   Package Name :  "+componentInfo.getPackageName());

希望这会有所帮助。

【讨论】:

  • 请注意,您需要请求android.permission.GET_TASKS 才能使用此功能。
  • 想知道访问它是否会导致应用被拒绝?
  • 小心,自 API 21 Lollipop 以来已弃用。
  • 这不仅在 Android 5 中被弃用,而且 [developer.android.com/reference/android/app/… 文档)暗示它甚至不会工作。
  • android 5以上有没有其他办法。
【解决方案2】:

A 计划:从字面上理解您的要求

第 1 步:让线程由服务管理

第 2 步:让服务在“触发偶数”时发送消息——LocalBroadcastManager、Square 的 Otto、greenrobot 的 EventBus 等。

第 3 步:设置每个 Activity 以在该消息处于前台时侦听该消息

第 4 步:让活动在收到消息后显示对话框


Plan B:相同的视觉效果

第 1 步:让线程由服务管理

第 2 步:让服务调用 startActivity() 以对话为主题的活动

第 3 步:没有第 3 步

【讨论】:

  • 第 2 步万岁(在两个计划中)!但是为什么第 1 步(使用服务)比使用 AsyncTask 更重要?
  • @LarsH:如果后台工作持续时间足够长以至于您不知道前台 UI 是什么(或者即使它在您自己的应用程序中),您可能需要一个服务,只是为了向 Android 发出信号,表明您正在执行该后台工作,因此您的进程可以持续更长时间。
  • Plan B 中的第 2 步假定人们知道要为哪个活动调用startActivity()。这是问题的症结所在。我希望启动我的任务顶部的活动。如何获取该 Activity?
  • @RaghubanshMani:在您的情况下,您使用 A 计划。让您的活动在 onStart() 中注册该活动,并在 onStop() 中取消注册。当前可见的任何活动都将处理该事件。
  • 让每个 Activity 注册和注销似乎有点重复和浪费,但是,我想这里没有避免它。将其放入 BaseActivity 超类感觉很滥用。
【解决方案3】:

您可以使用自定义广播接收器来实现此目的。您可以在线程中定义广播接收器并在不同的活动中编写接收器。您可以从您的线程中决定发送广播的活动。

在接收器中,您可以显示对话框。

【讨论】:

    【解决方案4】:

    您可以通过扩展 Activity 和 Application 并使用获取和设置当前查看的 Activity 引用作为应用程序级别变量的方法来做到这一点。 试试这个方法:How to get current foreground activity context in android?

    【讨论】:

    • 呵呵,这种做法完全等同于将当前Activity存入静态变量。
    • 不,得分最高的答案不使用静态变量
    • 否,但它使用应用程序来引用活动。应用程序永远不会被垃圾收集,因此当从应用程序引用时,Activity 永远不会被垃圾收集。这等效于使用静态变量,因为它们是从它们的 Class 对象中引用的,而该对象也永远不会被垃圾回收。
    • 是的,我不会做完全一样的事情,因为有一种更清洁、更高效的方式来完成相同的任务。但是变量在暂停时无效,所以它仍然应该被垃圾收集
    • 如果您在onPause 中将它们设为空,您也可以使用静态变量:) 如果您不能保证会发生这种情况,那么无论哪种方式都会发生泄漏。你唯一能做的(也许应该做的)就是给他们留一个WeakReference。保证他们在 Activity 命中 onDestroy 之前不会被 GC。
    【解决方案5】:

    使用Face book's stetho 包对我来说是最安全和最简单的方法(并且其他团队成员没有抱怨“我们不会批准这太骇人听闻了!”事情......

    就这么简单:

    ActivityTracker.get().tryGetTopActivity();

    【讨论】:

      【解决方案6】:

      就像@Xian Zhang 说的,使用Facebook stetho lib 对我有用

      ActivityTracker.get().tryGetTopActivity()?.localClassName
      

      如果您的活动在包 ui 中,则输出类似于

          ui.YourActivityName
      

      不会包含您的应用包名称

      【讨论】:

        猜你喜欢
        • 2017-09-02
        • 1970-01-01
        • 2012-07-09
        • 2011-04-21
        • 2014-08-22
        • 2017-04-25
        • 2018-03-03
        • 1970-01-01
        • 2011-08-05
        相关资源
        最近更新 更多