activitygroup中有四个子activity,默认显示的是地图activity,刚开始初始化时地图activity可以显示,但是在点击其他activity后,返回地图activity,地图不能显示...
注意:我现在用的是百度地图,之前用google地图没有这个问题。

解决方案 »

  1.   

    这是我的代码:
    public class MainGroup extends ActivityGroup { private String TAG = this.getClass().getSimpleName(); public static final String ACTION_REFRESH_FAVORITE = "com.vehicle4me.refreshFavorite";
    public static final String ACTION_REFRESH_HISTORY = "com.vehicle4me.refreshHistory";
    public static final String ACTION_POSITION = "com.vehicle4me.position";
    public static final String ACTION_CHILD_BACKPRESS = "com.vehicle4me.maingroup.childbackpress"; private static final int REQUEST_SPLASH = 0x100; public static enum ActivityId {
    FINDERCAR, FAVORITE, HISTORY, MORE
    };
    //线程池
    public static LinkedList<View> findercarViewList = new LinkedList<View>();
    public static LinkedList<View> favoriteViewList = new LinkedList<View>();
    public static LinkedList<View> historyViewList = new LinkedList<View>();
    public static LinkedList<View> moreViewList = new LinkedList<View>(); // private RelativeLayout mMainGroup;
    // private View mSplash;
    private FrameLayout mActivityContainer;
    private RadioGroup mTabbar;
    private Intent locationServiceIntent = null; private BroadcastReceiver childBackPressReciver = new BroadcastReceiver() { @Override
    public void onReceive(Context context, Intent intent) {
    onBackPressed();
    }
    }; @Override
    protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
    setContentView(R.layout.maingroup); getWindow().setBackgroundDrawableResource(R.color.white);
    // mMainGroup = (RelativeLayout) findViewById(R.id.rl_maingroup);
    mActivityContainer = (FrameLayout) findViewById(R.id.activity_container);
    // mSplash = findViewById(R.id.view_splash);
    initTabbar();
    Log.e("test", "MainGroup onCreate--");
    if (MyApplication.res == null)
    MyApplication.res = this.getResources(); Intent i = new Intent(MainGroup.this, SplashActivity.class);
    startActivityForResult(i, REQUEST_SPLASH); registerReceiver(childBackPressReciver, new IntentFilter(
    ACTION_CHILD_BACKPRESS));
    } @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_SPLASH) {
    if (resultCode == RESULT_OK) {
    mTabbar.check(R.id.radio_finder);
    } else {
    finish();
    }
    }
    } private final void initTabbar() {
    mTabbar = (RadioGroup) findViewById(R.id.rg_tabbar); mTabbar.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
    Log.i(TAG, "tab bar checked changed :" + checkedId);
    switch (checkedId) {
    case R.id.radio_finder:
    if (findercarViewList.size() == 0
    || findercarViewList.size() == 1) {
    findercarViewList.clear();
    startSubActivity(ActivityId.FINDERCAR);
    } else {
    mActivityContainer.removeAllViews();
    mActivityContainer.addView(findercarViewList.getLast());
    }
    break;
    case R.id.radio_favorite:
    if (favoriteViewList.size() == 0) {
    startSubActivity(ActivityId.FAVORITE);
    } else {
    mActivityContainer.removeAllViews();
    mActivityContainer.addView(favoriteViewList.getLast());
    }
    sendBroadcast(new Intent(ACTION_REFRESH_FAVORITE));
    break;
    case R.id.radio_history:
    if (historyViewList.size() == 0) {
    startSubActivity(ActivityId.HISTORY);
    } else {
    mActivityContainer.removeAllViews();
    mActivityContainer.addView(historyViewList.getLast());
    }
    sendBroadcast(new Intent(ACTION_REFRESH_HISTORY));
    break;
    case R.id.radio_more:
    if (moreViewList.size() == 0) {
    startSubActivity(ActivityId.MORE);
    } else {
    mActivityContainer.removeAllViews();
    mActivityContainer.addView(moreViewList.getLast());
    }
    break;
    default:
    break;
    } }
    });
    } public void startSubActivity(Class<?> cls, ActivityId id) {
    mActivityContainer.removeAllViews();
    Intent intent = new Intent(MainGroup.this, cls);
    Window w = getLocalActivityManager().startActivity(id.name(), intent);
    View v = w.getDecorView();
    if (v != null) {
    mActivityContainer.addView(v);
    }
    if (ActivityId.FINDERCAR == id) {
    mTabbar.check(R.id.radio_finder);
    }
    } public void startSubActivity(ActivityId childId) {
    mActivityContainer.removeAllViews();
    String tag = childId.name();
    Class<?> cls;
    switch (childId) {
    case FINDERCAR:
    cls = FindMapActivity.class;
    break;
    case FAVORITE:
    cls = FavoriteActivity.class;
    break;
    case HISTORY:
    cls = HistoryActivity.class;
    break;
    case MORE:
    cls = MoreActivity.class;
    break; default:
    cls = FindMapActivity.class;
    break;
    } Intent intent = new Intent(MainGroup.this, cls);
    if (cls == FindMapActivity.class) {
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    }
    Window w = getLocalActivityManager().startActivity(tag, intent);
    View v = w.getDecorView();
    if (v != null) {
    switch (childId) {
    case FINDERCAR:
    findercarViewList.addLast(v);
    break;
    case FAVORITE:
    favoriteViewList.addLast(v);
    break;
    case HISTORY:
    historyViewList.addLast(v);
    break;
    case MORE:
    moreViewList.addLast(v);
    break; default:
    return;
    }
    mActivityContainer.addView(v);
    }
    } public void startSubChid(ActivityId parentId, Intent intent) {
    mActivityContainer.removeAllViews();
    System.out.println("-----------------"
    + intent.getComponent().getClassName());
    Window w = getLocalActivityManager().startActivity(
    intent.getComponent().getShortClassName(), intent);
    View v = w.getDecorView();
    if (v != null) {
    switch (parentId) {
    case FINDERCAR:
    findercarViewList.addLast(v);
    break;
    case FAVORITE:
    favoriteViewList.addLast(v);
    break;
    case HISTORY:
    historyViewList.addLast(v);
    break;
    case MORE:
    moreViewList.addLast(v);
    break; default:
    return;
    }
    mActivityContainer.addView(v);
    }
    } public int getChecked() {
    int id = mTabbar.getCheckedRadioButtonId(); return id;
    } public void checkTab(ActivityId aid) {
    switch (aid) {
    case FINDERCAR:
    mTabbar.check(R.id.radio_finder);
    break;
    case FAVORITE:
    mTabbar.check(R.id.radio_favorite);
    break;
    case HISTORY:
    mTabbar.check(R.id.radio_history);
    break;
    case MORE:
    mTabbar.check(R.id.radio_more);
    break; default:
    return;
    }
    } public void subChildGoBack(ActivityId parentId, Class<?> cls) {
    mActivityContainer.removeAllViews();
    View v;
    switch (parentId) {
    case FINDERCAR:
    findercarViewList.removeLast();
    v = findercarViewList.getLast();
    break;
    case FAVORITE:
    favoriteViewList.removeLast();
    v = favoriteViewList.getLast();
    break;
    case HISTORY:
    historyViewList.removeLast();
    v = historyViewList.getLast();
    break;
    case MORE:
    moreViewList.removeLast();
    v = moreViewList.getLast();
    break;
    default:
    return;
    } mActivityContainer.addView(v);
    System.out.println("--------------------" + cls.getName());
    destroyActivity(cls.getName()); } public boolean destroySubActivity(ActivityId aid) {
    return destroyActivity(aid.name());
    } public boolean destroyActivity(String id) {
    final LocalActivityManager activityManager = getLocalActivityManager();
    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;
    } @Override
    protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(childBackPressReciver);
    findercarViewList.clear();
    favoriteViewList.clear();
    historyViewList.clear();
    moreViewList.clear();
    if (locationServiceIntent != null)
    this.stopService(locationServiceIntent);
    System.exit(0);
    }
      

  2.   

    可以调用onResume(),但是百度地图在mapManager.start()之后还是不能显示,这是不是百度地图的问题?因为google地图不会出现这种问题。
      

  3.   

    这是我的mapactivity中复写的代码:
             @Override
    protected void onResume() { System.out.println("FindMap---------on resume");
    if (mapManager != null) {
    System.out.println("mapManager is not null");
    mapManager.start();
    }
    super.onResume();
    IntentFilter filter = new IntentFilter(MainGroup.ACTION_POSITION);
    registerReceiver(positionReceiver, filter);
    System.out.println("FindMap registerReceiver");
    } @Override
    protected void onPause() { System.out.println("FindMap---------onpause");
    if (mapManager != null) {
    mapManager.stop();
    }
    super.onPause();
    }
      

  4.   

    我是这样解决的,把mapView地图状态保存了,在onResume的时候恢复地图状态,在onPause保存地图状态,自己定义了一个MapInfo进行保存geoPoint,跟zoomLevel;
     代码
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.Point;
    import android.graphics.Typeface;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;import com.baidu.mapapi.BMapManager;
    import com.baidu.mapapi.GeoPoint;
    import com.baidu.mapapi.LocationListener;
    import com.baidu.mapapi.MapActivity;
    import com.baidu.mapapi.MapController;
    import com.baidu.mapapi.MapView;
    import com.baidu.mapapi.Overlay;
    import com.baidu.mapapi.Projection;
    import com.life.hua.activity.BaseApplication;
    import com.life.hua.activity.R;
    import com.life.hua.entity.MapInfo;
    import com.life.hua.util.Configer;
    import com.life.hua.util.Util;public class MyLocalMapActivity extends MapActivity {
    LocationListener mLocationListener = null;// onResume时注册此listener,onPause时需要Remove
    @Override
    protected boolean isRouteDisplayed() {
    // TODO Auto-generated method stub
    return false;
    }
    private Context mContext;
    private MapView mapView;
    BaseApplication baseApp;
    @Override
    protected void onCreate(Bundle arg0) {
    super.onCreate(arg0);
    this.mContext = this; baseApp = (BaseApplication) this.getApplication();
    if (baseApp.mBMapManage == null) {
    baseApp.mBMapManage = new BMapManager(mContext);
    baseApp.mBMapManage.init(baseApp.mStrKey,
    new BaseApplication.MyGeneralListener());
    } else { baseApp.mBMapManage.start();
    }
    setContentView(R.layout.baidumap_layout);
    mapView = (MapView) findViewById(R.id.bmapView);
    }
    private MapInfo mapInfo;
    private MapController mMapController;
    MyOverlay myOverlay;
    @Override
    protected void onResume() { // 注册定位事件
    System.out.println("onResume");
    mapView.removeAllViews();
    super.initMapActivity(baseApp.mBMapManage);
    mMapController = mapView.getController();
    baseApp.mBMapManage.start();
    // 恢复地图状态
    if (mapInfo != null) {
    mMapController.setCenter(mapInfo.getCenter());
    mMapController.setZoom(mapInfo.getZoomLevel());// 放大级别
    mMapController.animateTo(mapInfo.getCenter());
    } else {
    GeoPoint geoPoint = new GeoPoint((int) (Configer.la * 1e6),
    (int) (Configer.lo * 1e6));
    mMapController.zoomIn();// 放大级别
    mMapController.animateTo(geoPoint);
    }
    mapView.setBuiltInZoomControls(true); // 设置启用内置的缩放控件
    mapView.setDrawOverlayWhenZooming(true);
    myOverlay = new MyOverlay();
    mapView.getOverlays().add(myOverlay);
    super.onResume();
    }
    @Override
    protected void onPause() {
    System.out.println("onPause");
    // 保存地图状态
    if (mapInfo == null) {
    mapInfo = new MapInfo();
    }
    mapInfo.setCenter(mapView.getMapCenter());
    mapInfo.setZoom(mapView.getZoomLevel()); BaseApplication app = (BaseApplication) this.getApplication();
    app.mBMapManage.getLocationManager().removeUpdates(mLocationListener);
    app.mBMapManage.stop();
    super.onPause();
    }
    @Override
    protected void onDestroy() {
    System.out.println("onDestroy");
    super.onDestroy();
    BaseApplication app = (BaseApplication) this.getApplication();
    app.mBMapManage.getLocationManager().removeUpdates(mLocationListener);
    mapView.removeAllViews();
    app.mBMapManage.stop();
    System.out.println("onDestroy");
    }
    // 画自己位置图
    class MyOverlay extends Overlay {
    private Bitmap bgBitmap; public MyOverlay() {
    bgBitmap = BitmapFactory.decodeResource(mContext.getResources(),
    R.drawable.mylocation);
    } @Override
    public void draw(Canvas canvas, MapView mapView, boolean arg2) {
    super.draw(canvas, mapView, arg2);
    Paint paint = new Paint();
    paint.setColor(Color.BLACK);
    paint.setTypeface(Typeface.MONOSPACE);
    paint.setTextSize(14);
    Point point = new Point();
    Projection projection = mapView.getProjection();
    GeoPoint geoPoint = new GeoPoint((int) (Configer.la * 1e6),
    (int) (Configer.lo * 1e6));
    projection.toPixels(geoPoint, point);
    int bgWidth = bgBitmap.getWidth();
    int bgHeight = bgBitmap.getHeight();
    canvas.drawBitmap(bgBitmap, point.x - bgWidth / 2, point.y
    - bgHeight, paint);// 画背景
    canvas.drawText("我在这!", point.x - bgWidth / 2 + 30, point.y
    - bgHeight / 2, paint);
    }
    }
      

  5.   


    我用的也是百度地图,解决办法就是保存地图的状态,在onPause把geopoint,跟zoomlevel保存;onResume进行获取;代码如下:import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.Point;
    import android.graphics.Typeface;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;import com.baidu.mapapi.BMapManager;
    import com.baidu.mapapi.GeoPoint;
    import com.baidu.mapapi.LocationListener;
    import com.baidu.mapapi.MapActivity;
    import com.baidu.mapapi.MapController;
    import com.baidu.mapapi.MapView;
    import com.baidu.mapapi.Overlay;
    import com.baidu.mapapi.Projection;
    import com.life.hua.activity.BaseApplication;
    import com.life.hua.activity.R;
    import com.life.hua.entity.MapInfo;
    import com.life.hua.util.Configer;
    import com.life.hua.util.Util;public class MyLocalMapActivity extends MapActivity {
    LocationListener mLocationListener = null;// onResume时注册此listener,onPause时需要Remove
    @Override
    protected boolean isRouteDisplayed() {
    // TODO Auto-generated method stub
    return false;
    }
    private Context mContext;
    private MapView mapView;
    BaseApplication baseApp;
    @Override
    protected void onCreate(Bundle arg0) {
    super.onCreate(arg0);
    this.mContext = this; baseApp = (BaseApplication) this.getApplication();
    if (baseApp.mBMapManage == null) {
    baseApp.mBMapManage = new BMapManager(mContext);
    baseApp.mBMapManage.init(baseApp.mStrKey,
    new BaseApplication.MyGeneralListener());
    } else { baseApp.mBMapManage.start();
    }
    setContentView(R.layout.baidumap_layout);
    mapView = (MapView) findViewById(R.id.bmapView);
    }
    private MapInfo mapInfo;
    private MapController mMapController;
    MyOverlay myOverlay;
    @Override
    protected void onResume() { // 注册定位事件
    System.out.println("onResume");
    mapView.removeAllViews();
    super.initMapActivity(baseApp.mBMapManage);
    mMapController = mapView.getController();
    baseApp.mBMapManage.start();
    // 恢复地图状态
    if (mapInfo != null) {
    mMapController.setCenter(mapInfo.getCenter());
    mMapController.setZoom(mapInfo.getZoomLevel());// 放大级别
    mMapController.animateTo(mapInfo.getCenter());
    } else {
    GeoPoint geoPoint = new GeoPoint((int) (Configer.la * 1e6),
    (int) (Configer.lo * 1e6));
    mMapController.zoomIn();// 放大级别
    mMapController.animateTo(geoPoint);
    }
    mapView.setBuiltInZoomControls(true); // 设置启用内置的缩放控件
    mapView.setDrawOverlayWhenZooming(true);
    myOverlay = new MyOverlay();
    mapView.getOverlays().add(myOverlay);
    super.onResume();
    }
    @Override
    protected void onPause() {
    System.out.println("onPause");
    // 保存地图状态
    if (mapInfo == null) {
    mapInfo = new MapInfo();
    }
    mapInfo.setCenter(mapView.getMapCenter());
    mapInfo.setZoom(mapView.getZoomLevel()); BaseApplication app = (BaseApplication) this.getApplication();
    app.mBMapManage.getLocationManager().removeUpdates(mLocationListener);
    app.mBMapManage.stop();
    super.onPause();
    }
    @Override
    protected void onDestroy() {
    System.out.println("onDestroy");
    super.onDestroy();
    BaseApplication app = (BaseApplication) this.getApplication();
    app.mBMapManage.getLocationManager().removeUpdates(mLocationListener);
    mapView.removeAllViews();
    app.mBMapManage.stop();
    System.out.println("onDestroy");
    }
    // 画自己位置图
    class MyOverlay extends Overlay {
    private Bitmap bgBitmap; public MyOverlay() {
    bgBitmap = BitmapFactory.decodeResource(mContext.getResources(),
    R.drawable.mylocation);
    } @Override
    public void draw(Canvas canvas, MapView mapView, boolean arg2) {
    super.draw(canvas, mapView, arg2);
    Paint paint = new Paint();
    paint.setColor(Color.BLACK);
    paint.setTypeface(Typeface.MONOSPACE);
    paint.setTextSize(14);
    Point point = new Point();
    Projection projection = mapView.getProjection();
    GeoPoint geoPoint = new GeoPoint((int) (Configer.la * 1e6),
    (int) (Configer.lo * 1e6));
    projection.toPixels(geoPoint, point);
    int bgWidth = bgBitmap.getWidth();
    int bgHeight = bgBitmap.getHeight();
    canvas.drawBitmap(bgBitmap, point.x - bgWidth / 2, point.y
    - bgHeight, paint);// 画背景
    canvas.drawText("我在这!", point.x - bgWidth / 2 + 30, point.y
    - bgHeight / 2, paint);
    }
    }
      

  6.   

    升级百度SDK,我用最新的1.3.5版本这个问题就解决了。