2011-04-20 70 views
0

我的应用程序有几个活动。我需要确定他们当中的哪一个当前处于活动状态(或者术语是什么,活动,前景,显示,...)。有没有办法做到这一点?如何获取当前活动的活动?

(我认为这是一个简单而常用的东西,而是寻找半小时后,我什么也没得到。:-(

(RunningTaskInfo.topActivity()只返回组件名称,但我需要它的参考,所以这并不能帮助。)

(A蛮力解决方案来跟踪活动的引用的全局变量。但是,这在每一个要做的onResume(),它的丑陋IMO)

+0

我不明白这个问题。 '究竟是什么'需要确定当前活动的活动?活动本身显然知道“他们是谁”(如果你明白我的意思),所以我只能猜测你需要一些'外部'来知道哪个活动是活动的......还是我误解了?对你想要达到什么的进一步解释可能会有所帮助。 – Squonk 2011-04-21 00:33:42

+0

@彼得史密斯,谢谢。那么这种情况其实很简单:当程序流向深处时,像8或10个层次到数据库引擎或一些常见的例程,活动引用在调用链中的某处丢失。所以,是的,一个敏捷的程序员应该忠实地通过这个参考,不管程序在哪里流动,但是......我很懒。所以我想也许有一个Android类可以提供这个方便的信息。毕竟,在编程中必须非常普遍的是,每个人都需要知道调用它的活动。对? – wwyt 2011-04-21 19:17:18

回答

0

谁过这样的问题来了,即你需要将当前活跃活动的参考,也没有在这里真正解决问题。唯一的方法是你自己跟踪它,使用全球。是的,使用全球并不是Android编程的最佳方式,但我认为它的成本更低。

这里是我做过什么:

延长我的所有acitivities从相同的基本活动:MotherOfAllActivities。

public class MotherOfAllActivities extends Activity { 
    public void onCreate(...) { 
     globalCurrentActivity = this; 
     ........ 
    } 

    public void onResume() { 
     globalCurrentActivity = this; 
     ........ 
    } 

    public void onPause() { 
     if (globalCurrentActivity == this) 
      globalCurrentActivity = null; 
    } 

    // And, don't forget about onActivityResult(). It can come before onResume() 
    // of the calling activity and after onPause() of the called activity. That is, 
    // there is a window when globalCurrentActivity is null. 
    public void onActivityResult() { 
     globalCurrentActivity = this; 
    } 
} 

,如果你不喜欢这个答案,不要拍我。我只是试图与人分享什么对我有用,至少目前为止。

+0

我很确定这会造成大的内存泄漏。编辑:它的确如此。如果你是(java)编程的新手,你可以通过弄清楚为什么是这种情况,以及如何解决这个问题,来做自己的大忙。 – 2011-05-12 00:39:03

+0

请解释为什么会导致内存泄漏 – 2013-07-09 22:15:00

+0

内存泄漏是因为活动及其所有同级兄弟没有得到垃圾回收。为了避免内存泄漏,您可以为globalCurrentActivity使用WeakReference ; – 2015-03-31 06:00:42

0

有没有办法做到这一点?

不是真的。

(A蛮力解决方案来跟踪活动的引用的全局变量。但是,这在每一个的onResume()来完成。这是丑陋的IMO)

这也是内存泄漏的秘诀。

就个人而言,我会找到一个更好的办法来解决问题,无论你认为你是通过获取“目前activte [原文]活动”解决。

+0

那么,首先解决的问题其实很简单:当程序深入时,活动引用在调用链中的某处丢失。所以,是的,另一种选择是沿着从上到下的方式向所有方法添加参数。但那也不是很好,IMO。 – wwyt 2011-04-21 00:04:50

+0

不,不会有内存泄漏,它应该是一个* global *全局变量,就像应用程序或类似的一样。另外,这个变量不能保存在Activity中,这是内存泄漏的秘诀,因为我没有首先引用这个活动! :-) – wwyt 2011-04-21 00:14:13

+0

@wwyt:“* global * global variable”,使用你的酷刑词组,是内存泄漏的头号原因。事实上,人们可能会争辩说,GC环境中的任何内存泄漏都会以“* global * global variable”的形式或形式出现,无论是由开发人员还是由运行时引擎声明(例如,运行线程的名单) 。在一个静态数据成员或者一个Application中放置一个Activity可能会导致内存泄漏,除非你总是清除该数据成员,并且如果你认为在通过方法传递对象时遇到困难,抓住所有的情况来清除它。 – CommonsWare 2011-04-21 11:46:03

0

我几乎没有专家,但我需要像你提到保持当前突出显示的按钮突出(底栏)做一些事情。我想我在每个活动中使用onResume(),就像你提到的那样,将它存储在应用程序类变量中。我敢肯定有,虽然

编辑一个更好的办法:其实我只是重新阅读你提出什么......是的,我与commonsware同意存储实际参考活动是坏的。为什么你不能只存储当前活动名称的字符串变量?那是什么我做了跟踪和突出显示相应的按钮

+0

这个名字?但我需要它的引用,以便我可以使用它,例如,currentActivity.findViewById()。如果你需要的只是t他的名字,那么也许你应该签出ActivityManager.getRunningTasks()和RunningTaskInfo.topActivity()? – wwyt 2011-04-21 00:08:03

+0

实际上,它并不是当前的topActivity()名称,因为它是该topActivity的选项卡主机内的当前选项卡。我敢肯定,有更好的方法来做事情,虽然我会在一天重新访问干杯 – wired00 2011-04-21 00:29:27

相关问题