@@ -653,8 +653,9 @@ public class Activity extends ContextThemeWrapper
653653 /** Start of user-defined activity results. */
654654 public static final int RESULT_FIRST_USER = 1 ;
655655
656+ static final String FRAGMENTS_TAG = "android:fragments" ;
657+
656658 private static final String WINDOW_HIERARCHY_TAG = "android:viewHierarchyState" ;
657- private static final String FRAGMENTS_TAG = "android:fragments" ;
658659 private static final String SAVED_DIALOG_IDS_KEY = "android:savedDialogIds" ;
659660 private static final String SAVED_DIALOGS_TAG = "android:savedDialogs" ;
660661 private static final String SAVED_DIALOG_KEY_PREFIX = "android:dialog_" ;
@@ -697,7 +698,7 @@ static final class NonConfigurationInstances {
697698 Object activity ;
698699 HashMap <String , Object > children ;
699700 ArrayList <Fragment > fragments ;
700- SparseArray < LoaderManagerImpl > loaders ;
701+ HashMap < String , LoaderManagerImpl > loaders ;
701702 }
702703 /* package */ NonConfigurationInstances mLastNonConfigurationInstances ;
703704
@@ -715,8 +716,14 @@ static final class NonConfigurationInstances {
715716 private int mTitleColor = 0 ;
716717
717718 final FragmentManagerImpl mFragments = new FragmentManagerImpl ();
719+ final FragmentContainer mContainer = new FragmentContainer () {
720+ @ Override
721+ public View findViewById (int id ) {
722+ return Activity .this .findViewById (id );
723+ }
724+ };
718725
719- SparseArray < LoaderManagerImpl > mAllLoaderManagers ;
726+ HashMap < String , LoaderManagerImpl > mAllLoaderManagers ;
720727 LoaderManagerImpl mLoaderManager ;
721728
722729 private static final class ManagedCursor {
@@ -744,6 +751,7 @@ private static final class ManagedCursor {
744751
745752 protected static final int [] FOCUSED_STATE_SET = {com .android .internal .R .attr .state_focused };
746753
754+ @ SuppressWarnings ("unused" )
747755 private final Object mInstanceTracker = StrictMode .trackActivity (this );
748756
749757 private Thread mUiThread ;
@@ -808,19 +816,19 @@ public LoaderManager getLoaderManager() {
808816 return mLoaderManager ;
809817 }
810818 mCheckedForLoaderManager = true ;
811- mLoaderManager = getLoaderManager (- 1 , mLoadersStarted , true );
819+ mLoaderManager = getLoaderManager (null , mLoadersStarted , true );
812820 return mLoaderManager ;
813821 }
814822
815- LoaderManagerImpl getLoaderManager (int index , boolean started , boolean create ) {
823+ LoaderManagerImpl getLoaderManager (String who , boolean started , boolean create ) {
816824 if (mAllLoaderManagers == null ) {
817- mAllLoaderManagers = new SparseArray < LoaderManagerImpl >();
825+ mAllLoaderManagers = new HashMap < String , LoaderManagerImpl >();
818826 }
819- LoaderManagerImpl lm = mAllLoaderManagers .get (index );
827+ LoaderManagerImpl lm = mAllLoaderManagers .get (who );
820828 if (lm == null ) {
821829 if (create ) {
822- lm = new LoaderManagerImpl (this , started );
823- mAllLoaderManagers .put (index , lm );
830+ lm = new LoaderManagerImpl (who , this , started );
831+ mAllLoaderManagers .put (who , lm );
824832 }
825833 } else {
826834 lm .updateActivity (this );
@@ -1025,7 +1033,7 @@ protected void onStart() {
10251033 if (mLoaderManager != null ) {
10261034 mLoaderManager .doStart ();
10271035 } else if (!mCheckedForLoaderManager ) {
1028- mLoaderManager = getLoaderManager (- 1 , mLoadersStarted , false );
1036+ mLoaderManager = getLoaderManager (null , mLoadersStarted , false );
10291037 }
10301038 mCheckedForLoaderManager = true ;
10311039 }
@@ -1601,13 +1609,17 @@ NonConfigurationInstances retainNonConfigurationInstances() {
16011609 if (mAllLoaderManagers != null ) {
16021610 // prune out any loader managers that were already stopped and so
16031611 // have nothing useful to retain.
1604- for (int i =mAllLoaderManagers .size ()-1 ; i >=0 ; i --) {
1605- LoaderManagerImpl lm = mAllLoaderManagers .valueAt (i );
1606- if (lm .mRetaining ) {
1607- retainLoaders = true ;
1608- } else {
1609- lm .doDestroy ();
1610- mAllLoaderManagers .removeAt (i );
1612+ LoaderManagerImpl loaders [] = new LoaderManagerImpl [mAllLoaderManagers .size ()];
1613+ mAllLoaderManagers .values ().toArray (loaders );
1614+ if (loaders != null ) {
1615+ for (int i =0 ; i <loaders .length ; i ++) {
1616+ LoaderManagerImpl lm = loaders [i ];
1617+ if (lm .mRetaining ) {
1618+ retainLoaders = true ;
1619+ } else {
1620+ lm .doDestroy ();
1621+ mAllLoaderManagers .remove (lm .mWho );
1622+ }
16111623 }
16121624 }
16131625 }
@@ -1643,13 +1655,13 @@ public FragmentManager getFragmentManager() {
16431655 return mFragments ;
16441656 }
16451657
1646- void invalidateFragmentIndex ( int index ) {
1658+ void invalidateFragment ( String who ) {
16471659 //Log.v(TAG, "invalidateFragmentIndex: index=" + index);
16481660 if (mAllLoaderManagers != null ) {
1649- LoaderManagerImpl lm = mAllLoaderManagers .get (index );
1661+ LoaderManagerImpl lm = mAllLoaderManagers .get (who );
16501662 if (lm != null && !lm .mRetaining ) {
16511663 lm .doDestroy ();
1652- mAllLoaderManagers .remove (index );
1664+ mAllLoaderManagers .remove (who );
16531665 }
16541666 }
16551667 }
@@ -4739,6 +4751,10 @@ public View onCreateView(View parent, String name, Context context, AttributeSet
47394751 * @param args additional arguments to the dump request.
47404752 */
47414753 public void dump (String prefix , FileDescriptor fd , PrintWriter writer , String [] args ) {
4754+ dumpInner (prefix , fd , writer , args );
4755+ }
4756+
4757+ void dumpInner (String prefix , FileDescriptor fd , PrintWriter writer , String [] args ) {
47424758 writer .print (prefix ); writer .print ("Local Activity " );
47434759 writer .print (Integer .toHexString (System .identityHashCode (this )));
47444760 writer .println (" State:" );
@@ -5019,7 +5035,7 @@ final void attach(Context context, ActivityThread aThread,
50195035 Configuration config ) {
50205036 attachBaseContext (context );
50215037
5022- mFragments .attachActivity (this );
5038+ mFragments .attachActivity (this , mContainer , null );
50235039
50245040 mWindow = PolicyManager .makeNewWindow (this );
50255041 mWindow .setCallback (this );
@@ -5080,10 +5096,14 @@ final void performStart() {
50805096 }
50815097 mFragments .dispatchStart ();
50825098 if (mAllLoaderManagers != null ) {
5083- for (int i =mAllLoaderManagers .size ()-1 ; i >=0 ; i --) {
5084- LoaderManagerImpl lm = mAllLoaderManagers .valueAt (i );
5085- lm .finishRetain ();
5086- lm .doReportStart ();
5099+ LoaderManagerImpl loaders [] = new LoaderManagerImpl [mAllLoaderManagers .size ()];
5100+ mAllLoaderManagers .values ().toArray (loaders );
5101+ if (loaders != null ) {
5102+ for (int i =0 ; i <loaders .length ; i ++) {
5103+ LoaderManagerImpl lm = loaders [i ];
5104+ lm .finishRetain ();
5105+ lm .doReportStart ();
5106+ }
50875107 }
50885108 }
50895109 }
0 commit comments