【发布时间】:2013-08-07 23:29:18
【问题描述】:
情况如下:
- 在线程中触发事件。
- 需要检索当前活动。
- 然后在该活动上创建一个对话框并显示出来。
问题: 据我搜索,没有办法在前台检索当前活动。
额外信息: 这需要能够在多个活动中处理。所以,它可以在Activity-A或B或C中弹出。
【问题讨论】:
标签: java android dynamic android-activity get
情况如下:
问题: 据我搜索,没有办法在前台检索当前活动。
额外信息: 这需要能够在多个活动中处理。所以,它可以在Activity-A或B或C中弹出。
【问题讨论】:
标签: java android dynamic android-activity get
我不确定这是否是您要查找的内容,但它看起来很简单。 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 才能使用此功能。
A 计划:从字面上理解您的要求
第 1 步:让线程由服务管理
第 2 步:让服务在“触发偶数”时发送消息——LocalBroadcastManager、Square 的 Otto、greenrobot 的 EventBus 等。
第 3 步:设置每个 Activity 以在该消息处于前台时侦听该消息
第 4 步:让活动在收到消息后显示对话框
Plan B:相同的视觉效果
第 1 步:让线程由服务管理
第 2 步:让服务调用 startActivity() 以对话为主题的活动
第 3 步:没有第 3 步
【讨论】:
startActivity()。这是问题的症结所在。我希望启动我的任务顶部的活动。如何获取该 Activity?
onStart() 中注册该活动,并在 onStop() 中取消注册。当前可见的任何活动都将处理该事件。
您可以使用自定义广播接收器来实现此目的。您可以在线程中定义广播接收器并在不同的活动中编写接收器。您可以从您的线程中决定发送广播的活动。
在接收器中,您可以显示对话框。
【讨论】:
您可以通过扩展 Activity 和 Application 并使用获取和设置当前查看的 Activity 引用作为应用程序级别变量的方法来做到这一点。 试试这个方法:How to get current foreground activity context in android?。
【讨论】:
Class 对象中引用的,而该对象也永远不会被垃圾回收。
onPause 中将它们设为空,您也可以使用静态变量:) 如果您不能保证会发生这种情况,那么无论哪种方式都会发生泄漏。你唯一能做的(也许应该做的)就是给他们留一个WeakReference。保证他们在 Activity 命中 onDestroy 之前不会被 GC。
使用Face book's stetho 包对我来说是最安全和最简单的方法(并且其他团队成员没有抱怨“我们不会批准这太骇人听闻了!”事情......
就这么简单:
ActivityTracker.get().tryGetTopActivity();
【讨论】:
就像@Xian Zhang 说的,使用Facebook stetho lib 对我有用
ActivityTracker.get().tryGetTopActivity()?.localClassName
如果您的活动在包 ui 中,则输出类似于
ui.YourActivityName
不会包含您的应用包名称
【讨论】: