LocalActivityManager没有从内部mActivities 地图上删除activity成功

By | 09月25日
Advertisement

这个是问题的描述:

When I start an activity with LocalActivityManager inside of an ActivityGroup, then destroy it, and then start another activity with the same id, the activity cannot be started again.

Example code (inside of an ActivityGroup):

Class clazz = Class.forName("com.example.MyActivity");
Intent intent = new Intent(this, clazz);
getLocalActivityManager().startActivity("myId", intent);

and later:
getLocalActivityManager().destroyActivity("myId", true);

and then:
Window window = getLocalActivityManager().startActivity("myId", intent);

Problem:
The second call to startActivity returns null.

The problem seems to be related to the following code in LocalActivityManager.java:

377     public Window destroyActivity(String id, boolean finish) {
378         LocalActivityRecord r = mActivities.get(id);
379         Window win = null;
380         if (r != null) {
381             win = performDestroy(r, finish);
382             if (finish) {
383                 mActivities.remove(r);
384             }
385         }
386         return win;
387     }

On line 383, I think it should be remove(id) instead of remove(r)

这个是问题的的解决方案:

public boolean destroy(String id) {
        final LocalActivityManager activityManager = <your activity manager>
        if(activityManager != null){
            activityManager.destroyActivity(id, false);
            // http://code.google.com/p/android/issues/detail?id=12359
            // http://www.netmite.com/android/mydroid/frameworks/base/core/java/android/app/LocalActivityManager.java
            try {
                final Field mActivitiesField = LocalActivityManager.class.getDeclaredField("mActivities");
                if(mActivitiesField != null){
                    mActivitiesField.setAccessible(true);
                    @SuppressWarnings("unchecked")
                    final Map<String, Object> mActivities = (Map<String, Object>)mActivitiesField.get(activityManager);
                    if(mActivities != null){
                        mActivities.remove(id);
                    }
                    final Field mActivityArrayField = LocalActivityManager.class.getDeclaredField("mActivityArray");
                    if(mActivityArrayField != null){
                        mActivityArrayField.setAccessible(true);
                        @SuppressWarnings("unchecked")
                        final ArrayList<Object> mActivityArray = (ArrayList<Object>)mActivityArrayField.get(activityManager);
                        if(mActivityArray != null){
                            for(Object record : mActivityArray){
                                final Field idField = record.getClass().getDeclaredField("id");
                                if(idField != null){
                                    idField.setAccessible(true);
                                    final String _id = (String)idField.get(record);
                                    if(id.equals(_id)){
                                        mActivityArray.remove(record);
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return true;
        }
        return false;
    }

Similar Posts:

  • android map开发4 删除地图上的标记

    1.删除地图上的标记 extends ItemizedOverlay<OverlayItem> 在ItemizedOverlay 子类中自定义方法 private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>(); mOverlays.remove(index)  根据索引删除当前标记 mOverlays.remove(object) 根据对象删除当前标记 mOverlays.removeAl

  • 如何恢复 Linux 上删除的文件3

    如何恢复 Linux 上删除的文件,第 3 部分 特自动恢复工具 e2undel 和特殊情况的恢复殊文件的恢复 冯 锐 (fengrui@cn.ibm.com), 软件工程师, IBM 王 磊 (cdlwangl@cn.ibm.com), 软件工程师, IBM 2008 年 1 月 10 日 恢 复系统中删除的文件是一个非常繁琐的过程,而 e2undel 这个工具可以用来方便地恢复文件系统中已删除的文件.本文将首先讨论 e2undel 的工作原理和用法,并对之进行一些改进.然后讨论了文件系统故障

  • 地图注解(地图上的大头针)

    Cocoa Touch 没有提供地图注解类,只定义了一个 MKAnnotation 协议.要创建地图注解,必须设计符合 MKAnnotation 协议的类,该类需要一个 CLLocationCoordinate2D coordinate 属性,以及 title 和 subtitle 实例方法. 一. 设计注解类: 例,注解(大头针)类: .h #import <MapKit/MapKit.h> @interface LocationObject : NSObject <MKAnnotat

  • 怎样从XenServer上删除存储仓库

    背景 XenServer的存储仓库是用来存储ISO或者时VDI的.存储仓库通过物理块设备(PBD)与XenServer相连接,PBD包含了存储仓库(SR)的配置信息.当你从XenServer主机上分离或者删除SR之前,很有必要先将PBD断开. 步骤 为了从XenServer主机上删除SR,请完成以下步骤: 1. Right click the Storage Repository and select Detach. If Detach is not an option then the Sto

  • 从零开始重写KOK1(万王之王1) —— (1)让人物可在地图上使用鼠标跑动

    从飞信裸辞已经2个月了,因为对游戏的爱,和做出好玩的游戏这个梦想.<Windows游戏编程大师技巧>(以下简称<大师>)这书已经读完,DEMO也都搞清楚了,为了确实的掌握2D游戏的技术,决定完成一个完整的KOK1咒术师打钱坑的DEMO,也是作为我踏入游戏开发行业的简历附加DEMO.[广告]对游戏有爱的游戏公司(北京)缺人(2D/3D游戏程序员)的话请随时把我拉走.这个系列文章将记载在这个DEMO开发过程中的一点一滴,废话不说了,进入正题. 0. 本期功能 (1)人物可以在地图上通过

  • 三星GALAXY S5内部拆解 史上零件最少

    三星GALAXY S5内部拆解 史上零件最少 Android开发入门 372858684消息:此前国外专业网站ChipWorks曾经拆解了三星GALAXY S5,并为我们揭秘了该机各个芯片的信息.而现在,专业拆解网站iFixit也终于带来了三星GALAXY S5最新拆解报告,并为该机给出了可维修程度为5分(10分为满分)的评分,表示手机除了电池之外的部分均有较大的拆卸难度. 内部构造高集成度 此次iFixit拆解的三星GALAXY S5型号为SM-G900A,其内部结构设计仍然保持了一流水准,但

  • Android使用Google Map服务 - 根据GPS信息在地图上定位

    Android使用Google Map服务 - 根据GPS信息在地图上定位 自暑假7月7日开始,到今天的8月7日,整个一个月,我总算是学到了Google Map这部分的内容.原本挺兴奋的,却被注册api key的网页显示错误弄得挺无聊,还好网上的能人多,搜了一下子就找到了解决方案,挺感激的,泪牛满面啊.这样我就可以继续这部分的学习. 在使用Google Map服务之前要做一些必要的准备 1.获取Map API Key 2.创建支持Google Map API 的AVD 关于获取Map API K

  • 在地图上,如何对一个地区进行矩形划分

    首先先看下效果图 主要是先根据百度百科确定北京区域所在的经纬度,然后计算大概.并且在地图上画矩形的经纬度顺序是 左,左上,右上,右,按照顺时针方向进行设置.如果顺序反了可能画出的就不是矩形了 本文是调用第三方高德的地图API. 下面给出源码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>1.html</tit

  • 电子地图--MapABC研究(三)为地图上添加点并得到中心坐标

    出于项目的需要,还要继续对MapABC进行研究,昨天看了下地图上加点,结合项目实际写了个例子,用Struts2结合MapABC实现. 有一点请注意:使用Mapabc的话,页面编码必须是utf-8. 下面是具体的实现页面enInfor.jsp: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <%@ page language="java" pageEncoding=&qu

  • 公司需要内部的地图服务,准备自己去开发但是成本太高,现在有没有专门为企业提供GIS地图开发的产品呀?大概价

    公司需要内部的地图服务,准备自己去开发但是成本太高,现在有没有专门为企业提供GIS地图开发的产品呀?大概价格多少?

Tags: