Home | History | Annotate | Download | only in content
      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.content;
     18 
     19 import android.annotation.IntDef;
     20 
     21 import java.lang.annotation.Retention;
     22 import java.lang.annotation.RetentionPolicy;
     23 
     24 /**
     25  * Extended {@link ComponentCallbacks} interface with a new callback for
     26  * finer-grained memory management. This interface is available in all application components
     27  * ({@link android.app.Activity}, {@link android.app.Service},
     28  * {@link ContentProvider}, and {@link android.app.Application}).
     29  *
     30  * <p>You should implement {@link #onTrimMemory} to incrementally release memory based on current
     31  * system constraints. Using this callback to release your resources helps provide a more
     32  * responsive system overall, but also directly benefits the user experience for
     33  * your app by allowing the system to keep your process alive longer. That is,
     34  * if you <em>don't</em> trim your resources based on memory levels defined by this callback,
     35  * the system is more likely to kill your process while it is cached in the least-recently used
     36  * (LRU) list, thus requiring your app to restart and restore all state when the user returns to it.
     37  *
     38  * <p>The values provided by {@link #onTrimMemory} do not represent a single linear progression of
     39  * memory limits, but provide you different types of clues about memory availability:</p>
     40  * <ul>
     41  * <li>When your app is running:
     42  *  <ol>
     43  *  <li>{@link #TRIM_MEMORY_RUNNING_MODERATE} <br>The device is beginning to run low on memory.
     44  * Your app is running and not killable.
     45  *  <li>{@link #TRIM_MEMORY_RUNNING_LOW} <br>The device is running much lower on memory.
     46  * Your app is running and not killable, but please release unused resources to improve system
     47  * performance (which directly impacts your app's performance).
     48  *  <li>{@link #TRIM_MEMORY_RUNNING_CRITICAL} <br>The device is running extremely low on memory.
     49  * Your app is not yet considered a killable process, but the system will begin killing
     50  * background processes if apps do not release resources, so you should release non-critical
     51  * resources now to prevent performance degradation.
     52  *  </ol>
     53  * </li>
     54  * <li>When your app's visibility changes:
     55  *  <ol>
     56  *  <li>{@link #TRIM_MEMORY_UI_HIDDEN} <br>Your app's UI is no longer visible, so this is a good
     57  * time to release large resources that are used only by your UI.
     58  *  </ol>
     59  * </li>
     60  * <li>When your app's process resides in the background LRU list:
     61  *  <ol>
     62  *  <li>{@link #TRIM_MEMORY_BACKGROUND} <br>The system is running low on memory and your process is
     63  * near the beginning of the LRU list. Although your app process is not at a high risk of being
     64  * killed, the system may already be killing processes in the LRU list, so you should release
     65  * resources that are easy to recover so your process will remain in the list and resume
     66  * quickly when the user returns to your app.
     67  *  <li>{@link #TRIM_MEMORY_MODERATE} <br>The system is running low on memory and your process is
     68  * near the middle of the LRU list. If the system becomes further constrained for memory, there's a
     69  * chance your process will be killed.
     70  *  <li>{@link #TRIM_MEMORY_COMPLETE} <br>The system is running low on memory and your process is
     71  * one of the first to be killed if the system does not recover memory now. You should release
     72  * absolutely everything that's not critical to resuming your app state.
     73  *   <p>To support API levels lower than 14, you can use the {@link #onLowMemory} method as a
     74  * fallback that's roughly equivalent to the {@link ComponentCallbacks2#TRIM_MEMORY_COMPLETE} level.
     75  *  </li>
     76  *  </ol>
     77  * <p class="note"><strong>Note:</strong> When the system begins
     78  * killing processes in the LRU list, although it primarily works bottom-up, it does give some
     79  * consideration to which processes are consuming more memory and will thus provide more gains in
     80  * memory if killed. So the less memory you consume while in the LRU list overall, the better
     81  * your chances are to remain in the list and be able to quickly resume.</p>
     82  * </li>
     83  * </ul>
     84  * <p>More information about the different stages of a process lifecycle (such as what it means
     85  * to be placed in the background LRU list) is provided in the <a
     86  * href="{@docRoot}guide/components/processes-and-threads.html#Lifecycle">Processes and Threads</a>
     87  * document.
     88  */
     89 public interface ComponentCallbacks2 extends ComponentCallbacks {
     90 
     91     /** @hide */
     92     @IntDef(prefix = { "TRIM_MEMORY_" }, value = {
     93             TRIM_MEMORY_COMPLETE,
     94             TRIM_MEMORY_MODERATE,
     95             TRIM_MEMORY_BACKGROUND,
     96             TRIM_MEMORY_UI_HIDDEN,
     97             TRIM_MEMORY_RUNNING_CRITICAL,
     98             TRIM_MEMORY_RUNNING_LOW,
     99             TRIM_MEMORY_RUNNING_MODERATE,
    100     })
    101     @Retention(RetentionPolicy.SOURCE)
    102     public @interface TrimMemoryLevel {}
    103 
    104     /**
    105      * Level for {@link #onTrimMemory(int)}: the process is nearing the end
    106      * of the background LRU list, and if more memory isn't found soon it will
    107      * be killed.
    108      */
    109     static final int TRIM_MEMORY_COMPLETE = 80;
    110 
    111     /**
    112      * Level for {@link #onTrimMemory(int)}: the process is around the middle
    113      * of the background LRU list; freeing memory can help the system keep
    114      * other processes running later in the list for better overall performance.
    115      */
    116     static final int TRIM_MEMORY_MODERATE = 60;
    117 
    118     /**
    119      * Level for {@link #onTrimMemory(int)}: the process has gone on to the
    120      * LRU list.  This is a good opportunity to clean up resources that can
    121      * efficiently and quickly be re-built if the user returns to the app.
    122      */
    123     static final int TRIM_MEMORY_BACKGROUND = 40;
    124 
    125     /**
    126      * Level for {@link #onTrimMemory(int)}: the process had been showing
    127      * a user interface, and is no longer doing so.  Large allocations with
    128      * the UI should be released at this point to allow memory to be better
    129      * managed.
    130      */
    131     static final int TRIM_MEMORY_UI_HIDDEN = 20;
    132 
    133     /**
    134      * Level for {@link #onTrimMemory(int)}: the process is not an expendable
    135      * background process, but the device is running extremely low on memory
    136      * and is about to not be able to keep any background processes running.
    137      * Your running process should free up as many non-critical resources as it
    138      * can to allow that memory to be used elsewhere.  The next thing that
    139      * will happen after this is {@link #onLowMemory()} called to report that
    140      * nothing at all can be kept in the background, a situation that can start
    141      * to notably impact the user.
    142      */
    143     static final int TRIM_MEMORY_RUNNING_CRITICAL = 15;
    144 
    145     /**
    146      * Level for {@link #onTrimMemory(int)}: the process is not an expendable
    147      * background process, but the device is running low on memory.
    148      * Your running process should free up unneeded resources to allow that
    149      * memory to be used elsewhere.
    150      */
    151     static final int TRIM_MEMORY_RUNNING_LOW = 10;
    152 
    153     /**
    154      * Level for {@link #onTrimMemory(int)}: the process is not an expendable
    155      * background process, but the device is running moderately low on memory.
    156      * Your running process may want to release some unneeded resources for
    157      * use elsewhere.
    158      */
    159     static final int TRIM_MEMORY_RUNNING_MODERATE = 5;
    160 
    161     /**
    162      * Called when the operating system has determined that it is a good
    163      * time for a process to trim unneeded memory from its process.  This will
    164      * happen for example when it goes in the background and there is not enough
    165      * memory to keep as many background processes running as desired.  You
    166      * should never compare to exact values of the level, since new intermediate
    167      * values may be added -- you will typically want to compare if the value
    168      * is greater or equal to a level you are interested in.
    169      *
    170      * <p>To retrieve the processes current trim level at any point, you can
    171      * use {@link android.app.ActivityManager#getMyMemoryState
    172      * ActivityManager.getMyMemoryState(RunningAppProcessInfo)}.
    173      *
    174      * @param level The context of the trim, giving a hint of the amount of
    175      * trimming the application may like to perform.
    176      */
    177     void onTrimMemory(@TrimMemoryLevel int level);
    178 }
    179