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.res.Configuration; 26 import android.os.Bundle; 27 28 /** 29 * Base class for those who need to maintain global application state. You can 30 * provide your own implementation by specifying its name in your 31 * AndroidManifest.xml's <application> tag, which will cause that class 32 * to be instantiated for you when the process for your application/package is 33 * created. 34 * 35 * <p class="note">There is normally no need to subclass Application. In 36 * most situation, static singletons can provide the same functionality in a 37 * more modular way. If your singleton needs a global context (for example 38 * to register broadcast receivers), the function to retrieve it can be 39 * given a {@link android.content.Context} which internally uses 40 * {@link android.content.Context#getApplicationContext() Context.getApplicationContext()} 41 * when first constructing the singleton.</p> 42 */ 43 public class Application extends ContextWrapper implements ComponentCallbacks2 { 44 private ArrayList<ComponentCallbacks> mComponentCallbacks = 45 new ArrayList<ComponentCallbacks>(); 46 private ArrayList<ActivityLifecycleCallbacks> mActivityLifecycleCallbacks = 47 new ArrayList<ActivityLifecycleCallbacks>(); 48 49 /** @hide */ 50 public LoadedApk mLoadedApk; 51 52 public interface ActivityLifecycleCallbacks { onActivityCreated(Activity activity, Bundle savedInstanceState)53 void onActivityCreated(Activity activity, Bundle savedInstanceState); onActivityStarted(Activity activity)54 void onActivityStarted(Activity activity); onActivityResumed(Activity activity)55 void onActivityResumed(Activity activity); onActivityPaused(Activity activity)56 void onActivityPaused(Activity activity); onActivityStopped(Activity activity)57 void onActivityStopped(Activity activity); onActivitySaveInstanceState(Activity activity, Bundle outState)58 void onActivitySaveInstanceState(Activity activity, Bundle outState); onActivityDestroyed(Activity activity)59 void onActivityDestroyed(Activity activity); 60 } 61 Application()62 public Application() { 63 super(null); 64 } 65 66 /** 67 * Called when the application is starting, before any activity, service, 68 * or receiver objects (excluding content providers) have been created. 69 * Implementations should be as quick as possible (for example using 70 * lazy initialization of state) since the time spent in this function 71 * directly impacts the performance of starting the first activity, 72 * service, or receiver in a process. 73 * If you override this method, be sure to call super.onCreate(). 74 */ onCreate()75 public void onCreate() { 76 } 77 78 /** 79 * This method is for use in emulated process environments. It will 80 * never be called on a production Android device, where processes are 81 * removed by simply killing them; no user code (including this callback) 82 * is executed when doing so. 83 */ onTerminate()84 public void onTerminate() { 85 } 86 onConfigurationChanged(Configuration newConfig)87 public void onConfigurationChanged(Configuration newConfig) { 88 Object[] callbacks = collectComponentCallbacks(); 89 if (callbacks != null) { 90 for (int i=0; i<callbacks.length; i++) { 91 ((ComponentCallbacks)callbacks[i]).onConfigurationChanged(newConfig); 92 } 93 } 94 } 95 onLowMemory()96 public void onLowMemory() { 97 Object[] callbacks = collectComponentCallbacks(); 98 if (callbacks != null) { 99 for (int i=0; i<callbacks.length; i++) { 100 ((ComponentCallbacks)callbacks[i]).onLowMemory(); 101 } 102 } 103 } 104 onTrimMemory(int level)105 public void onTrimMemory(int level) { 106 Object[] callbacks = collectComponentCallbacks(); 107 if (callbacks != null) { 108 for (int i=0; i<callbacks.length; i++) { 109 Object c = callbacks[i]; 110 if (c instanceof ComponentCallbacks2) { 111 ((ComponentCallbacks2)c).onTrimMemory(level); 112 } 113 } 114 } 115 } 116 registerComponentCallbacks(ComponentCallbacks callback)117 public void registerComponentCallbacks(ComponentCallbacks callback) { 118 synchronized (mComponentCallbacks) { 119 mComponentCallbacks.add(callback); 120 } 121 } 122 unregisterComponentCallbacks(ComponentCallbacks callback)123 public void unregisterComponentCallbacks(ComponentCallbacks callback) { 124 synchronized (mComponentCallbacks) { 125 mComponentCallbacks.remove(callback); 126 } 127 } 128 registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback)129 public void registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) { 130 synchronized (mActivityLifecycleCallbacks) { 131 mActivityLifecycleCallbacks.add(callback); 132 } 133 } 134 unregisterActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback)135 public void unregisterActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) { 136 synchronized (mActivityLifecycleCallbacks) { 137 mActivityLifecycleCallbacks.remove(callback); 138 } 139 } 140 141 // ------------------ Internal API ------------------ 142 143 /** 144 * @hide 145 */ attach(Context context)146 /* package */ final void attach(Context context) { 147 attachBaseContext(context); 148 mLoadedApk = ContextImpl.getImpl(context).mPackageInfo; 149 } 150 dispatchActivityCreated(Activity activity, Bundle savedInstanceState)151 /* package */ void dispatchActivityCreated(Activity activity, Bundle savedInstanceState) { 152 Object[] callbacks = collectActivityLifecycleCallbacks(); 153 if (callbacks != null) { 154 for (int i=0; i<callbacks.length; i++) { 155 ((ActivityLifecycleCallbacks)callbacks[i]).onActivityCreated(activity, 156 savedInstanceState); 157 } 158 } 159 } 160 dispatchActivityStarted(Activity activity)161 /* package */ void dispatchActivityStarted(Activity activity) { 162 Object[] callbacks = collectActivityLifecycleCallbacks(); 163 if (callbacks != null) { 164 for (int i=0; i<callbacks.length; i++) { 165 ((ActivityLifecycleCallbacks)callbacks[i]).onActivityStarted(activity); 166 } 167 } 168 } 169 dispatchActivityResumed(Activity activity)170 /* package */ void dispatchActivityResumed(Activity activity) { 171 Object[] callbacks = collectActivityLifecycleCallbacks(); 172 if (callbacks != null) { 173 for (int i=0; i<callbacks.length; i++) { 174 ((ActivityLifecycleCallbacks)callbacks[i]).onActivityResumed(activity); 175 } 176 } 177 } 178 dispatchActivityPaused(Activity activity)179 /* package */ void dispatchActivityPaused(Activity activity) { 180 Object[] callbacks = collectActivityLifecycleCallbacks(); 181 if (callbacks != null) { 182 for (int i=0; i<callbacks.length; i++) { 183 ((ActivityLifecycleCallbacks)callbacks[i]).onActivityPaused(activity); 184 } 185 } 186 } 187 dispatchActivityStopped(Activity activity)188 /* package */ void dispatchActivityStopped(Activity activity) { 189 Object[] callbacks = collectActivityLifecycleCallbacks(); 190 if (callbacks != null) { 191 for (int i=0; i<callbacks.length; i++) { 192 ((ActivityLifecycleCallbacks)callbacks[i]).onActivityStopped(activity); 193 } 194 } 195 } 196 dispatchActivitySaveInstanceState(Activity activity, Bundle outState)197 /* package */ void dispatchActivitySaveInstanceState(Activity activity, Bundle outState) { 198 Object[] callbacks = collectActivityLifecycleCallbacks(); 199 if (callbacks != null) { 200 for (int i=0; i<callbacks.length; i++) { 201 ((ActivityLifecycleCallbacks)callbacks[i]).onActivitySaveInstanceState(activity, 202 outState); 203 } 204 } 205 } 206 dispatchActivityDestroyed(Activity activity)207 /* package */ void dispatchActivityDestroyed(Activity activity) { 208 Object[] callbacks = collectActivityLifecycleCallbacks(); 209 if (callbacks != null) { 210 for (int i=0; i<callbacks.length; i++) { 211 ((ActivityLifecycleCallbacks)callbacks[i]).onActivityDestroyed(activity); 212 } 213 } 214 } 215 collectComponentCallbacks()216 private Object[] collectComponentCallbacks() { 217 Object[] callbacks = null; 218 synchronized (mComponentCallbacks) { 219 if (mComponentCallbacks.size() > 0) { 220 callbacks = mComponentCallbacks.toArray(); 221 } 222 } 223 return callbacks; 224 } 225 collectActivityLifecycleCallbacks()226 private Object[] collectActivityLifecycleCallbacks() { 227 Object[] callbacks = null; 228 synchronized (mActivityLifecycleCallbacks) { 229 if (mActivityLifecycleCallbacks.size() > 0) { 230 callbacks = mActivityLifecycleCallbacks.toArray(); 231 } 232 } 233 return callbacks; 234 } 235 } 236