2012-02-29 6 views
0

私のタブグループのアクティビティクラスでローカルアクティビティマネージャを使用して、Tabのb/wのさまざまなアクティビティを切り替えます。たとえば、メインタブ1からアクティビティを実行します。 > Act3。アンドロイドのローカルアクティビティマネージャーの問題

ここでは、act2ではtab1のデータに基づいてWebサービスを呼び出しますが、私はAct 3に移動します。しかし、私が戻るボタンAct2 onCreateをクリックすると、再び呼び出されます。

私は、アンドロイドのローカルアクティビティマネージャに問題があり、destroyメソッドに対応する修正コードを実装していることがわかりました。ここで

は、全体的なtabgroupのアクティビティコード..です

import java.lang.reflect.Field; 
import java.util.ArrayList; 
import java.util.Map; 

import android.app.Activity; 
import android.app.ActivityGroup; 
import android.app.LocalActivityManager; 

import android.content.Intent; 
import android.os.Bundle; 
import android.view.KeyEvent; 
import android.view.Window; 

/** 
* The purpose of this Activity is to manage the activities in a tab. 
* Note: Child Activities can handle Key Presses before they are seen here. 
* @author Eric Harlow 
*/ 
public class TabGroupActivity extends ActivityGroup { 

    private ArrayList<String> mIdList; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState);  
     if (mIdList == null) mIdList = new ArrayList<String>(); 
    } 

    /** 
    * This is called when a child activity of this one calls its finish method. 
    * This implementation calls {@link LocalActivityManager#destroyActivity} on the child activity 
    * and starts the previous activity. 
    * If the last child activity just called finish(),this activity (the parent), 
    * calls finish to finish the entire group. 
    */ 
    @Override 
    public void finishFromChild(Activity child) { 
     LocalActivityManager manager = getLocalActivityManager(); 
     int index = mIdList.size()-1; 

     if (index < 1) { 
      finish(); 
      return; 
     } 
     System.out.println("Destroy called"); 
     boolean rt=destroy(mIdList.get(index),manager); 
     System.out.println("Destroy called"+rt); 
//  manager.destroyActivity(mIdList.get(index), true); 
     mIdList.remove(index); index--; 
     String lastId = mIdList.get(index); 
     Intent lastIntent = manager.getActivity(lastId).getIntent(); 
     Window newWindow = manager.startActivity(lastId, lastIntent); 
     setContentView(newWindow.getDecorView()); 
    } 

    /** 
    * Starts an Activity as a child Activity to this. 
    * @param Id Unique identifier of the activity to be started. 
    * @param intent The Intent describing the activity to be started. 
    * @throws android.content.ActivityNotFoundException. 
    */ 
    public void startChildActivity(String Id, Intent intent) {  
     Window window = getLocalActivityManager().startActivity(Id,intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)); 
     if (window != null) { 
      mIdList.add(Id); 
      setContentView(window.getDecorView()); 
     }  
    } 

    /** 
    * The primary purpose is to prevent systems before android.os.Build.VERSION_CODES.ECLAIR 
    * from calling their default KeyEvent.KEYCODE_BACK during onKeyDown. 
    */ 
    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_BACK) { 
      //preventing default implementation previous to android.os.Build.VERSION_CODES.ECLAIR 
      return true; 
     } 
     return super.onKeyDown(keyCode, event); 
    } 

    /** 
    * Overrides the default implementation for KeyEvent.KEYCODE_BACK 
    * so that all systems call onBackPressed(). 
    */ 
    @Override 
    public boolean onKeyUp(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_BACK) { 
      onBackPressed(); 
      return true; 
     } 
     return super.onKeyUp(keyCode, event); 
    } 

    /** 
    * If a Child Activity handles KeyEvent.KEYCODE_BACK. 
    * Simply override and add this method. 
    */ 
    public void onBackPressed () { 
     int length = mIdList.size(); 
     if (length > 1) { 
      Activity current = getLocalActivityManager().getActivity(mIdList.get(length-1)); 
      System.out.println("Activity Being close"+current.getLocalClassName()); 
      current.finish(); 
     } 
    } 
    public boolean destroy(String id,LocalActivityManager activityManager) { 

     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; 
    } 

} 

私は、いずれかのactivity.If再起動を防ぐ方法を知っている `tをソリューションは、私を助けて知っています。

ありがとうございました。

@Override 
    public void finishFromChild(Activity child) { 
     LocalActivityManager manager = getLocalActivityManager(); 
     int index = mIdList.size()-1; 

     if (index < 1) { 
      finish(); 
      return; 
     } 
     System.out.println("Destroy called"); 
     destroy(mIdList.get(index),manager); 

     mIdList.remove(index); index--; 
     String lastId = mIdList.get(index); 
     Intent lastIntent = manager.getActivity(lastId).getIntent(); 
     Window newWindow = manager.startActivity(lastId, lastIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)); 
     setContentView(newWindow.getDecorView()); 
    } 

単に、意図フラグを使用して、フロントにそれをもたらすことによって私たちの活動を再開Intent.FLAG_ACTIVITY_SINGLE_TOPを活性を回復、

+0

私は同じ問題を抱えています。これはどれも解決できますか? –

答えて

0

は、私は次のように問題を解決するが、私はそれが問題を引き起こすかどうかを知る `tをそれを再起動せずに。

+0

ここでmidList値を取得する方法 –

関連する問題