Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按名称获取活动实例(如果正在运行)_Java_Android - Fatal编程技术网

Java 按名称获取活动实例(如果正在运行)

Java 按名称获取活动实例(如果正在运行),java,android,Java,Android,A具有具有长时间运行任务的应用程序。任务对象安全地移出到应用程序对象。但是,我仍然需要更新UI。到目前为止,任务确实是长时间运行的,因此用户可以转到另一个活动,当前活动可能会被销毁,但任务将继续工作。 现在,任务完成后,我想更改活动的UI。但这可能是该活动的新实例,或者该活动可能已被销毁。但如果它是活的(无论哪种情况),我想做这个改变。这是我需要的伪代码: MyActivity act = SomeActivityManager.get(MyActivity.class.name()); if(

A具有具有长时间运行任务的应用程序。任务对象安全地移出到应用程序对象。但是,我仍然需要更新UI。到目前为止,任务确实是长时间运行的,因此用户可以转到另一个活动,当前活动可能会被销毁,但任务将继续工作。 现在,任务完成后,我想更改活动的UI。但这可能是该活动的新实例,或者该活动可能已被销毁。但如果它是活的(无论哪种情况),我想做这个改变。这是我需要的伪代码:

MyActivity act = SomeActivityManager.get(MyActivity.class.name());
if(act == null) {
// the activity is destroyed, no action needed, 
// on next creating all UI changes will be in place
} else {
     act.drawRedLine(); // custom method of my activity
}

我更喜欢基于android sdk的解决方案(我仍然可以使用
WeakHashMap
处理应用程序对象中的所有活动,但这肯定是一种肮脏的方式,存在潜在问题)

不确定这是否是最好的方法,但您可以使用由长时间运行的任务发送的意图,例如

LocalBroadcastManager.getInstance(context).sendIntent(new Intent(“DrawRedLine”)

并在活动中使用如下广播接收器接收:

BroadcastReceiver br = new BroadcastReceiver(){  
    @Override
    public void onReceive(Context context, Intent intent) {
        //update your activity
    }
};
LocalBroadcastManager.getInstance(this).registerReceiver(br, new IntentFilter("DrawRedLine"));
onCreate
中以这种方式注册它,并在
onDestroy
中用

LocalBroadcastManager.getInstance(this).unregisterReceiver(br);

为什么不在服务中承载长时间运行的任务,然后更新您返回的活动?对于更新活动,我需要它的引用。我无法保留对它的引用,因为系统可能会重新创建活动,引用将无效,而且我将陷入内存泄漏。所以我需要一个真正的主动参考。这就是问题所在。最好在活动当前不可见时停止渲染,因为它有时会在当前可见的活动中产生闪烁效果(如果当前活动也正在设置动画,则情况更糟)。托管状态或数学逻辑/计算可能很琐碎,但最终会很有用,因为您可以在onStart()期间重新呈现从主机提交的最后一个值,在这段时间内,您可以获取回活动引用。“”,但最终会很有用,因为您可以在onStart()期间重新呈现从主机提交的最后一个值''-如果创建了第二个(相同但新的)活动,则情况如何?白色结果未准备就绪?请记住,我建议将其托管在服务中,如果它与之前所讨论的是同一实例,则它对该活动一无所知。可能的答案是,从技术上讲,与带有
WeakHashMap
的变体非常接近,但更安全。在某些活动管理器中仍然感兴趣的任何案例。这个变体有一点不好,因为所有my intent过滤器看起来都像全局变量。因此,我必须小心命名并控制这些过滤器。我的应用程序有很多这样的操作和调用。