• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2006 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.app;
18 
19 import java.util.ArrayList;
20 
21 import android.content.ComponentCallbacks;
22 import android.content.ComponentCallbacks2;
23 import android.content.Context;
24 import android.content.ContextWrapper;
25 import android.content.Intent;
26 import android.content.res.Configuration;
27 import android.os.Bundle;
28 
29 /**
30  * Base class for those who need to maintain global application state. You can
31  * provide your own implementation by specifying its name in your
32  * AndroidManifest.xml's <application> tag, which will cause that class
33  * to be instantiated for you when the process for your application/package is
34  * created.
35  *
36  * <p class="note">There is normally no need to subclass Application.  In
37  * most situation, static singletons can provide the same functionality in a
38  * more modular way.  If your singleton needs a global context (for example
39  * to register broadcast receivers), the function to retrieve it can be
40  * given a {@link android.content.Context} which internally uses
41  * {@link android.content.Context#getApplicationContext() Context.getApplicationContext()}
42  * when first constructing the singleton.</p>
43  */
44 public class Application extends ContextWrapper implements ComponentCallbacks2 {
45     private ArrayList<ComponentCallbacks> mComponentCallbacks =
46             new ArrayList<ComponentCallbacks>();
47     private ArrayList<ActivityLifecycleCallbacks> mActivityLifecycleCallbacks =
48             new ArrayList<ActivityLifecycleCallbacks>();
49     private ArrayList<OnProvideAssistDataListener> mAssistCallbacks = null;
50 
51     /** @hide */
52     public LoadedApk mLoadedApk;
53 
54     public interface ActivityLifecycleCallbacks {
onActivityCreated(Activity activity, Bundle savedInstanceState)55         void onActivityCreated(Activity activity, Bundle savedInstanceState);
onActivityStarted(Activity activity)56         void onActivityStarted(Activity activity);
onActivityResumed(Activity activity)57         void onActivityResumed(Activity activity);
onActivityPaused(Activity activity)58         void onActivityPaused(Activity activity);
onActivityStopped(Activity activity)59         void onActivityStopped(Activity activity);
onActivitySaveInstanceState(Activity activity, Bundle outState)60         void onActivitySaveInstanceState(Activity activity, Bundle outState);
onActivityDestroyed(Activity activity)61         void onActivityDestroyed(Activity activity);
62     }
63 
64     /**
65      * Callback interface for use with {@link Application#registerOnProvideAssistDataListener}
66      * and {@link Application#unregisterOnProvideAssistDataListener}.
67      */
68     public interface OnProvideAssistDataListener {
69         /**
70          * This is called when the user is requesting an assist, to build a full
71          * {@link Intent#ACTION_ASSIST} Intent with all of the context of the current
72          * application.  You can override this method to place into the bundle anything
73          * you would like to appear in the {@link Intent#EXTRA_ASSIST_CONTEXT} part
74          * of the assist Intent.
75          */
onProvideAssistData(Activity activity, Bundle data)76         public void onProvideAssistData(Activity activity, Bundle data);
77     }
78 
Application()79     public Application() {
80         super(null);
81     }
82 
83     /**
84      * Called when the application is starting, before any activity, service,
85      * or receiver objects (excluding content providers) have been created.
86      * Implementations should be as quick as possible (for example using
87      * lazy initialization of state) since the time spent in this function
88      * directly impacts the performance of starting the first activity,
89      * service, or receiver in a process.
90      * If you override this method, be sure to call super.onCreate().
91      */
onCreate()92     public void onCreate() {
93     }
94 
95     /**
96      * This method is for use in emulated process environments.  It will
97      * never be called on a production Android device, where processes are
98      * removed by simply killing them; no user code (including this callback)
99      * is executed when doing so.
100      */
onTerminate()101     public void onTerminate() {
102     }
103 
onConfigurationChanged(Configuration newConfig)104     public void onConfigurationChanged(Configuration newConfig) {
105         Object[] callbacks = collectComponentCallbacks();
106         if (callbacks != null) {
107             for (int i=0; i<callbacks.length; i++) {
108                 ((ComponentCallbacks)callbacks[i]).onConfigurationChanged(newConfig);
109             }
110         }
111     }
112 
onLowMemory()113     public void onLowMemory() {
114         Object[] callbacks = collectComponentCallbacks();
115         if (callbacks != null) {
116             for (int i=0; i<callbacks.length; i++) {
117                 ((ComponentCallbacks)callbacks[i]).onLowMemory();
118             }
119         }
120     }
121 
onTrimMemory(int level)122     public void onTrimMemory(int level) {
123         Object[] callbacks = collectComponentCallbacks();
124         if (callbacks != null) {
125             for (int i=0; i<callbacks.length; i++) {
126                 Object c = callbacks[i];
127                 if (c instanceof ComponentCallbacks2) {
128                     ((ComponentCallbacks2)c).onTrimMemory(level);
129                 }
130             }
131         }
132     }
133 
registerComponentCallbacks(ComponentCallbacks callback)134     public void registerComponentCallbacks(ComponentCallbacks callback) {
135         synchronized (mComponentCallbacks) {
136             mComponentCallbacks.add(callback);
137         }
138     }
139 
unregisterComponentCallbacks(ComponentCallbacks callback)140     public void unregisterComponentCallbacks(ComponentCallbacks callback) {
141         synchronized (mComponentCallbacks) {
142             mComponentCallbacks.remove(callback);
143         }
144     }
145 
registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback)146     public void registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) {
147         synchronized (mActivityLifecycleCallbacks) {
148             mActivityLifecycleCallbacks.add(callback);
149         }
150     }
151 
unregisterActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback)152     public void unregisterActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) {
153         synchronized (mActivityLifecycleCallbacks) {
154             mActivityLifecycleCallbacks.remove(callback);
155         }
156     }
157 
registerOnProvideAssistDataListener(OnProvideAssistDataListener callback)158     public void registerOnProvideAssistDataListener(OnProvideAssistDataListener callback) {
159         synchronized (this) {
160             if (mAssistCallbacks == null) {
161                 mAssistCallbacks = new ArrayList<OnProvideAssistDataListener>();
162             }
163             mAssistCallbacks.add(callback);
164         }
165     }
166 
unregisterOnProvideAssistDataListener(OnProvideAssistDataListener callback)167     public void unregisterOnProvideAssistDataListener(OnProvideAssistDataListener callback) {
168         synchronized (this) {
169             if (mAssistCallbacks != null) {
170                 mAssistCallbacks.remove(callback);
171             }
172         }
173     }
174 
175     // ------------------ Internal API ------------------
176 
177     /**
178      * @hide
179      */
attach(Context context)180     /* package */ final void attach(Context context) {
181         attachBaseContext(context);
182         mLoadedApk = ContextImpl.getImpl(context).mPackageInfo;
183     }
184 
dispatchActivityCreated(Activity activity, Bundle savedInstanceState)185     /* package */ void dispatchActivityCreated(Activity activity, Bundle savedInstanceState) {
186         Object[] callbacks = collectActivityLifecycleCallbacks();
187         if (callbacks != null) {
188             for (int i=0; i<callbacks.length; i++) {
189                 ((ActivityLifecycleCallbacks)callbacks[i]).onActivityCreated(activity,
190                         savedInstanceState);
191             }
192         }
193     }
194 
dispatchActivityStarted(Activity activity)195     /* package */ void dispatchActivityStarted(Activity activity) {
196         Object[] callbacks = collectActivityLifecycleCallbacks();
197         if (callbacks != null) {
198             for (int i=0; i<callbacks.length; i++) {
199                 ((ActivityLifecycleCallbacks)callbacks[i]).onActivityStarted(activity);
200             }
201         }
202     }
203 
dispatchActivityResumed(Activity activity)204     /* package */ void dispatchActivityResumed(Activity activity) {
205         Object[] callbacks = collectActivityLifecycleCallbacks();
206         if (callbacks != null) {
207             for (int i=0; i<callbacks.length; i++) {
208                 ((ActivityLifecycleCallbacks)callbacks[i]).onActivityResumed(activity);
209             }
210         }
211     }
212 
dispatchActivityPaused(Activity activity)213     /* package */ void dispatchActivityPaused(Activity activity) {
214         Object[] callbacks = collectActivityLifecycleCallbacks();
215         if (callbacks != null) {
216             for (int i=0; i<callbacks.length; i++) {
217                 ((ActivityLifecycleCallbacks)callbacks[i]).onActivityPaused(activity);
218             }
219         }
220     }
221 
dispatchActivityStopped(Activity activity)222     /* package */ void dispatchActivityStopped(Activity activity) {
223         Object[] callbacks = collectActivityLifecycleCallbacks();
224         if (callbacks != null) {
225             for (int i=0; i<callbacks.length; i++) {
226                 ((ActivityLifecycleCallbacks)callbacks[i]).onActivityStopped(activity);
227             }
228         }
229     }
230 
dispatchActivitySaveInstanceState(Activity activity, Bundle outState)231     /* package */ void dispatchActivitySaveInstanceState(Activity activity, Bundle outState) {
232         Object[] callbacks = collectActivityLifecycleCallbacks();
233         if (callbacks != null) {
234             for (int i=0; i<callbacks.length; i++) {
235                 ((ActivityLifecycleCallbacks)callbacks[i]).onActivitySaveInstanceState(activity,
236                         outState);
237             }
238         }
239     }
240 
dispatchActivityDestroyed(Activity activity)241     /* package */ void dispatchActivityDestroyed(Activity activity) {
242         Object[] callbacks = collectActivityLifecycleCallbacks();
243         if (callbacks != null) {
244             for (int i=0; i<callbacks.length; i++) {
245                 ((ActivityLifecycleCallbacks)callbacks[i]).onActivityDestroyed(activity);
246             }
247         }
248     }
249 
collectComponentCallbacks()250     private Object[] collectComponentCallbacks() {
251         Object[] callbacks = null;
252         synchronized (mComponentCallbacks) {
253             if (mComponentCallbacks.size() > 0) {
254                 callbacks = mComponentCallbacks.toArray();
255             }
256         }
257         return callbacks;
258     }
259 
collectActivityLifecycleCallbacks()260     private Object[] collectActivityLifecycleCallbacks() {
261         Object[] callbacks = null;
262         synchronized (mActivityLifecycleCallbacks) {
263             if (mActivityLifecycleCallbacks.size() > 0) {
264                 callbacks = mActivityLifecycleCallbacks.toArray();
265             }
266         }
267         return callbacks;
268     }
269 
dispatchOnProvideAssistData(Activity activity, Bundle data)270     /* package */ void dispatchOnProvideAssistData(Activity activity, Bundle data) {
271         Object[] callbacks;
272         synchronized (this) {
273             if (mAssistCallbacks == null) {
274                 return;
275             }
276             callbacks = mAssistCallbacks.toArray();
277         }
278         if (callbacks != null) {
279             for (int i=0; i<callbacks.length; i++) {
280                 ((OnProvideAssistDataListener)callbacks[i]).onProvideAssistData(activity, data);
281             }
282         }
283     }
284 }
285