19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.app;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackbornimport java.util.ArrayList;
20c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentCallbacks;
22c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackbornimport android.content.ComponentCallbacks2;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContextWrapper;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Configuration;
26c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackbornimport android.os.Bundle;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Base class for those who need to maintain global application state. You can
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provide your own implementation by specifying its name in your
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * AndroidManifest.xml's <application> tag, which will cause that class
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to be instantiated for you when the process for your application/package is
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * created.
347025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn *
357025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn * <p class="note">There is normally no need to subclass Application.  In
367025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn * most situation, static singletons can provide the same functionality in a
377025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn * more modular way.  If your singleton needs a global context (for example
387025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn * to register broadcast receivers), the function to retrieve it can be
397025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn * given a {@link android.content.Context} which internally uses
407025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn * {@link android.content.Context#getApplicationContext() Context.getApplicationContext()}
417025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn * when first constructing the singleton.</p>
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
43c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackbornpublic class Application extends ContextWrapper implements ComponentCallbacks2 {
44c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    private ArrayList<ComponentCallbacks> mComponentCallbacks =
45c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            new ArrayList<ComponentCallbacks>();
46c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    private ArrayList<ActivityLifecycleCallbacks> mActivityLifecycleCallbacks =
47c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            new ArrayList<ActivityLifecycleCallbacks>();
48c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
495fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    /** @hide */
505fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    public LoadedApk mLoadedApk;
51c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
52c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    public interface ActivityLifecycleCallbacks {
53c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        void onActivityCreated(Activity activity, Bundle savedInstanceState);
54c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        void onActivityStarted(Activity activity);
55c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        void onActivityResumed(Activity activity);
56c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        void onActivityPaused(Activity activity);
57c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        void onActivityStopped(Activity activity);
58c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        void onActivitySaveInstanceState(Activity activity, Bundle outState);
59c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        void onActivityDestroyed(Activity activity);
60c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
61c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Application() {
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(null);
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
678e61185918b9b4ef8de6ecffb0d77afaeb336abdJacob Nordfalk     * Called when the application is starting, before any activity, service,
688e61185918b9b4ef8de6ecffb0d77afaeb336abdJacob Nordfalk     * or receiver objects (excluding content providers) have been created.
698e61185918b9b4ef8de6ecffb0d77afaeb336abdJacob Nordfalk     * Implementations should be as quick as possible (for example using
708e61185918b9b4ef8de6ecffb0d77afaeb336abdJacob Nordfalk     * lazy initialization of state) since the time spent in this function
718e61185918b9b4ef8de6ecffb0d77afaeb336abdJacob Nordfalk     * directly impacts the performance of starting the first activity,
728e61185918b9b4ef8de6ecffb0d77afaeb336abdJacob Nordfalk     * service, or receiver in a process.
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If you override this method, be sure to call super.onCreate().
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onCreate() {
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
797025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn     * This method is for use in emulated process environments.  It will
807025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn     * never be called on a production Android device, where processes are
817025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn     * removed by simply killing them; no user code (including this callback)
827025d8e4b96f14a92f9bb20902732f43d1c93e7bDianne Hackborn     * is executed when doing so.
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onTerminate() {
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
86c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onConfigurationChanged(Configuration newConfig) {
88c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = collectComponentCallbacks();
89c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        if (callbacks != null) {
90c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            for (int i=0; i<callbacks.length; i++) {
91c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                ((ComponentCallbacks)callbacks[i]).onConfigurationChanged(newConfig);
92c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
93c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
95c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onLowMemory() {
97c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = collectComponentCallbacks();
98c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        if (callbacks != null) {
99c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            for (int i=0; i<callbacks.length; i++) {
100c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                ((ComponentCallbacks)callbacks[i]).onLowMemory();
101c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
102c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
103c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
104c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
105c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    public void onTrimMemory(int level) {
106c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = collectComponentCallbacks();
107c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        if (callbacks != null) {
108c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            for (int i=0; i<callbacks.length; i++) {
109c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                Object c = callbacks[i];
110c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                if (c instanceof ComponentCallbacks2) {
111c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                    ((ComponentCallbacks2)c).onTrimMemory(level);
112c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                }
113c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
114c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
115c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
116c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
117c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    public void registerComponentCallbacks(ComponentCallbacks callback) {
118c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        synchronized (mComponentCallbacks) {
119c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            mComponentCallbacks.add(callback);
120c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
121c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
122c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
123c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    public void unregisterComponentCallbacks(ComponentCallbacks callback) {
124c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        synchronized (mComponentCallbacks) {
125c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            mComponentCallbacks.remove(callback);
126c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
127c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
128c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
129c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    public void registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) {
130c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        synchronized (mActivityLifecycleCallbacks) {
131c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            mActivityLifecycleCallbacks.add(callback);
132c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
133c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
134c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
135c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    public void unregisterActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) {
136c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        synchronized (mActivityLifecycleCallbacks) {
137c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            mActivityLifecycleCallbacks.remove(callback);
138c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ------------------ Internal API ------------------
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* package */ final void attach(Context context) {
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        attachBaseContext(context);
1485fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        mLoadedApk = ContextImpl.getImpl(context).mPackageInfo;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
150c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
151c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    /* package */ void dispatchActivityCreated(Activity activity, Bundle savedInstanceState) {
152c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = collectActivityLifecycleCallbacks();
153c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        if (callbacks != null) {
154c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            for (int i=0; i<callbacks.length; i++) {
155c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityCreated(activity,
156c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                        savedInstanceState);
157c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
158c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
159c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
160c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
161c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    /* package */ void dispatchActivityStarted(Activity activity) {
162c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = collectActivityLifecycleCallbacks();
163c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        if (callbacks != null) {
164c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            for (int i=0; i<callbacks.length; i++) {
165c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityStarted(activity);
166c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
167c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
168c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
169c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
170c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    /* package */ void dispatchActivityResumed(Activity activity) {
171c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = collectActivityLifecycleCallbacks();
172c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        if (callbacks != null) {
173c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            for (int i=0; i<callbacks.length; i++) {
174c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityResumed(activity);
175c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
176c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
177c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
178c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
179c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    /* package */ void dispatchActivityPaused(Activity activity) {
180c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = collectActivityLifecycleCallbacks();
181c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        if (callbacks != null) {
182c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            for (int i=0; i<callbacks.length; i++) {
183c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityPaused(activity);
184c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
185c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
186c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
187c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
188c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    /* package */ void dispatchActivityStopped(Activity activity) {
189c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = collectActivityLifecycleCallbacks();
190c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        if (callbacks != null) {
191c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            for (int i=0; i<callbacks.length; i++) {
192c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityStopped(activity);
193c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
194c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
195c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
196c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
197c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    /* package */ void dispatchActivitySaveInstanceState(Activity activity, Bundle outState) {
198c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = collectActivityLifecycleCallbacks();
199c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        if (callbacks != null) {
200c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            for (int i=0; i<callbacks.length; i++) {
201c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                ((ActivityLifecycleCallbacks)callbacks[i]).onActivitySaveInstanceState(activity,
202c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                        outState);
203c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
204c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
205c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
206c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
207c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    /* package */ void dispatchActivityDestroyed(Activity activity) {
208c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = collectActivityLifecycleCallbacks();
209c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        if (callbacks != null) {
210c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            for (int i=0; i<callbacks.length; i++) {
211c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityDestroyed(activity);
212c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
213c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
214c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
215c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
216c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    private Object[] collectComponentCallbacks() {
217c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = null;
218c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        synchronized (mComponentCallbacks) {
219c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            if (mComponentCallbacks.size() > 0) {
220c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                callbacks = mComponentCallbacks.toArray();
221c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
222c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
223c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        return callbacks;
224c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
225c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn
226c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    private Object[] collectActivityLifecycleCallbacks() {
227c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        Object[] callbacks = null;
228c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        synchronized (mActivityLifecycleCallbacks) {
229c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            if (mActivityLifecycleCallbacks.size() > 0) {
230c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                callbacks = mActivityLifecycleCallbacks.toArray();
231c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn            }
232c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        }
233c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        return callbacks;
234c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn    }
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
236