BroadcastReceiver.java revision 9066cfe9886ac131c34d59ed0e2d287b0e3c0087
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.content; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.ActivityManagerNative; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.IActivityManager; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Base class for code that will receive intents sent by sendBroadcast(). 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You can either dynamically register an instance of this class with 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Context#registerReceiver Context.registerReceiver()} 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or statically publish an implementation through the 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.styleable#AndroidManifestReceiver <receiver>} 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tag in your <code>AndroidManifest.xml</code>. <em><strong>Note:</strong></em> 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If registering a receiver in your 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onResume() Activity.onResume()} 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * implementation, you should unregister it in 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onPause() Activity.onPause()}. 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (You won't receive intents when paused, 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and this will cut down on unnecessary system overhead). Do not unregister in 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#onSaveInstanceState(android.os.Bundle) Activity.onSaveInstanceState()}, 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * because this won't be called if the user moves back in the history 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * stack. 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>There are two major classes of broadcasts that can be received:</p> 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <b>Normal broadcasts</b> (sent with {@link Context#sendBroadcast(Intent) 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.sendBroadcast}) are completely asynchronous. All receivers of the 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * broadcast are run, in an undefined order, often at the same time. This is 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * more efficient, but means that receivers can not use the result or abort 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * APIs included here. 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <b>Ordered broadcasts</b> (sent with {@link Context#sendOrderedBroadcast(Intent, String) 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.sendOrderedBroadcast}) are delivered to one receiver at a time. 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * As each receiver executes in turn, it can propagate a result to the next 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * receiver, or it can completely abort the broadcast so that it won't be passed 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to other receivers. The order receivers runs in can be controlled with the 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.styleable#AndroidManifestIntentFilter_priority 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:priority} attribute of the matching intent-filter; receivers with 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the same priority will be run in an arbitrary order. 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Even in the case of normal broadcasts, the system may in some 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * situations revert to delivering the broadcast one receiver at a time. In 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * particular, for receivers that may require the creation of a process, only 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * one will be run at a time to avoid overloading the system with new processes. 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * In this situation, however, the non-ordered semantics hold: these receivers 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can not return results or abort their broadcast.</p> 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Note that, although the Intent class is used for sending and receiving 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * these broadcasts, the Intent broadcast mechanism here is completely separate 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from Intents that are used to start Activities with 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Context#startActivity Context.startActivity()}. 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * There is no way for an BroadcastReceiver 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to see or capture Intents used with startActivity(); likewise, when 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you broadcast an Intent, you will never find or start an Activity. 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * These two operations are semantically very different: starting an 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Activity with an Intent is a foreground operation that modifies what the 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * user is currently interacting with; broadcasting an Intent is a background 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * operation that the user is not normally aware of. 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The BroadcastReceiver class (when launched as a component through 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a manifest's {@link android.R.styleable#AndroidManifestReceiver <receiver>} 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tag) is an important part of an 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="{@docRoot}guide/topics/fundamentals.html#lcycles">application's overall lifecycle</a>.</p> 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Topics covered here: 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ol> 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#ReceiverLifecycle">Receiver Lifecycle</a> 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#Permissions">Permissions</a> 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><a href="#ProcessLifecycle">Process Lifecycle</a> 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ol> 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="ReceiverLifecycle"></a> 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Receiver Lifecycle</h3> 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>A BroadcastReceiver object is only valid for the duration of the call 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to {@link #onReceive}. Once your code returns from this function, 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the system considers the object to be finished and no longer active. 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This has important repercussions to what you can do in an 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onReceive} implementation: anything that requires asynchronous 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * operation is not available, because you will need to return from the 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * function to handle the asynchronous operation, but at that point the 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * BroadcastReceiver is no longer active and thus the system is free to kill 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * its process before the asynchronous operation completes. 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In particular, you may <i>not</i> show a dialog or bind to a service from 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * within an BroadcastReceiver. For the former, you should instead use the 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.NotificationManager} API. For the latter, you can 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * use {@link android.content.Context#startService Context.startService()} to 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * send a command to the service. 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="Permissions"></a> 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Permissions</h3> 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Access permissions can be enforced by either the sender or receiver 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of an Intent. 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>To enforce a permission when sending, you supply a non-null 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <var>permission</var> argument to 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Context#sendBroadcast(Intent, String)} or 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Context#sendOrderedBroadcast(Intent, String, BroadcastReceiver, android.os.Handler, int, String, Bundle)}. 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Only receivers who have been granted this permission 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (by requesting it with the 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.styleable#AndroidManifestUsesPermission <uses-permission>} 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tag in their <code>AndroidManifest.xml</code>) will be able to receive 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the broadcast. 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>To enforce a permission when receiving, you supply a non-null 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <var>permission</var> when registering your receiver -- either when calling 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Context#registerReceiver(BroadcastReceiver, IntentFilter, String, android.os.Handler)} 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or in the static 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.styleable#AndroidManifestReceiver <receiver>} 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tag in your <code>AndroidManifest.xml</code>. Only broadcasters who have 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * been granted this permission (by requesting it with the 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.styleable#AndroidManifestUsesPermission <uses-permission>} 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tag in their <code>AndroidManifest.xml</code>) will be able to send an 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Intent to the receiver. 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>See the <a href="{@docRoot}guide/topics/security/security.html">Security and Permissions</a> 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * document for more information on permissions and security in general. 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="ProcessLifecycle"></a> 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Process Lifecycle</h3> 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>A process that is currently executing an BroadcastReceiver (that is, 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * currently running the code in its {@link #onReceive} method) is 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * considered to be a foreground process and will be kept running by the 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * system except under cases of extreme memory pressure. 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Once you return from onReceive(), the BroadcastReceiver is no longer 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * active, and its hosting process is only as important as any other application 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * components that are running in it. This is especially important because if 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that process was only hosting the BroadcastReceiver (a common case for 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * applications that the user has never or not recently interacted with), then 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * upon returning from onReceive() the system will consider its process 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to be empty and aggressively kill it so that resources are available for other 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * more important processes. 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This means that for longer-running operations you will often use 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a {@link android.app.Service} in conjunction with an BroadcastReceiver to keep 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the containing process active for the entire time of your operation. 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class BroadcastReceiver { 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BroadcastReceiver() { 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This method is called when the BroadcastReceiver is receiving an Intent 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * broadcast. During this time you can use the other methods on 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * BroadcastReceiver to view/modify the current result values. The function 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is normally called from the main thread of its process, so you should 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * never perform long-running operations in it (there is a timeout of 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10 seconds that the system allows before considering the receiver to 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be blocked and a candidate to be killed). You cannot launch a popup dialog 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in your implementation of onReceive(). 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>If this BroadcastReceiver was launched through a <receiver> tag, 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * then the object is no longer alive after returning from this 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * function.</b> This means you should not perform any operations that 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return a result to you asynchronously -- in particular, for interacting 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with services, you should use 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Context#startService(Intent)} instead of 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Context#bindService(Intent, ServiceConnection, int)}. If you wish 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to interact with a service that is already running, you can use 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #peekService}. 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The Context in which the receiver is running. 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param intent The Intent being received. 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract void onReceive(Context context, Intent intent); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Provide a binder to an already-running service. This method is synchronous 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and will not start the target service if it is not present, so it is safe 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to call from {@link #onReceive}. 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param myContext The Context that had been passed to {@link #onReceive(Context, Intent)} 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param service The Intent indicating the service you wish to use. See {@link 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context#startService(Intent)} for more information. 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public IBinder peekService(Context myContext, Intent service) { 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IActivityManager am = ActivityManagerNative.getDefault(); 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder binder = null; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project binder = am.peekService(service, service.resolveTypeIfNeeded( 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project myContext.getContentResolver())); 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return binder; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Change the current result code of this broadcast; only works with 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * broadcasts sent through 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Context#sendOrderedBroadcast(Intent, String) 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.sendOrderedBroadcast}. Often uses the 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Activity {@link android.app.Activity#RESULT_CANCELED} and 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#RESULT_OK} constants, though the 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * actual meaning of this value is ultimately up to the broadcaster. 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><strong>This method does not work with non-ordered broadcasts such 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those sent with {@link Context#sendBroadcast(Intent) 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.sendBroadcast}</strong></p> 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param code The new result code. 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setResult(int, String, Bundle) 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void setResultCode(int code) { 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkSynchronousHint(); 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResultCode = code; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the current result code, as set by the previous receiver. 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return int The current result code. 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int getResultCode() { 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mResultCode; 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Change the current result data of this broadcast; only works with 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * broadcasts sent through 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Context#sendOrderedBroadcast(Intent, String) 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.sendOrderedBroadcast}. This is an arbitrary 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * string whose interpretation is up to the broadcaster. 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><strong>This method does not work with non-ordered broadcasts such 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those sent with {@link Context#sendBroadcast(Intent) 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.sendBroadcast}</strong></p> 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param data The new result data; may be null. 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setResult(int, String, Bundle) 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void setResultData(String data) { 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkSynchronousHint(); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResultData = data; 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the current result data, as set by the previous receiver. 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Often this is null. 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return String The current result data; may be null. 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final String getResultData() { 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mResultData; 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Change the current result extras of this broadcast; only works with 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * broadcasts sent through 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Context#sendOrderedBroadcast(Intent, String) 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.sendOrderedBroadcast}. This is a Bundle 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * holding arbitrary data, whose interpretation is up to the 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * broadcaster. Can be set to null. Calling this method completely 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * replaces the current map (if any). 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><strong>This method does not work with non-ordered broadcasts such 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those sent with {@link Context#sendBroadcast(Intent) 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.sendBroadcast}</strong></p> 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param extras The new extra data map; may be null. 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setResult(int, String, Bundle) 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void setResultExtras(Bundle extras) { 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkSynchronousHint(); 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResultExtras = extras; 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the current result extra data, as set by the previous receiver. 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Any changes you make to the returned Map will be propagated to the next 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * receiver. 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param makeMap If true then a new empty Map will be made for you if the 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current Map is null; if false you should be prepared to 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * receive a null Map. 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Map The current extras map. 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Bundle getResultExtras(boolean makeMap) { 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle e = mResultExtras; 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!makeMap) return e; 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (e == null) mResultExtras = e = new Bundle(); 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return e; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Change all of the result data returned from this broadcasts; only works 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with broadcasts sent through 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Context#sendOrderedBroadcast(Intent, String) 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.sendOrderedBroadcast}. All current result data is replaced 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * by the value given to this method. 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><strong>This method does not work with non-ordered broadcasts such 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those sent with {@link Context#sendBroadcast(Intent) 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.sendBroadcast}</strong></p> 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param code The new result code. Often uses the 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Activity {@link android.app.Activity#RESULT_CANCELED} and 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#RESULT_OK} constants, though the 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * actual meaning of this value is ultimately up to the broadcaster. 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param data The new result data. This is an arbitrary 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * string whose interpretation is up to the broadcaster; may be null. 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param extras The new extra data map. This is a Bundle 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * holding arbitrary data, whose interpretation is up to the 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * broadcaster. Can be set to null. This completely 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * replaces the current map (if any). 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void setResult(int code, String data, Bundle extras) { 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkSynchronousHint(); 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResultCode = code; 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResultData = data; 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResultExtras = extras; 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the flag indicating whether or not this receiver should 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * abort the current broadcast. 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True if the broadcast should be aborted. 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean getAbortBroadcast() { 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAbortBroadcast; 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the flag indicating that this receiver should abort the 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current broadcast; only works with broadcasts sent through 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Context#sendOrderedBroadcast(Intent, String) 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.sendOrderedBroadcast}. This will prevent 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * any other broadcast receivers from receiving the broadcast. It will still 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * call {@link #onReceive} of the BroadcastReceiver that the caller of 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Context#sendOrderedBroadcast(Intent, String) 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.sendOrderedBroadcast} passed in. 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><strong>This method does not work with non-ordered broadcasts such 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those sent with {@link Context#sendBroadcast(Intent) 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.sendBroadcast}</strong></p> 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void abortBroadcast() { 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkSynchronousHint(); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAbortBroadcast = true; 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Clears the flag indicating that this receiver should abort the current 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * broadcast. 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void clearAbortBroadcast() { 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAbortBroadcast = false; 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For internal use, sets the hint about whether this BroadcastReceiver is 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * running in ordered mode. 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void setOrderedHint(boolean isOrdered) { 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOrderedHint = isOrdered; 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Control inclusion of debugging help for mismatched 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * calls to {@ Context#registerReceiver(BroadcastReceiver, IntentFilter) 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.registerReceiver()}. 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If called with true, before given to registerReceiver(), then the 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * callstack of the following {@link Context#unregisterReceiver(BroadcastReceiver) 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.unregisterReceiver()} call is retained, to be printed if a later 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * incorrect unregister call is made. Note that doing this requires retaining 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * information about the BroadcastReceiver for the lifetime of the app, 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resulting in a leak -- this should only be used for debugging. 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void setDebugUnregister(boolean debug) { 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDebugUnregister = debug; 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the last value given to {@link #setDebugUnregister}. 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean getDebugUnregister() { 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDebugUnregister; 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void checkSynchronousHint() { 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOrderedHint) { 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RuntimeException e = new RuntimeException( 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "BroadcastReceiver trying to return result during a non-ordered broadcast"); 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project e.fillInStackTrace(); 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e("BroadcastReceiver", e.getMessage(), e); 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mResultCode; 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mResultData; 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Bundle mResultExtras; 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mAbortBroadcast; 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mDebugUnregister; 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mOrderedHint; 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 426