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.os; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 191ebccf531d1049853b3b0630035434619682c016Dianne Hackbornimport android.util.TimeUtils; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Defines a message containing a description and arbitrary data object that can be 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sent to a {@link Handler}. This object contains two extra int fields and an 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * extra object field that allow you to not do allocations in many cases. 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p class="note">While the constructor of Message is public, the best way to get 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * one of these is to call {@link #obtain Message.obtain()} or one of the 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Handler#obtainMessage Handler.obtainMessage()} methods, which will pull 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * them from a pool of recycled objects.</p> 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class Message implements Parcelable { 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * User-defined message code so that the recipient can identify 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * what this message is about. Each {@link Handler} has its own name-space 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for message codes, so you do not need to worry about yours conflicting 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with other handlers. 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int what; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4175288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn /** 4275288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * arg1 and arg2 are lower-cost alternatives to using 4375288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * {@link #setData(Bundle) setData()} if you only need to store a 4475288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * few integer values. 4575288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn */ 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int arg1; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4875288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn /** 4975288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * arg1 and arg2 are lower-cost alternatives to using 5075288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * {@link #setData(Bundle) setData()} if you only need to store a 5175288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * few integer values. 5275288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn */ 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int arg2; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5575288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn /** 5675288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * An arbitrary object to send to the recipient. When using 5775288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * {@link Messenger} to send the message across processes this can only 5875288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * be non-null if it contains a Parcelable of a framework class (not one 5975288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * implemented by the application). For other data transfer use 6075288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * {@link #setData}. 6175288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * 6275288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * <p>Note that Parcelable objects here are not supported prior to 6375288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * the {@link android.os.Build.VERSION_CODES#FROYO} release. 6475288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn */ 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Object obj; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6775288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn /** 6875288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * Optional Messenger where replies to this message can be sent. The 6975288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * semantics of exactly how this is used are up to the sender and 7075288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * receiver. 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Messenger replyTo; 73a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville 74cb3ed1dc287ddb9beb7c9186713426f5fba263c3Dianne Hackborn /** 75cb3ed1dc287ddb9beb7c9186713426f5fba263c3Dianne Hackborn * Optional field indicating the uid that sent the message. This is 76cb3ed1dc287ddb9beb7c9186713426f5fba263c3Dianne Hackborn * only valid for messages posted by a {@link Messenger}; otherwise, 77cb3ed1dc287ddb9beb7c9186713426f5fba263c3Dianne Hackborn * it will be -1. 78cb3ed1dc287ddb9beb7c9186713426f5fba263c3Dianne Hackborn */ 79cb3ed1dc287ddb9beb7c9186713426f5fba263c3Dianne Hackborn public int sendingUid = -1; 80cb3ed1dc287ddb9beb7c9186713426f5fba263c3Dianne Hackborn 819867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown /** If set message is in use. 829867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown * This flag is set when the message is enqueued and remains set while it 839867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown * is delivered and afterwards when it is recycled. The flag is only cleared 849867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown * when a new message is created or obtained since that is the only time that 859867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown * applications are allowed to modify the contents of the message. 869867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown * 879867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown * It is an error to attempt to enqueue or recycle a message that is already in use. 889867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown */ 89e799cb78b4be61d3882e71c6812fa62c9a83fd5dJeff Brown /*package*/ static final int FLAG_IN_USE = 1 << 0; 90a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville 91e799cb78b4be61d3882e71c6812fa62c9a83fd5dJeff Brown /** If set message is asynchronous */ 92e799cb78b4be61d3882e71c6812fa62c9a83fd5dJeff Brown /*package*/ static final int FLAG_ASYNCHRONOUS = 1 << 1; 93a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville 94a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville /** Flags to clear in the copyFrom method */ 95e799cb78b4be61d3882e71c6812fa62c9a83fd5dJeff Brown /*package*/ static final int FLAGS_TO_CLEAR_ON_COPY_FROM = FLAG_IN_USE; 96a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville 97a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville /*package*/ int flags; 98a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ long when; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ Bundle data; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown /*package*/ Handler target; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1059867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown /*package*/ Runnable callback; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // sometimes we store linked lists of these things 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ Message next; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1102405c278ef51ac527bca6d76a0b9d4804f9aab17Brad Fitzpatrick private static final Object sPoolSync = new Object(); 1112405c278ef51ac527bca6d76a0b9d4804f9aab17Brad Fitzpatrick private static Message sPool; 1122405c278ef51ac527bca6d76a0b9d4804f9aab17Brad Fitzpatrick private static int sPoolSize = 0; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 114a2ad65692481510496e367b593facf778f49249bRomain Guy private static final int MAX_POOL_SIZE = 50; 115a2ad65692481510496e367b593facf778f49249bRomain Guy 1167895bc2e6309427937ab060031bfee5c99879d59Dianne Hackborn private static boolean gCheckRecycle = true; 1177895bc2e6309427937ab060031bfee5c99879d59Dianne Hackborn 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a new Message instance from the global pool. Allows us to 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * avoid allocating new objects in many cases. 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Message obtain() { 1232405c278ef51ac527bca6d76a0b9d4804f9aab17Brad Fitzpatrick synchronized (sPoolSync) { 1242405c278ef51ac527bca6d76a0b9d4804f9aab17Brad Fitzpatrick if (sPool != null) { 1252405c278ef51ac527bca6d76a0b9d4804f9aab17Brad Fitzpatrick Message m = sPool; 1262405c278ef51ac527bca6d76a0b9d4804f9aab17Brad Fitzpatrick sPool = m.next; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m.next = null; 1289867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown m.flags = 0; // clear in-use flag 1292405c278ef51ac527bca6d76a0b9d4804f9aab17Brad Fitzpatrick sPoolSize--; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return m; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Message(); 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Same as {@link #obtain()}, but copies the values of an existing 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * message (including its target) into the new one. 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param orig Original message to copy. 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A Message object from the global pool. 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Message obtain(Message orig) { 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message m = obtain(); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m.what = orig.what; 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m.arg1 = orig.arg1; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m.arg2 = orig.arg2; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m.obj = orig.obj; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m.replyTo = orig.replyTo; 149cb3ed1dc287ddb9beb7c9186713426f5fba263c3Dianne Hackborn m.sendingUid = orig.sendingUid; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (orig.data != null) { 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m.data = new Bundle(orig.data); 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m.target = orig.target; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m.callback = orig.callback; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return m; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Same as {@link #obtain()}, but sets the value for the <em>target</em> member on the Message returned. 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param h Handler to assign to the returned Message object's <em>target</em> member. 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A Message object from the global pool. 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Message obtain(Handler h) { 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message m = obtain(); 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m.target = h; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return m; 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Same as {@link #obtain(Handler)}, but assigns a callback Runnable on 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the Message that is returned. 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param h Handler to assign to the returned Message object's <em>target</em> member. 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param callback Runnable that will execute when the message is handled. 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A Message object from the global pool. 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Message obtain(Handler h, Runnable callback) { 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message m = obtain(); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m.target = h; 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m.callback = callback; 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return m; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Same as {@link #obtain()}, but sets the values for both <em>target</em> and 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <em>what</em> members on the Message. 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param h Value to assign to the <em>target</em> member. 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param what Value to assign to the <em>what</em> member. 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A Message object from the global pool. 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Message obtain(Handler h, int what) { 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message m = obtain(); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m.target = h; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m.what = what; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return m; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Same as {@link #obtain()}, but sets the values of the <em>target</em>, <em>what</em>, and <em>obj</em> 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * members. 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param h The <em>target</em> value to set. 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param what The <em>what</em> value to set. 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param obj The <em>object</em> method to set. 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A Message object from the global pool. 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Message obtain(Handler h, int what, Object obj) { 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message m = obtain(); 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m.target = h; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m.what = what; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m.obj = obj; 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return m; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Same as {@link #obtain()}, but sets the values of the <em>target</em>, <em>what</em>, 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <em>arg1</em>, and <em>arg2</em> members. 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param h The <em>target</em> value to set. 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param what The <em>what</em> value to set. 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param arg1 The <em>arg1</em> value to set. 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param arg2 The <em>arg2</em> value to set. 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A Message object from the global pool. 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Message obtain(Handler h, int what, int arg1, int arg2) { 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message m = obtain(); 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m.target = h; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m.what = what; 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m.arg1 = arg1; 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m.arg2 = arg2; 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return m; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Same as {@link #obtain()}, but sets the values of the <em>target</em>, <em>what</em>, 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <em>arg1</em>, <em>arg2</em>, and <em>obj</em> members. 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param h The <em>target</em> value to set. 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param what The <em>what</em> value to set. 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param arg1 The <em>arg1</em> value to set. 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param arg2 The <em>arg2</em> value to set. 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param obj The <em>obj</em> value to set. 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A Message object from the global pool. 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Message obtain(Handler h, int what, 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int arg1, int arg2, Object obj) { 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message m = obtain(); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m.target = h; 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m.what = what; 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m.arg1 = arg1; 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m.arg2 = arg2; 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m.obj = obj; 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return m; 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2617895bc2e6309427937ab060031bfee5c99879d59Dianne Hackborn /** @hide */ 2627895bc2e6309427937ab060031bfee5c99879d59Dianne Hackborn public static void updateCheckRecycle(int targetSdkVersion) { 263955d8d69ea6caabce1461dc25b339b9bf9dc61a6Dianne Hackborn if (targetSdkVersion < Build.VERSION_CODES.LOLLIPOP) { 2647895bc2e6309427937ab060031bfee5c99879d59Dianne Hackborn gCheckRecycle = false; 2657895bc2e6309427937ab060031bfee5c99879d59Dianne Hackborn } 2667895bc2e6309427937ab060031bfee5c99879d59Dianne Hackborn } 2677895bc2e6309427937ab060031bfee5c99879d59Dianne Hackborn 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2699867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown * Return a Message instance to the global pool. 2709867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown * <p> 2719867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown * You MUST NOT touch the Message after calling this function because it has 2729867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown * effectively been freed. It is an error to recycle a message that is currently 2739867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown * enqueued or that is in the process of being delivered to a Handler. 2749867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown * </p> 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void recycle() { 2779867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown if (isInUse()) { 2787895bc2e6309427937ab060031bfee5c99879d59Dianne Hackborn if (gCheckRecycle) { 2797895bc2e6309427937ab060031bfee5c99879d59Dianne Hackborn throw new IllegalStateException("This message cannot be recycled because it " 2807895bc2e6309427937ab060031bfee5c99879d59Dianne Hackborn + "is still in use."); 2817895bc2e6309427937ab060031bfee5c99879d59Dianne Hackborn } 2827895bc2e6309427937ab060031bfee5c99879d59Dianne Hackborn return; 2839867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown } 2849867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown recycleUnchecked(); 2859867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown } 2869867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown 2879867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown /** 2889867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown * Recycles a Message that may be in-use. 2899867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown * Used internally by the MessageQueue and Looper when disposing of queued Messages. 2909867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown */ 2919867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown void recycleUnchecked() { 2929867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown // Mark the message as in use while it remains in the recycled object pool. 2939867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown // Clear out all other details. 2949867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown flags = FLAG_IN_USE; 2959867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown what = 0; 2969867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown arg1 = 0; 2979867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown arg2 = 0; 2989867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown obj = null; 2999867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown replyTo = null; 300cb3ed1dc287ddb9beb7c9186713426f5fba263c3Dianne Hackborn sendingUid = -1; 3019867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown when = 0; 3029867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown target = null; 3039867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown callback = null; 3049867ed7aa98f5a719db4b50c39a290bc0ef38123Jeff Brown data = null; 305fc9ff4c834c5b3a3c4b024b89375d6c329092791Jeff Brown 3062405c278ef51ac527bca6d76a0b9d4804f9aab17Brad Fitzpatrick synchronized (sPoolSync) { 3072405c278ef51ac527bca6d76a0b9d4804f9aab17Brad Fitzpatrick if (sPoolSize < MAX_POOL_SIZE) { 3082405c278ef51ac527bca6d76a0b9d4804f9aab17Brad Fitzpatrick next = sPool; 3092405c278ef51ac527bca6d76a0b9d4804f9aab17Brad Fitzpatrick sPool = this; 3102405c278ef51ac527bca6d76a0b9d4804f9aab17Brad Fitzpatrick sPoolSize++; 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Make this message like o. Performs a shallow copy of the data field. 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Does not copy the linked list fields, nor the timestamp or 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * target/callback of the original message. 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void copyFrom(Message o) { 321a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville this.flags = o.flags & ~FLAGS_TO_CLEAR_ON_COPY_FROM; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.what = o.what; 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.arg1 = o.arg1; 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.arg2 = o.arg2; 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.obj = o.obj; 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.replyTo = o.replyTo; 327cb3ed1dc287ddb9beb7c9186713426f5fba263c3Dianne Hackborn this.sendingUid = o.sendingUid; 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (o.data != null) { 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.data = (Bundle) o.data.clone(); 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.data = null; 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the targeted delivery time of this message, in milliseconds. 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getWhen() { 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return when; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setTarget(Handler target) { 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.target = target; 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the a {@link android.os.Handler Handler} implementation that 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will receive this message. The object must implement 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.os.Handler#handleMessage(android.os.Message) 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Handler.handleMessage()}. Each Handler has its own name-space for 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * message codes, so you do not need to 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * worry about yours conflicting with other handlers. 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Handler getTarget() { 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return target; 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve callback object that will execute when this message is handled. 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This object must implement Runnable. This is called by 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the <em>target</em> {@link Handler} that is receiving this Message to 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dispatch it. If 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not set, the message will be dispatched to the receiving Handler's 36575288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * {@link Handler#handleMessage(Message Handler.handleMessage())}. 36675288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn */ 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Runnable getCallback() { 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return callback; 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Obtains a Bundle of arbitrary data associated with this 37375288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * event, lazily creating it if necessary. Set this value by calling 37475288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * {@link #setData(Bundle)}. Note that when transferring data across 37575288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * processes via {@link Messenger}, you will need to set your ClassLoader 37675288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * on the Bundle via {@link Bundle#setClassLoader(ClassLoader) 37775288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * Bundle.setClassLoader()} so that it can instantiate your objects when 37875288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * you retrieve them. 37975288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * @see #peekData() 38075288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * @see #setData(Bundle) 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Bundle getData() { 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (data == null) { 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = new Bundle(); 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Like getData(), but does not lazily create the Bundle. A null 39275288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * is returned if the Bundle does not already exist. See 39375288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * {@link #getData} for further information on this. 39475288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * @see #getData() 39575288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * @see #setData(Bundle) 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Bundle peekData() { 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40175288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn /** 402d0eb55360fb94faa632cf65f246260827dc4a177Denver Coneybeare * Sets a Bundle of arbitrary data values. Use arg1 and arg2 members 40375288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * as a lower cost way to send a few simple integer values, if you can. 40475288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * @see #getData() 40575288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn * @see #peekData() 40675288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn */ 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setData(Bundle data) { 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.data = data; 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sends this Message to the Handler specified by {@link #getTarget}. 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Throws a null pointer exception if this field has not been set. 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendToTarget() { 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project target.sendMessage(this); 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 419e799cb78b4be61d3882e71c6812fa62c9a83fd5dJeff Brown /** 4209840c07667bb0363c93fb8459e6c08f7e30d5df1Jeff Brown * Returns true if the message is asynchronous, meaning that it is not 4219840c07667bb0363c93fb8459e6c08f7e30d5df1Jeff Brown * subject to {@link Looper} synchronization barriers. 422e799cb78b4be61d3882e71c6812fa62c9a83fd5dJeff Brown * 423e799cb78b4be61d3882e71c6812fa62c9a83fd5dJeff Brown * @return True if the message is asynchronous. 424e799cb78b4be61d3882e71c6812fa62c9a83fd5dJeff Brown * 425e799cb78b4be61d3882e71c6812fa62c9a83fd5dJeff Brown * @see #setAsynchronous(boolean) 426e799cb78b4be61d3882e71c6812fa62c9a83fd5dJeff Brown */ 427e799cb78b4be61d3882e71c6812fa62c9a83fd5dJeff Brown public boolean isAsynchronous() { 428e799cb78b4be61d3882e71c6812fa62c9a83fd5dJeff Brown return (flags & FLAG_ASYNCHRONOUS) != 0; 429e799cb78b4be61d3882e71c6812fa62c9a83fd5dJeff Brown } 430e799cb78b4be61d3882e71c6812fa62c9a83fd5dJeff Brown 431e799cb78b4be61d3882e71c6812fa62c9a83fd5dJeff Brown /** 4329840c07667bb0363c93fb8459e6c08f7e30d5df1Jeff Brown * Sets whether the message is asynchronous, meaning that it is not 4339840c07667bb0363c93fb8459e6c08f7e30d5df1Jeff Brown * subject to {@link Looper} synchronization barriers. 4349840c07667bb0363c93fb8459e6c08f7e30d5df1Jeff Brown * <p> 4359840c07667bb0363c93fb8459e6c08f7e30d5df1Jeff Brown * Certain operations, such as view invalidation, may introduce synchronization 4369840c07667bb0363c93fb8459e6c08f7e30d5df1Jeff Brown * barriers into the {@link Looper}'s message queue to prevent subsequent messages 4379840c07667bb0363c93fb8459e6c08f7e30d5df1Jeff Brown * from being delivered until some condition is met. In the case of view invalidation, 4389840c07667bb0363c93fb8459e6c08f7e30d5df1Jeff Brown * messages which are posted after a call to {@link android.view.View#invalidate} 4399840c07667bb0363c93fb8459e6c08f7e30d5df1Jeff Brown * are suspended by means of a synchronization barrier until the next frame is 4409840c07667bb0363c93fb8459e6c08f7e30d5df1Jeff Brown * ready to be drawn. The synchronization barrier ensures that the invalidation 4419840c07667bb0363c93fb8459e6c08f7e30d5df1Jeff Brown * request is completely handled before resuming. 4429840c07667bb0363c93fb8459e6c08f7e30d5df1Jeff Brown * </p><p> 4439840c07667bb0363c93fb8459e6c08f7e30d5df1Jeff Brown * Asynchronous messages are exempt from synchronization barriers. They typically 4449840c07667bb0363c93fb8459e6c08f7e30d5df1Jeff Brown * represent interrupts, input events, and other signals that must be handled independently 4459840c07667bb0363c93fb8459e6c08f7e30d5df1Jeff Brown * even while other work has been suspended. 4469840c07667bb0363c93fb8459e6c08f7e30d5df1Jeff Brown * </p><p> 4479840c07667bb0363c93fb8459e6c08f7e30d5df1Jeff Brown * Note that asynchronous messages may be delivered out of order with respect to 4489840c07667bb0363c93fb8459e6c08f7e30d5df1Jeff Brown * synchronous messages although they are always delivered in order among themselves. 4499840c07667bb0363c93fb8459e6c08f7e30d5df1Jeff Brown * If the relative order of these messages matters then they probably should not be 4509840c07667bb0363c93fb8459e6c08f7e30d5df1Jeff Brown * asynchronous in the first place. Use with caution. 4519840c07667bb0363c93fb8459e6c08f7e30d5df1Jeff Brown * </p> 452e799cb78b4be61d3882e71c6812fa62c9a83fd5dJeff Brown * 453e799cb78b4be61d3882e71c6812fa62c9a83fd5dJeff Brown * @param async True if the message is asynchronous. 454e799cb78b4be61d3882e71c6812fa62c9a83fd5dJeff Brown * 455e799cb78b4be61d3882e71c6812fa62c9a83fd5dJeff Brown * @see #isAsynchronous() 456e799cb78b4be61d3882e71c6812fa62c9a83fd5dJeff Brown */ 457e799cb78b4be61d3882e71c6812fa62c9a83fd5dJeff Brown public void setAsynchronous(boolean async) { 458e799cb78b4be61d3882e71c6812fa62c9a83fd5dJeff Brown if (async) { 459e799cb78b4be61d3882e71c6812fa62c9a83fd5dJeff Brown flags |= FLAG_ASYNCHRONOUS; 460e799cb78b4be61d3882e71c6812fa62c9a83fd5dJeff Brown } else { 461e799cb78b4be61d3882e71c6812fa62c9a83fd5dJeff Brown flags &= ~FLAG_ASYNCHRONOUS; 462e799cb78b4be61d3882e71c6812fa62c9a83fd5dJeff Brown } 463e799cb78b4be61d3882e71c6812fa62c9a83fd5dJeff Brown } 464e799cb78b4be61d3882e71c6812fa62c9a83fd5dJeff Brown 465a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville /*package*/ boolean isInUse() { 466a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville return ((flags & FLAG_IN_USE) == FLAG_IN_USE); 467a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville } 468a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville 469a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville /*package*/ void markInUse() { 470a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville flags |= FLAG_IN_USE; 471a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville } 472a334e7c72408c4e2805f2427a35d841a60adefc4Wink Saville 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Constructor (but the preferred way to get a Message is to call {@link #obtain() Message.obtain()}). 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Message() { 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4785182c780a8b42acd46a06d693ab63a0dd78c6d70Jeff Brown @Override 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 4801ebccf531d1049853b3b0630035434619682c016Dianne Hackborn return toString(SystemClock.uptimeMillis()); 4811ebccf531d1049853b3b0630035434619682c016Dianne Hackborn } 4821ebccf531d1049853b3b0630035434619682c016Dianne Hackborn 4831ebccf531d1049853b3b0630035434619682c016Dianne Hackborn String toString(long now) { 4845182c780a8b42acd46a06d693ab63a0dd78c6d70Jeff Brown StringBuilder b = new StringBuilder(); 4855182c780a8b42acd46a06d693ab63a0dd78c6d70Jeff Brown b.append("{ when="); 4865182c780a8b42acd46a06d693ab63a0dd78c6d70Jeff Brown TimeUtils.formatDuration(when - now, b); 4875182c780a8b42acd46a06d693ab63a0dd78c6d70Jeff Brown 4885182c780a8b42acd46a06d693ab63a0dd78c6d70Jeff Brown if (target != null) { 4895182c780a8b42acd46a06d693ab63a0dd78c6d70Jeff Brown if (callback != null) { 4905182c780a8b42acd46a06d693ab63a0dd78c6d70Jeff Brown b.append(" callback="); 4915182c780a8b42acd46a06d693ab63a0dd78c6d70Jeff Brown b.append(callback.getClass().getName()); 4925182c780a8b42acd46a06d693ab63a0dd78c6d70Jeff Brown } else { 4935182c780a8b42acd46a06d693ab63a0dd78c6d70Jeff Brown b.append(" what="); 4945182c780a8b42acd46a06d693ab63a0dd78c6d70Jeff Brown b.append(what); 4955182c780a8b42acd46a06d693ab63a0dd78c6d70Jeff Brown } 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4975182c780a8b42acd46a06d693ab63a0dd78c6d70Jeff Brown if (arg1 != 0) { 4985182c780a8b42acd46a06d693ab63a0dd78c6d70Jeff Brown b.append(" arg1="); 4995182c780a8b42acd46a06d693ab63a0dd78c6d70Jeff Brown b.append(arg1); 5005182c780a8b42acd46a06d693ab63a0dd78c6d70Jeff Brown } 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5025182c780a8b42acd46a06d693ab63a0dd78c6d70Jeff Brown if (arg2 != 0) { 5035182c780a8b42acd46a06d693ab63a0dd78c6d70Jeff Brown b.append(" arg2="); 5045182c780a8b42acd46a06d693ab63a0dd78c6d70Jeff Brown b.append(arg2); 5055182c780a8b42acd46a06d693ab63a0dd78c6d70Jeff Brown } 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5075182c780a8b42acd46a06d693ab63a0dd78c6d70Jeff Brown if (obj != null) { 5085182c780a8b42acd46a06d693ab63a0dd78c6d70Jeff Brown b.append(" obj="); 5095182c780a8b42acd46a06d693ab63a0dd78c6d70Jeff Brown b.append(obj); 5105182c780a8b42acd46a06d693ab63a0dd78c6d70Jeff Brown } 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5125182c780a8b42acd46a06d693ab63a0dd78c6d70Jeff Brown b.append(" target="); 5135182c780a8b42acd46a06d693ab63a0dd78c6d70Jeff Brown b.append(target.getClass().getName()); 5145182c780a8b42acd46a06d693ab63a0dd78c6d70Jeff Brown } else { 5155182c780a8b42acd46a06d693ab63a0dd78c6d70Jeff Brown b.append(" barrier="); 5165182c780a8b42acd46a06d693ab63a0dd78c6d70Jeff Brown b.append(arg1); 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b.append(" }"); 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return b.toString(); 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Parcelable.Creator<Message> CREATOR 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new Parcelable.Creator<Message>() { 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Message createFromParcel(Parcel source) { 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message msg = Message.obtain(); 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project msg.readFromParcel(source); 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return msg; 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Message[] newArray(int size) { 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Message[size]; 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int flags) { 54175288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn if (callback != null) { 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException( 54375288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn "Can't marshal callbacks across processes."); 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(what); 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(arg1); 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(arg2); 54875288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn if (obj != null) { 54975288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn try { 55075288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn Parcelable p = (Parcelable)obj; 55175288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn dest.writeInt(1); 55275288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn dest.writeParcelable(p, flags); 55375288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn } catch (ClassCastException e) { 55475288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn throw new RuntimeException( 55575288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn "Can't marshal non-Parcelable objects across processes."); 55675288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn } 55775288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn } else { 55875288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn dest.writeInt(0); 55975288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn } 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeLong(when); 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeBundle(data); 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Messenger.writeMessengerOrNullToParcel(replyTo, dest); 563cb3ed1dc287ddb9beb7c9186713426f5fba263c3Dianne Hackborn dest.writeInt(sendingUid); 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5668f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy private void readFromParcel(Parcel source) { 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project what = source.readInt(); 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg1 = source.readInt(); 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arg2 = source.readInt(); 57075288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn if (source.readInt() != 0) { 57175288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn obj = source.readParcelable(getClass().getClassLoader()); 57275288fa1a4ee4886959af7243995d8afd9c3c905Dianne Hackborn } 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project when = source.readLong(); 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = source.readBundle(); 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project replyTo = Messenger.readMessengerOrNullFromParcel(source); 576cb3ed1dc287ddb9beb7c9186713426f5fba263c3Dianne Hackborn sendingUid = source.readInt(); 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 579