BroadcastReceiver.java revision a34df8a2ba450b2c2ad83ccbbac30b80e2706bb2
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 47a34df8a2ba450b2c2ad83ccbbac30b80e2706bb2Chris Tate * broadcast are run in an undefined order, often at the same time. This is 48a34df8a2ba450b2c2ad83ccbbac30b80e2706bb2Chris Tate * more efficient, but means that receivers cannot 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 54a34df8a2ba450b2c2ad83ccbbac30b80e2706bb2Chris Tate * to other receivers. The order receivers run 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. 64a34df8a2ba450b2c2ad83ccbbac30b80e2706bb2Chris Tate * In this situation, however, the non-ordered semantics hold: these receivers still 65a34df8a2ba450b2c2ad83ccbbac30b80e2706bb2Chris Tate * cannot 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()}. 71105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * There is no way for a 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 106105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * within a 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 * 144105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * <p>A process that is currently executing a 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 159a34df8a2ba450b2c2ad83ccbbac30b80e2706bb2Chris Tate * a {@link android.app.Service} in conjunction with a 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 170a34df8a2ba450b2c2ad83ccbbac30b80e2706bb2Chris Tate * is normally called within 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 * 186a34df8a2ba450b2c2ad83ccbbac30b80e2706bb2Chris Tate * <p>The Intent filters used in {@link android.content.Context#registerReceiver} 187a34df8a2ba450b2c2ad83ccbbac30b80e2706bb2Chris Tate * and in application manifests are <em>not</em> guaranteed to be exclusive. They 188a34df8a2ba450b2c2ad83ccbbac30b80e2706bb2Chris Tate * are hints to the operating system about how to find suitable recipients. It is 189a34df8a2ba450b2c2ad83ccbbac30b80e2706bb2Chris Tate * possible for senders to force delivery to specific recipients, bypassing filter 190a34df8a2ba450b2c2ad83ccbbac30b80e2706bb2Chris Tate * resolution. For this reason, {@link #onReceive(Context, Intent) onReceive()} 191a34df8a2ba450b2c2ad83ccbbac30b80e2706bb2Chris Tate * implementations should respond only to known actions, ignoring any unexpected 192a34df8a2ba450b2c2ad83ccbbac30b80e2706bb2Chris Tate * Intents that they may receive. 193a34df8a2ba450b2c2ad83ccbbac30b80e2706bb2Chris Tate * 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The Context in which the receiver is running. 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param intent The Intent being received. 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract void onReceive(Context context, Intent intent); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Provide a binder to an already-running service. This method is synchronous 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and will not start the target service if it is not present, so it is safe 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to call from {@link #onReceive}. 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param myContext The Context that had been passed to {@link #onReceive(Context, Intent)} 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param service The Intent indicating the service you wish to use. See {@link 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context#startService(Intent)} for more information. 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public IBinder peekService(Context myContext, Intent service) { 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IActivityManager am = ActivityManagerNative.getDefault(); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder binder = null; 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project binder = am.peekService(service, service.resolveTypeIfNeeded( 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project myContext.getContentResolver())); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return binder; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Change the current result code of this broadcast; only works with 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * broadcasts sent through 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Context#sendOrderedBroadcast(Intent, String) 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.sendOrderedBroadcast}. Often uses the 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Activity {@link android.app.Activity#RESULT_CANCELED} and 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#RESULT_OK} constants, though the 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * actual meaning of this value is ultimately up to the broadcaster. 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><strong>This method does not work with non-ordered broadcasts such 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those sent with {@link Context#sendBroadcast(Intent) 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.sendBroadcast}</strong></p> 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param code The new result code. 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setResult(int, String, Bundle) 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void setResultCode(int code) { 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkSynchronousHint(); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResultCode = code; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the current result code, as set by the previous receiver. 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return int The current result code. 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int getResultCode() { 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mResultCode; 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Change the current result data of this broadcast; only works with 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * broadcasts sent through 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Context#sendOrderedBroadcast(Intent, String) 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.sendOrderedBroadcast}. This is an arbitrary 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * string whose interpretation is up to the broadcaster. 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><strong>This method does not work with non-ordered broadcasts such 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those sent with {@link Context#sendBroadcast(Intent) 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.sendBroadcast}</strong></p> 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param data The new result data; may be null. 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setResult(int, String, Bundle) 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void setResultData(String data) { 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkSynchronousHint(); 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResultData = data; 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the current result data, as set by the previous receiver. 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Often this is null. 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return String The current result data; may be null. 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final String getResultData() { 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mResultData; 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Change the current result extras of this broadcast; only works with 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * broadcasts sent through 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Context#sendOrderedBroadcast(Intent, String) 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.sendOrderedBroadcast}. This is a Bundle 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * holding arbitrary data, whose interpretation is up to the 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * broadcaster. Can be set to null. Calling this method completely 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * replaces the current map (if any). 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><strong>This method does not work with non-ordered broadcasts such 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those sent with {@link Context#sendBroadcast(Intent) 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.sendBroadcast}</strong></p> 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param extras The new extra data map; may be null. 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setResult(int, String, Bundle) 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void setResultExtras(Bundle extras) { 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkSynchronousHint(); 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResultExtras = extras; 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the current result extra data, as set by the previous receiver. 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Any changes you make to the returned Map will be propagated to the next 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * receiver. 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param makeMap If true then a new empty Map will be made for you if the 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current Map is null; if false you should be prepared to 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * receive a null Map. 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Map The current extras map. 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Bundle getResultExtras(boolean makeMap) { 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle e = mResultExtras; 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!makeMap) return e; 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (e == null) mResultExtras = e = new Bundle(); 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return e; 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Change all of the result data returned from this broadcasts; only works 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with broadcasts sent through 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Context#sendOrderedBroadcast(Intent, String) 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.sendOrderedBroadcast}. All current result data is replaced 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * by the value given to this method. 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><strong>This method does not work with non-ordered broadcasts such 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those sent with {@link Context#sendBroadcast(Intent) 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.sendBroadcast}</strong></p> 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param code The new result code. Often uses the 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Activity {@link android.app.Activity#RESULT_CANCELED} and 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#RESULT_OK} constants, though the 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * actual meaning of this value is ultimately up to the broadcaster. 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param data The new result data. This is an arbitrary 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * string whose interpretation is up to the broadcaster; may be null. 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param extras The new extra data map. This is a Bundle 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * holding arbitrary data, whose interpretation is up to the 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * broadcaster. Can be set to null. This completely 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * replaces the current map (if any). 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void setResult(int code, String data, Bundle extras) { 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkSynchronousHint(); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResultCode = code; 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResultData = data; 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResultExtras = extras; 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the flag indicating whether or not this receiver should 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * abort the current broadcast. 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True if the broadcast should be aborted. 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean getAbortBroadcast() { 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAbortBroadcast; 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the flag indicating that this receiver should abort the 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current broadcast; only works with broadcasts sent through 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Context#sendOrderedBroadcast(Intent, String) 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.sendOrderedBroadcast}. This will prevent 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * any other broadcast receivers from receiving the broadcast. It will still 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * call {@link #onReceive} of the BroadcastReceiver that the caller of 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Context#sendOrderedBroadcast(Intent, String) 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.sendOrderedBroadcast} passed in. 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><strong>This method does not work with non-ordered broadcasts such 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those sent with {@link Context#sendBroadcast(Intent) 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.sendBroadcast}</strong></p> 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void abortBroadcast() { 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkSynchronousHint(); 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAbortBroadcast = true; 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Clears the flag indicating that this receiver should abort the current 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * broadcast. 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void clearAbortBroadcast() { 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAbortBroadcast = false; 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For internal use, sets the hint about whether this BroadcastReceiver is 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * running in ordered mode. 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void setOrderedHint(boolean isOrdered) { 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOrderedHint = isOrdered; 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Control inclusion of debugging help for mismatched 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * calls to {@ Context#registerReceiver(BroadcastReceiver, IntentFilter) 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.registerReceiver()}. 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If called with true, before given to registerReceiver(), then the 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * callstack of the following {@link Context#unregisterReceiver(BroadcastReceiver) 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.unregisterReceiver()} call is retained, to be printed if a later 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * incorrect unregister call is made. Note that doing this requires retaining 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * information about the BroadcastReceiver for the lifetime of the app, 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resulting in a leak -- this should only be used for debugging. 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void setDebugUnregister(boolean debug) { 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDebugUnregister = debug; 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the last value given to {@link #setDebugUnregister}. 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean getDebugUnregister() { 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDebugUnregister; 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void checkSynchronousHint() { 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOrderedHint) { 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RuntimeException e = new RuntimeException( 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "BroadcastReceiver trying to return result during a non-ordered broadcast"); 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project e.fillInStackTrace(); 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e("BroadcastReceiver", e.getMessage(), e); 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mResultCode; 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mResultData; 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Bundle mResultExtras; 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mAbortBroadcast; 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mDebugUnregister; 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mOrderedHint; 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 434