• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2006 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.app;
18 
19 import android.content.ComponentName;
20 import android.content.Intent;
21 import android.content.IIntentReceiver;
22 import android.content.pm.ActivityInfo;
23 import android.content.pm.ApplicationInfo;
24 import android.content.pm.ProviderInfo;
25 import android.content.pm.ServiceInfo;
26 import android.content.res.Configuration;
27 import android.os.Binder;
28 import android.os.Bundle;
29 import android.os.Debug;
30 import android.os.Parcelable;
31 import android.os.RemoteException;
32 import android.os.IBinder;
33 import android.os.Parcel;
34 import android.os.ParcelFileDescriptor;
35 
36 import java.io.FileDescriptor;
37 import java.io.IOException;
38 import java.util.HashMap;
39 import java.util.List;
40 import java.util.Map;
41 
42 /** {@hide} */
43 public abstract class ApplicationThreadNative extends Binder
44         implements IApplicationThread {
45     /**
46      * Cast a Binder object into an application thread interface, generating
47      * a proxy if needed.
48      */
asInterface(IBinder obj)49     static public IApplicationThread asInterface(IBinder obj) {
50         if (obj == null) {
51             return null;
52         }
53         IApplicationThread in =
54             (IApplicationThread)obj.queryLocalInterface(descriptor);
55         if (in != null) {
56             return in;
57         }
58 
59         return new ApplicationThreadProxy(obj);
60     }
61 
ApplicationThreadNative()62     public ApplicationThreadNative() {
63         attachInterface(this, descriptor);
64     }
65 
66     @Override
onTransact(int code, Parcel data, Parcel reply, int flags)67     public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
68             throws RemoteException {
69         switch (code) {
70         case SCHEDULE_PAUSE_ACTIVITY_TRANSACTION:
71         {
72             data.enforceInterface(IApplicationThread.descriptor);
73             IBinder b = data.readStrongBinder();
74             boolean finished = data.readInt() != 0;
75             boolean userLeaving = data.readInt() != 0;
76             int configChanges = data.readInt();
77             schedulePauseActivity(b, finished, userLeaving, configChanges);
78             return true;
79         }
80 
81         case SCHEDULE_STOP_ACTIVITY_TRANSACTION:
82         {
83             data.enforceInterface(IApplicationThread.descriptor);
84             IBinder b = data.readStrongBinder();
85             boolean show = data.readInt() != 0;
86             int configChanges = data.readInt();
87             scheduleStopActivity(b, show, configChanges);
88             return true;
89         }
90 
91         case SCHEDULE_WINDOW_VISIBILITY_TRANSACTION:
92         {
93             data.enforceInterface(IApplicationThread.descriptor);
94             IBinder b = data.readStrongBinder();
95             boolean show = data.readInt() != 0;
96             scheduleWindowVisibility(b, show);
97             return true;
98         }
99 
100         case SCHEDULE_RESUME_ACTIVITY_TRANSACTION:
101         {
102             data.enforceInterface(IApplicationThread.descriptor);
103             IBinder b = data.readStrongBinder();
104             boolean isForward = data.readInt() != 0;
105             scheduleResumeActivity(b, isForward);
106             return true;
107         }
108 
109         case SCHEDULE_SEND_RESULT_TRANSACTION:
110         {
111             data.enforceInterface(IApplicationThread.descriptor);
112             IBinder b = data.readStrongBinder();
113             List<ResultInfo> ri = data.createTypedArrayList(ResultInfo.CREATOR);
114             scheduleSendResult(b, ri);
115             return true;
116         }
117 
118         case SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION:
119         {
120             data.enforceInterface(IApplicationThread.descriptor);
121             Intent intent = Intent.CREATOR.createFromParcel(data);
122             IBinder b = data.readStrongBinder();
123             int ident = data.readInt();
124             ActivityInfo info = ActivityInfo.CREATOR.createFromParcel(data);
125             Bundle state = data.readBundle();
126             List<ResultInfo> ri = data.createTypedArrayList(ResultInfo.CREATOR);
127             List<Intent> pi = data.createTypedArrayList(Intent.CREATOR);
128             boolean notResumed = data.readInt() != 0;
129             boolean isForward = data.readInt() != 0;
130             scheduleLaunchActivity(intent, b, ident, info, state, ri, pi,
131                     notResumed, isForward);
132             return true;
133         }
134 
135         case SCHEDULE_RELAUNCH_ACTIVITY_TRANSACTION:
136         {
137             data.enforceInterface(IApplicationThread.descriptor);
138             IBinder b = data.readStrongBinder();
139             List<ResultInfo> ri = data.createTypedArrayList(ResultInfo.CREATOR);
140             List<Intent> pi = data.createTypedArrayList(Intent.CREATOR);
141             int configChanges = data.readInt();
142             boolean notResumed = data.readInt() != 0;
143             Configuration config = null;
144             if (data.readInt() != 0) {
145                 config = Configuration.CREATOR.createFromParcel(data);
146             }
147             scheduleRelaunchActivity(b, ri, pi, configChanges, notResumed, config);
148             return true;
149         }
150 
151         case SCHEDULE_NEW_INTENT_TRANSACTION:
152         {
153             data.enforceInterface(IApplicationThread.descriptor);
154             List<Intent> pi = data.createTypedArrayList(Intent.CREATOR);
155             IBinder b = data.readStrongBinder();
156             scheduleNewIntent(pi, b);
157             return true;
158         }
159 
160         case SCHEDULE_FINISH_ACTIVITY_TRANSACTION:
161         {
162             data.enforceInterface(IApplicationThread.descriptor);
163             IBinder b = data.readStrongBinder();
164             boolean finishing = data.readInt() != 0;
165             int configChanges = data.readInt();
166             scheduleDestroyActivity(b, finishing, configChanges);
167             return true;
168         }
169 
170         case SCHEDULE_RECEIVER_TRANSACTION:
171         {
172             data.enforceInterface(IApplicationThread.descriptor);
173             Intent intent = Intent.CREATOR.createFromParcel(data);
174             ActivityInfo info = ActivityInfo.CREATOR.createFromParcel(data);
175             int resultCode = data.readInt();
176             String resultData = data.readString();
177             Bundle resultExtras = data.readBundle();
178             boolean sync = data.readInt() != 0;
179             scheduleReceiver(intent, info, resultCode, resultData,
180                     resultExtras, sync);
181             return true;
182         }
183 
184         case SCHEDULE_CREATE_SERVICE_TRANSACTION: {
185             data.enforceInterface(IApplicationThread.descriptor);
186             IBinder token = data.readStrongBinder();
187             ServiceInfo info = ServiceInfo.CREATOR.createFromParcel(data);
188             scheduleCreateService(token, info);
189             return true;
190         }
191 
192         case SCHEDULE_BIND_SERVICE_TRANSACTION: {
193             data.enforceInterface(IApplicationThread.descriptor);
194             IBinder token = data.readStrongBinder();
195             Intent intent = Intent.CREATOR.createFromParcel(data);
196             boolean rebind = data.readInt() != 0;
197             scheduleBindService(token, intent, rebind);
198             return true;
199         }
200 
201         case SCHEDULE_UNBIND_SERVICE_TRANSACTION: {
202             data.enforceInterface(IApplicationThread.descriptor);
203             IBinder token = data.readStrongBinder();
204             Intent intent = Intent.CREATOR.createFromParcel(data);
205             scheduleUnbindService(token, intent);
206             return true;
207         }
208 
209         case SCHEDULE_SERVICE_ARGS_TRANSACTION:
210         {
211             data.enforceInterface(IApplicationThread.descriptor);
212             IBinder token = data.readStrongBinder();
213             int startId = data.readInt();
214             int fl = data.readInt();
215             Intent args;
216             if (data.readInt() != 0) {
217                 args = Intent.CREATOR.createFromParcel(data);
218             } else {
219                 args = null;
220             }
221             scheduleServiceArgs(token, startId, fl, args);
222             return true;
223         }
224 
225         case SCHEDULE_STOP_SERVICE_TRANSACTION:
226         {
227             data.enforceInterface(IApplicationThread.descriptor);
228             IBinder token = data.readStrongBinder();
229             scheduleStopService(token);
230             return true;
231         }
232 
233         case BIND_APPLICATION_TRANSACTION:
234         {
235             data.enforceInterface(IApplicationThread.descriptor);
236             String packageName = data.readString();
237             ApplicationInfo info =
238                 ApplicationInfo.CREATOR.createFromParcel(data);
239             List<ProviderInfo> providers =
240                 data.createTypedArrayList(ProviderInfo.CREATOR);
241             ComponentName testName = (data.readInt() != 0)
242                 ? new ComponentName(data) : null;
243             String profileName = data.readString();
244             Bundle testArgs = data.readBundle();
245             IBinder binder = data.readStrongBinder();
246             IInstrumentationWatcher testWatcher = IInstrumentationWatcher.Stub.asInterface(binder);
247             int testMode = data.readInt();
248             boolean restrictedBackupMode = (data.readInt() != 0);
249             Configuration config = Configuration.CREATOR.createFromParcel(data);
250             HashMap<String, IBinder> services = data.readHashMap(null);
251             bindApplication(packageName, info,
252                             providers, testName, profileName,
253                             testArgs, testWatcher, testMode, restrictedBackupMode,
254                             config, services);
255             return true;
256         }
257 
258         case SCHEDULE_EXIT_TRANSACTION:
259         {
260             data.enforceInterface(IApplicationThread.descriptor);
261             scheduleExit();
262             return true;
263         }
264 
265         case SCHEDULE_SUICIDE_TRANSACTION:
266         {
267             data.enforceInterface(IApplicationThread.descriptor);
268             scheduleSuicide();
269             return true;
270         }
271 
272         case REQUEST_THUMBNAIL_TRANSACTION:
273         {
274             data.enforceInterface(IApplicationThread.descriptor);
275             IBinder b = data.readStrongBinder();
276             requestThumbnail(b);
277             return true;
278         }
279 
280         case SCHEDULE_CONFIGURATION_CHANGED_TRANSACTION:
281         {
282             data.enforceInterface(IApplicationThread.descriptor);
283             Configuration config = Configuration.CREATOR.createFromParcel(data);
284             scheduleConfigurationChanged(config);
285             return true;
286         }
287 
288         case UPDATE_TIME_ZONE_TRANSACTION: {
289             data.enforceInterface(IApplicationThread.descriptor);
290             updateTimeZone();
291             return true;
292         }
293 
294         case PROCESS_IN_BACKGROUND_TRANSACTION: {
295             data.enforceInterface(IApplicationThread.descriptor);
296             processInBackground();
297             return true;
298         }
299 
300         case DUMP_SERVICE_TRANSACTION: {
301             data.enforceInterface(IApplicationThread.descriptor);
302             ParcelFileDescriptor fd = data.readFileDescriptor();
303             final IBinder service = data.readStrongBinder();
304             final String[] args = data.readStringArray();
305             if (fd != null) {
306                 dumpService(fd.getFileDescriptor(), service, args);
307                 try {
308                     fd.close();
309                 } catch (IOException e) {
310                 }
311             }
312             return true;
313         }
314 
315         case SCHEDULE_REGISTERED_RECEIVER_TRANSACTION: {
316             data.enforceInterface(IApplicationThread.descriptor);
317             IIntentReceiver receiver = IIntentReceiver.Stub.asInterface(
318                     data.readStrongBinder());
319             Intent intent = Intent.CREATOR.createFromParcel(data);
320             int resultCode = data.readInt();
321             String dataStr = data.readString();
322             Bundle extras = data.readBundle();
323             boolean ordered = data.readInt() != 0;
324             boolean sticky = data.readInt() != 0;
325             scheduleRegisteredReceiver(receiver, intent,
326                     resultCode, dataStr, extras, ordered, sticky);
327             return true;
328         }
329 
330         case SCHEDULE_LOW_MEMORY_TRANSACTION:
331         {
332             scheduleLowMemory();
333             return true;
334         }
335 
336         case SCHEDULE_ACTIVITY_CONFIGURATION_CHANGED_TRANSACTION:
337         {
338             data.enforceInterface(IApplicationThread.descriptor);
339             IBinder b = data.readStrongBinder();
340             scheduleActivityConfigurationChanged(b);
341             return true;
342         }
343 
344         case PROFILER_CONTROL_TRANSACTION:
345         {
346             data.enforceInterface(IApplicationThread.descriptor);
347             boolean start = data.readInt() != 0;
348             String path = data.readString();
349             ParcelFileDescriptor fd = data.readInt() != 0
350                     ? data.readFileDescriptor() : null;
351             profilerControl(start, path, fd);
352             return true;
353         }
354 
355         case SET_SCHEDULING_GROUP_TRANSACTION:
356         {
357             data.enforceInterface(IApplicationThread.descriptor);
358             int group = data.readInt();
359             setSchedulingGroup(group);
360             return true;
361         }
362 
363         case SCHEDULE_CREATE_BACKUP_AGENT_TRANSACTION:
364         {
365             data.enforceInterface(IApplicationThread.descriptor);
366             ApplicationInfo appInfo = ApplicationInfo.CREATOR.createFromParcel(data);
367             int backupMode = data.readInt();
368             scheduleCreateBackupAgent(appInfo, backupMode);
369             return true;
370         }
371 
372         case SCHEDULE_DESTROY_BACKUP_AGENT_TRANSACTION:
373         {
374             data.enforceInterface(IApplicationThread.descriptor);
375             ApplicationInfo appInfo = ApplicationInfo.CREATOR.createFromParcel(data);
376             scheduleDestroyBackupAgent(appInfo);
377             return true;
378         }
379 
380         case GET_MEMORY_INFO_TRANSACTION:
381         {
382             data.enforceInterface(IApplicationThread.descriptor);
383             Debug.MemoryInfo mi = new Debug.MemoryInfo();
384             getMemoryInfo(mi);
385             reply.writeNoException();
386             mi.writeToParcel(reply, 0);
387             return true;
388         }
389 
390         case DISPATCH_PACKAGE_BROADCAST_TRANSACTION:
391         {
392             data.enforceInterface(IApplicationThread.descriptor);
393             int cmd = data.readInt();
394             String[] packages = data.readStringArray();
395             dispatchPackageBroadcast(cmd, packages);
396             return true;
397         }
398 
399         case SCHEDULE_CRASH_TRANSACTION:
400         {
401             data.enforceInterface(IApplicationThread.descriptor);
402             String msg = data.readString();
403             scheduleCrash(msg);
404             return true;
405         }
406         }
407 
408         return super.onTransact(code, data, reply, flags);
409     }
410 
asBinder()411     public IBinder asBinder()
412     {
413         return this;
414     }
415 }
416 
417 class ApplicationThreadProxy implements IApplicationThread {
418     private final IBinder mRemote;
419 
ApplicationThreadProxy(IBinder remote)420     public ApplicationThreadProxy(IBinder remote) {
421         mRemote = remote;
422     }
423 
asBinder()424     public final IBinder asBinder() {
425         return mRemote;
426     }
427 
schedulePauseActivity(IBinder token, boolean finished, boolean userLeaving, int configChanges)428     public final void schedulePauseActivity(IBinder token, boolean finished,
429             boolean userLeaving, int configChanges) throws RemoteException {
430         Parcel data = Parcel.obtain();
431         data.writeInterfaceToken(IApplicationThread.descriptor);
432         data.writeStrongBinder(token);
433         data.writeInt(finished ? 1 : 0);
434         data.writeInt(userLeaving ? 1 :0);
435         data.writeInt(configChanges);
436         mRemote.transact(SCHEDULE_PAUSE_ACTIVITY_TRANSACTION, data, null,
437                 IBinder.FLAG_ONEWAY);
438         data.recycle();
439     }
440 
scheduleStopActivity(IBinder token, boolean showWindow, int configChanges)441     public final void scheduleStopActivity(IBinder token, boolean showWindow,
442             int configChanges) throws RemoteException {
443         Parcel data = Parcel.obtain();
444         data.writeInterfaceToken(IApplicationThread.descriptor);
445         data.writeStrongBinder(token);
446         data.writeInt(showWindow ? 1 : 0);
447         data.writeInt(configChanges);
448         mRemote.transact(SCHEDULE_STOP_ACTIVITY_TRANSACTION, data, null,
449                 IBinder.FLAG_ONEWAY);
450         data.recycle();
451     }
452 
scheduleWindowVisibility(IBinder token, boolean showWindow)453     public final void scheduleWindowVisibility(IBinder token,
454             boolean showWindow) throws RemoteException {
455         Parcel data = Parcel.obtain();
456         data.writeInterfaceToken(IApplicationThread.descriptor);
457         data.writeStrongBinder(token);
458         data.writeInt(showWindow ? 1 : 0);
459         mRemote.transact(SCHEDULE_WINDOW_VISIBILITY_TRANSACTION, data, null,
460                 IBinder.FLAG_ONEWAY);
461         data.recycle();
462     }
463 
scheduleResumeActivity(IBinder token, boolean isForward)464     public final void scheduleResumeActivity(IBinder token, boolean isForward)
465             throws RemoteException {
466         Parcel data = Parcel.obtain();
467         data.writeInterfaceToken(IApplicationThread.descriptor);
468         data.writeStrongBinder(token);
469         data.writeInt(isForward ? 1 : 0);
470         mRemote.transact(SCHEDULE_RESUME_ACTIVITY_TRANSACTION, data, null,
471                 IBinder.FLAG_ONEWAY);
472         data.recycle();
473     }
474 
scheduleSendResult(IBinder token, List<ResultInfo> results)475     public final void scheduleSendResult(IBinder token, List<ResultInfo> results)
476     		throws RemoteException {
477         Parcel data = Parcel.obtain();
478         data.writeInterfaceToken(IApplicationThread.descriptor);
479         data.writeStrongBinder(token);
480         data.writeTypedList(results);
481         mRemote.transact(SCHEDULE_SEND_RESULT_TRANSACTION, data, null,
482                 IBinder.FLAG_ONEWAY);
483         data.recycle();
484     }
485 
scheduleLaunchActivity(Intent intent, IBinder token, int ident, ActivityInfo info, Bundle state, List<ResultInfo> pendingResults, List<Intent> pendingNewIntents, boolean notResumed, boolean isForward)486     public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
487             ActivityInfo info, Bundle state, List<ResultInfo> pendingResults,
488     		List<Intent> pendingNewIntents, boolean notResumed, boolean isForward)
489     		throws RemoteException {
490         Parcel data = Parcel.obtain();
491         data.writeInterfaceToken(IApplicationThread.descriptor);
492         intent.writeToParcel(data, 0);
493         data.writeStrongBinder(token);
494         data.writeInt(ident);
495         info.writeToParcel(data, 0);
496         data.writeBundle(state);
497         data.writeTypedList(pendingResults);
498         data.writeTypedList(pendingNewIntents);
499         data.writeInt(notResumed ? 1 : 0);
500         data.writeInt(isForward ? 1 : 0);
501         mRemote.transact(SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION, data, null,
502                 IBinder.FLAG_ONEWAY);
503         data.recycle();
504     }
505 
scheduleRelaunchActivity(IBinder token, List<ResultInfo> pendingResults, List<Intent> pendingNewIntents, int configChanges, boolean notResumed, Configuration config)506     public final void scheduleRelaunchActivity(IBinder token,
507             List<ResultInfo> pendingResults, List<Intent> pendingNewIntents,
508             int configChanges, boolean notResumed, Configuration config)
509             throws RemoteException {
510         Parcel data = Parcel.obtain();
511         data.writeInterfaceToken(IApplicationThread.descriptor);
512         data.writeStrongBinder(token);
513         data.writeTypedList(pendingResults);
514         data.writeTypedList(pendingNewIntents);
515         data.writeInt(configChanges);
516         data.writeInt(notResumed ? 1 : 0);
517         if (config != null) {
518             data.writeInt(1);
519             config.writeToParcel(data, 0);
520         } else {
521             data.writeInt(0);
522         }
523         mRemote.transact(SCHEDULE_RELAUNCH_ACTIVITY_TRANSACTION, data, null,
524                 IBinder.FLAG_ONEWAY);
525         data.recycle();
526     }
527 
scheduleNewIntent(List<Intent> intents, IBinder token)528     public void scheduleNewIntent(List<Intent> intents, IBinder token)
529             throws RemoteException {
530         Parcel data = Parcel.obtain();
531         data.writeInterfaceToken(IApplicationThread.descriptor);
532         data.writeTypedList(intents);
533         data.writeStrongBinder(token);
534         mRemote.transact(SCHEDULE_NEW_INTENT_TRANSACTION, data, null,
535                 IBinder.FLAG_ONEWAY);
536         data.recycle();
537     }
538 
scheduleDestroyActivity(IBinder token, boolean finishing, int configChanges)539     public final void scheduleDestroyActivity(IBinder token, boolean finishing,
540             int configChanges) throws RemoteException {
541         Parcel data = Parcel.obtain();
542         data.writeInterfaceToken(IApplicationThread.descriptor);
543         data.writeStrongBinder(token);
544         data.writeInt(finishing ? 1 : 0);
545         data.writeInt(configChanges);
546         mRemote.transact(SCHEDULE_FINISH_ACTIVITY_TRANSACTION, data, null,
547                 IBinder.FLAG_ONEWAY);
548         data.recycle();
549     }
550 
scheduleReceiver(Intent intent, ActivityInfo info, int resultCode, String resultData, Bundle map, boolean sync)551     public final void scheduleReceiver(Intent intent, ActivityInfo info,
552             int resultCode, String resultData,
553             Bundle map, boolean sync) throws RemoteException {
554         Parcel data = Parcel.obtain();
555         data.writeInterfaceToken(IApplicationThread.descriptor);
556         intent.writeToParcel(data, 0);
557         info.writeToParcel(data, 0);
558         data.writeInt(resultCode);
559         data.writeString(resultData);
560         data.writeBundle(map);
561         data.writeInt(sync ? 1 : 0);
562         mRemote.transact(SCHEDULE_RECEIVER_TRANSACTION, data, null,
563                 IBinder.FLAG_ONEWAY);
564         data.recycle();
565     }
566 
scheduleCreateBackupAgent(ApplicationInfo app, int backupMode)567     public final void scheduleCreateBackupAgent(ApplicationInfo app, int backupMode)
568             throws RemoteException {
569         Parcel data = Parcel.obtain();
570         data.writeInterfaceToken(IApplicationThread.descriptor);
571         app.writeToParcel(data, 0);
572         data.writeInt(backupMode);
573         mRemote.transact(SCHEDULE_CREATE_BACKUP_AGENT_TRANSACTION, data, null,
574                 IBinder.FLAG_ONEWAY);
575         data.recycle();
576     }
577 
scheduleDestroyBackupAgent(ApplicationInfo app)578     public final void scheduleDestroyBackupAgent(ApplicationInfo app) throws RemoteException {
579         Parcel data = Parcel.obtain();
580         data.writeInterfaceToken(IApplicationThread.descriptor);
581         app.writeToParcel(data, 0);
582         mRemote.transact(SCHEDULE_DESTROY_BACKUP_AGENT_TRANSACTION, data, null,
583                 IBinder.FLAG_ONEWAY);
584         data.recycle();
585     }
586 
scheduleCreateService(IBinder token, ServiceInfo info)587     public final void scheduleCreateService(IBinder token, ServiceInfo info)
588             throws RemoteException {
589         Parcel data = Parcel.obtain();
590         data.writeInterfaceToken(IApplicationThread.descriptor);
591         data.writeStrongBinder(token);
592         info.writeToParcel(data, 0);
593         mRemote.transact(SCHEDULE_CREATE_SERVICE_TRANSACTION, data, null,
594                 IBinder.FLAG_ONEWAY);
595         data.recycle();
596     }
597 
scheduleBindService(IBinder token, Intent intent, boolean rebind)598     public final void scheduleBindService(IBinder token, Intent intent, boolean rebind)
599             throws RemoteException {
600         Parcel data = Parcel.obtain();
601         data.writeInterfaceToken(IApplicationThread.descriptor);
602         data.writeStrongBinder(token);
603         intent.writeToParcel(data, 0);
604         data.writeInt(rebind ? 1 : 0);
605         mRemote.transact(SCHEDULE_BIND_SERVICE_TRANSACTION, data, null,
606                 IBinder.FLAG_ONEWAY);
607         data.recycle();
608     }
609 
scheduleUnbindService(IBinder token, Intent intent)610     public final void scheduleUnbindService(IBinder token, Intent intent)
611             throws RemoteException {
612         Parcel data = Parcel.obtain();
613         data.writeInterfaceToken(IApplicationThread.descriptor);
614         data.writeStrongBinder(token);
615         intent.writeToParcel(data, 0);
616         mRemote.transact(SCHEDULE_UNBIND_SERVICE_TRANSACTION, data, null,
617                 IBinder.FLAG_ONEWAY);
618         data.recycle();
619     }
620 
scheduleServiceArgs(IBinder token, int startId, int flags, Intent args)621     public final void scheduleServiceArgs(IBinder token, int startId,
622 	    int flags, Intent args) throws RemoteException {
623         Parcel data = Parcel.obtain();
624         data.writeInterfaceToken(IApplicationThread.descriptor);
625         data.writeStrongBinder(token);
626         data.writeInt(startId);
627         data.writeInt(flags);
628         if (args != null) {
629             data.writeInt(1);
630             args.writeToParcel(data, 0);
631         } else {
632             data.writeInt(0);
633         }
634         mRemote.transact(SCHEDULE_SERVICE_ARGS_TRANSACTION, data, null,
635                 IBinder.FLAG_ONEWAY);
636         data.recycle();
637     }
638 
scheduleStopService(IBinder token)639     public final void scheduleStopService(IBinder token)
640             throws RemoteException {
641         Parcel data = Parcel.obtain();
642         data.writeInterfaceToken(IApplicationThread.descriptor);
643         data.writeStrongBinder(token);
644         mRemote.transact(SCHEDULE_STOP_SERVICE_TRANSACTION, data, null,
645                 IBinder.FLAG_ONEWAY);
646         data.recycle();
647     }
648 
bindApplication(String packageName, ApplicationInfo info, List<ProviderInfo> providers, ComponentName testName, String profileName, Bundle testArgs, IInstrumentationWatcher testWatcher, int debugMode, boolean restrictedBackupMode, Configuration config, Map<String, IBinder> services)649     public final void bindApplication(String packageName, ApplicationInfo info,
650             List<ProviderInfo> providers, ComponentName testName,
651             String profileName, Bundle testArgs, IInstrumentationWatcher testWatcher, int debugMode,
652             boolean restrictedBackupMode, Configuration config,
653             Map<String, IBinder> services) throws RemoteException {
654         Parcel data = Parcel.obtain();
655         data.writeInterfaceToken(IApplicationThread.descriptor);
656         data.writeString(packageName);
657         info.writeToParcel(data, 0);
658         data.writeTypedList(providers);
659         if (testName == null) {
660             data.writeInt(0);
661         } else {
662             data.writeInt(1);
663             testName.writeToParcel(data, 0);
664         }
665         data.writeString(profileName);
666         data.writeBundle(testArgs);
667         data.writeStrongInterface(testWatcher);
668         data.writeInt(debugMode);
669         data.writeInt(restrictedBackupMode ? 1 : 0);
670         config.writeToParcel(data, 0);
671         data.writeMap(services);
672         mRemote.transact(BIND_APPLICATION_TRANSACTION, data, null,
673                 IBinder.FLAG_ONEWAY);
674         data.recycle();
675     }
676 
scheduleExit()677     public final void scheduleExit() throws RemoteException {
678         Parcel data = Parcel.obtain();
679         data.writeInterfaceToken(IApplicationThread.descriptor);
680         mRemote.transact(SCHEDULE_EXIT_TRANSACTION, data, null,
681                 IBinder.FLAG_ONEWAY);
682         data.recycle();
683     }
684 
scheduleSuicide()685     public final void scheduleSuicide() throws RemoteException {
686         Parcel data = Parcel.obtain();
687         data.writeInterfaceToken(IApplicationThread.descriptor);
688         mRemote.transact(SCHEDULE_SUICIDE_TRANSACTION, data, null,
689                 IBinder.FLAG_ONEWAY);
690         data.recycle();
691     }
692 
requestThumbnail(IBinder token)693     public final void requestThumbnail(IBinder token)
694             throws RemoteException {
695         Parcel data = Parcel.obtain();
696         data.writeInterfaceToken(IApplicationThread.descriptor);
697         data.writeStrongBinder(token);
698         mRemote.transact(REQUEST_THUMBNAIL_TRANSACTION, data, null,
699                 IBinder.FLAG_ONEWAY);
700         data.recycle();
701     }
702 
scheduleConfigurationChanged(Configuration config)703     public final void scheduleConfigurationChanged(Configuration config)
704             throws RemoteException {
705         Parcel data = Parcel.obtain();
706         data.writeInterfaceToken(IApplicationThread.descriptor);
707         config.writeToParcel(data, 0);
708         mRemote.transact(SCHEDULE_CONFIGURATION_CHANGED_TRANSACTION, data, null,
709                 IBinder.FLAG_ONEWAY);
710         data.recycle();
711     }
712 
updateTimeZone()713     public void updateTimeZone() throws RemoteException {
714         Parcel data = Parcel.obtain();
715         data.writeInterfaceToken(IApplicationThread.descriptor);
716         mRemote.transact(UPDATE_TIME_ZONE_TRANSACTION, data, null,
717                 IBinder.FLAG_ONEWAY);
718         data.recycle();
719     }
720 
processInBackground()721     public void processInBackground() throws RemoteException {
722         Parcel data = Parcel.obtain();
723         data.writeInterfaceToken(IApplicationThread.descriptor);
724         mRemote.transact(PROCESS_IN_BACKGROUND_TRANSACTION, data, null,
725                 IBinder.FLAG_ONEWAY);
726         data.recycle();
727     }
728 
dumpService(FileDescriptor fd, IBinder token, String[] args)729     public void dumpService(FileDescriptor fd, IBinder token, String[] args)
730             throws RemoteException {
731         Parcel data = Parcel.obtain();
732         data.writeInterfaceToken(IApplicationThread.descriptor);
733         data.writeFileDescriptor(fd);
734         data.writeStrongBinder(token);
735         data.writeStringArray(args);
736         mRemote.transact(DUMP_SERVICE_TRANSACTION, data, null, 0);
737         data.recycle();
738     }
739 
scheduleRegisteredReceiver(IIntentReceiver receiver, Intent intent, int resultCode, String dataStr, Bundle extras, boolean ordered, boolean sticky)740     public void scheduleRegisteredReceiver(IIntentReceiver receiver, Intent intent,
741             int resultCode, String dataStr, Bundle extras, boolean ordered, boolean sticky)
742             throws RemoteException {
743         Parcel data = Parcel.obtain();
744         data.writeInterfaceToken(IApplicationThread.descriptor);
745         data.writeStrongBinder(receiver.asBinder());
746         intent.writeToParcel(data, 0);
747         data.writeInt(resultCode);
748         data.writeString(dataStr);
749         data.writeBundle(extras);
750         data.writeInt(ordered ? 1 : 0);
751         data.writeInt(sticky ? 1 : 0);
752         mRemote.transact(SCHEDULE_REGISTERED_RECEIVER_TRANSACTION, data, null,
753                 IBinder.FLAG_ONEWAY);
754         data.recycle();
755     }
756 
scheduleLowMemory()757     public final void scheduleLowMemory() throws RemoteException {
758         Parcel data = Parcel.obtain();
759         data.writeInterfaceToken(IApplicationThread.descriptor);
760         mRemote.transact(SCHEDULE_LOW_MEMORY_TRANSACTION, data, null,
761                 IBinder.FLAG_ONEWAY);
762         data.recycle();
763     }
764 
scheduleActivityConfigurationChanged( IBinder token)765     public final void scheduleActivityConfigurationChanged(
766             IBinder token) throws RemoteException {
767         Parcel data = Parcel.obtain();
768         data.writeInterfaceToken(IApplicationThread.descriptor);
769         data.writeStrongBinder(token);
770         mRemote.transact(SCHEDULE_ACTIVITY_CONFIGURATION_CHANGED_TRANSACTION, data, null,
771                 IBinder.FLAG_ONEWAY);
772         data.recycle();
773     }
774 
profilerControl(boolean start, String path, ParcelFileDescriptor fd)775     public void profilerControl(boolean start, String path,
776             ParcelFileDescriptor fd) throws RemoteException {
777         Parcel data = Parcel.obtain();
778         data.writeInterfaceToken(IApplicationThread.descriptor);
779         data.writeInt(start ? 1 : 0);
780         data.writeString(path);
781         if (fd != null) {
782             data.writeInt(1);
783             fd.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
784         } else {
785             data.writeInt(0);
786         }
787         mRemote.transact(PROFILER_CONTROL_TRANSACTION, data, null,
788                 IBinder.FLAG_ONEWAY);
789         data.recycle();
790     }
791 
setSchedulingGroup(int group)792     public void setSchedulingGroup(int group) throws RemoteException {
793         Parcel data = Parcel.obtain();
794         data.writeInterfaceToken(IApplicationThread.descriptor);
795         data.writeInt(group);
796         mRemote.transact(SET_SCHEDULING_GROUP_TRANSACTION, data, null,
797                 IBinder.FLAG_ONEWAY);
798         data.recycle();
799     }
800 
getMemoryInfo(Debug.MemoryInfo outInfo)801     public void getMemoryInfo(Debug.MemoryInfo outInfo) throws RemoteException {
802         Parcel data = Parcel.obtain();
803         Parcel reply = Parcel.obtain();
804         data.writeInterfaceToken(IApplicationThread.descriptor);
805         mRemote.transact(GET_MEMORY_INFO_TRANSACTION, data, reply, 0);
806         reply.readException();
807         outInfo.readFromParcel(reply);
808         data.recycle();
809         reply.recycle();
810     }
811 
dispatchPackageBroadcast(int cmd, String[] packages)812     public void dispatchPackageBroadcast(int cmd, String[] packages) throws RemoteException {
813         Parcel data = Parcel.obtain();
814         data.writeInterfaceToken(IApplicationThread.descriptor);
815         data.writeInt(cmd);
816         data.writeStringArray(packages);
817         mRemote.transact(DISPATCH_PACKAGE_BROADCAST_TRANSACTION, data, null,
818                 IBinder.FLAG_ONEWAY);
819         data.recycle();
820 
821     }
822 
scheduleCrash(String msg)823     public void scheduleCrash(String msg) throws RemoteException {
824         Parcel data = Parcel.obtain();
825         data.writeInterfaceToken(IApplicationThread.descriptor);
826         data.writeString(msg);
827         mRemote.transact(SCHEDULE_CRASH_TRANSACTION, data, null,
828                 IBinder.FLAG_ONEWAY);
829         data.recycle();
830 
831     }
832 }
833 
834