好了先看下面:
package com.android.server.am;
18
19 import com.android.internal.R;
20 import com.android.internal.os.BatteryStatsImpl;
21 import com.android.internal.os.ProcessStats;
22 import com.android.server.AttributeCache;
23 import com.android.server.IntentResolver;
24 import com.android.server.ProcessMap;
25 import com.android.server.SystemServer;
26 import com.android.server.Watchdog;
27 import com.android.server.am.ActivityStack.ActivityState;
28 import com.android.server.wm.WindowManagerService;
30 import dalvik.system.Zygote;
32 import android.app.Activity;
33 import android.app.ActivityManager;
34 import android.app.ActivityManagerNative;
35 import android.app.ActivityThread;
36 import android.app.AlertDialog;
37 import android.app.AppGlobals;
38 import android.app.ApplicationErrorReport;
39 import android.app.Dialog;
40 import android.app.IActivityController;
41 import android.app.IActivityWatcher;
42 import android.app.IApplicationThread;
43 import android.app.IInstrumentationWatcher;
44 import android.app.INotificationManager;
45 import android.app.IProcessObserver;
46 import android.app.IServiceConnection;
47 import android.app.IThumbnailReceiver;
48 import android.app.Instrumentation;
49 import android.app.Notification;
50 import android.app.NotificationManager;
51 import android.app.PendingIntent;
52import android.app.Service;
53 import android.app.backup.IBackupManager;
54 import android.content.ActivityNotFoundException;
55 import android.content.BroadcastReceiver;
56 import android.content.ComponentCallbacks2;
57 import android.content.ComponentName;
58 import android.content.ContentResolver;
59 import android.content.Context;
60 import android.content.DialogInterface;
61 import android.content.Intent;
62 import android.content.IntentFilter;
63 import android.content.IIntentReceiver;
64 import android.content.IIntentSender;
65 import android.content.IntentSender;
66 import android.content.pm.ActivityInfo;
67 import android.content.pm.ApplicationInfo;
68 import android.content.pm.ConfigurationInfo;
69 import android.content.pm.IPackageDataObserver;
70 import android.content.pm.IPackageManager;
71 import android.content.pm.InstrumentationInfo;
72 import android.content.pm.PackageInfo;
73 import android.content.pm.PackageManager;
74 import android.content.pm.PathPermission;
75 import android.content.pm.ProviderInfo;
76 import android.content.pm.ResolveInfo;
77 import android.content.pm.ServiceInfo;
78 import android.content.pm.PackageManager.NameNotFoundException;
79 import android.content.res.CompatibilityInfo;
80 import android.content.res.Configuration;
81 import android.graphics.Bitmap;
82 import android.net.Proxy;
83 import android.net.ProxyProperties;
84 import android.net.Uri;
85 import android.os.Binder;
86 import android.os.Build;
87 import android.os.Bundle;
88 import android.os.Debug;
89 import android.os.DropBoxManager;
90 import android.os.Environment;
91 import android.os.FileObserver;
92 import android.os.FileUtils;
93 import android.os.Handler;
94 import android.os.IBinder;
95 import android.os.IPermissionController;
96 import android.os.Looper;
97 import android.os.Message;
98 import android.os.Parcel;
99 import android.os.ParcelFileDescriptor;
100 import android.os.Process;
101 import android.os.RemoteCallbackList;
102 import android.os.RemoteException;
103 import android.os.ServiceManager;
104 import android.os.StrictMode;
105 import android.os.SystemClock;
106 import android.os.SystemProperties;
107 import android.provider.Settings;
108 import android.text.format.Time;
109 import android.util.EventLog;
110 import android.util.Pair;
111 import android.util.Slog;
112 import android.util.Log;
113 import android.util.PrintWriterPrinter;
114 import android.util.SparseArray;
115 import android.util.TimeUtils;
116 import android.view.Gravity;
117 import android.view.LayoutInflater;
118 import android.view.View;
119 import android.view.WindowManager;
120 import android.view.WindowManagerPolicy;
121
122 import java.io.BufferedInputStream;
123 import java.io.BufferedOutputStream;
124 import java.io.BufferedReader;
125 import java.io.DataInputStream;
126 import java.io.DataOutputStream;
127 import java.io.File;
128 import java.io.FileDescriptor;
129 import java.io.FileInputStream;
91 import android.os.FileObserver;
92 import android.os.FileUtils;
93 import android.os.Handler;
94 import android.os.IBinder;
95 import android.os.IPermissionController;
96 import android.os.Looper;
97 import android.os.Message;
98 import android.os.Parcel;
99 import android.os.ParcelFileDescriptor;
100 import android.os.Process;
101 import android.os.RemoteCallbackList;
102 import android.os.RemoteException;
103 import android.os.ServiceManager;
104 import android.os.StrictMode;
105 import android.os.SystemClock;
106 import android.os.SystemProperties;
107 import android.provider.Settings;
108 import android.text.format.Time;
109 import android.util.EventLog;
110 import android.util.Pair;
111 import android.util.Slog;
112 import android.util.Log;
113 import android.util.PrintWriterPrinter;
114 import android.util.SparseArray;
115 import android.util.TimeUtils;
116 import android.view.Gravity;
117 import android.view.LayoutInflater;
118 import android.view.View;
119 import android.view.WindowManager;
120 import android.view.WindowManagerPolicy;
121
122 import java.io.BufferedInputStream;
123 import java.io.BufferedOutputStream;
124 import java.io.BufferedReader;
125 import java.io.DataInputStream;
126 import java.io.DataOutputStream;
127 import java.io.File;
128 import java.io.FileDescriptor;
129 import java.io.FileInputStream;
根據上面,就可以看出,此類在是server層下的,當然,也是屬於framework層下的,上面導入來哪些類來實現呢,從導入的情況可以發現有電池狀態實現(BatteryStatesImpl),R,進程狀態(ProcessState),屬性緩存(AttributeCache),意圖接收(IntentResolver),進程哈系(ProcessMap),系統服務(SystemService),觀察狗(WatchDog),Activity棧狀態(ActivityState),窗口管理服務(WindowManagerService),卵化器(Zygote),Activity,Activity管理(ActivityManager),Activity管理本地類(ActivityManagerNative),Activity線程(ActivityThread),警告對話框(AlertDialog),App全局(AppGlobals),應用錯誤報告(ApplicationErrorReport),對話框(Dialog),Activity控制接口(IActivityController),Activity觀察接口(IActivityWather),應用線程接口(IApplicationThread),儀器觀察接口(IStrumentationObserver),通知管理接口(INotificationManager),進程關注接口(IProcessObserver),服務鏈接接口(IServerConnection),縮略圖接收器接口(IThumbnailReceiver),儀器(Instrumentation),通知(Notification),通知管理(NotificationManager),有待意圖(PindingINtent),服務(Service),備份管理接口(IBackupManager),Activity沒有找到異常(ActivityNotFoundException),廣播接收者(BroadcastReceiver),組建回調2(ComponentCallbacks2),組建名稱(ComponentName),內容分解(ContentResolver),上下文(Context),對話框接口(DialogInterface),意圖(Intent),意圖過濾器(IntentFilter),意圖接收接口(IIntentReceiver),意圖發送接口(IIntentSender),意圖發送(IntentSender),Activity信息(ActivityInfo),應用信息(ApplicationInfo),配置信息(ConfigurationInfo),包數據關注接口(IPackageDataObserver),包管理接口(IPackageManager),儀器信息(InstrmatationInfo),包信息(PackageInfo),包管理(PackageManager),路徑權限(PathPermission),提供者信息(ProviderInfo),解析器信息(ResolveInfo),服務信息(ServiceInfo),名稱沒有發現異常(NameNotFoundException),兼容性信息(CompatibilityInfo),配置(Configuration),位圖(Bitmap),代理(Proxy),代理屬性(ProxyProperties),統一資源標誌符(Uri),幫第器(binder),建立(Build),捆(Bundle),調試(Debug),下拉框管理器(DropBoxManager),環境變量(Environment),文件關注(FileObserver),文件單元(FileUtils),處理器(Handler),捆綁器接口(IBinder),權限控制接口(IPermissionController),論尋(Looper),消息(Message),郵包(Parcel),郵包文件描述(ParcelFileDescript),進程(Process),遠程回調列表(RemoteCallBackList),遠程異常(RemoteException),服務管理(ServiceManager),嚴格模式(StrictMode),SystemClock(系統時鐘),系統屬性(SystemProperties),設置(Settings),時間(Time),事件日誌(EventLog),一對(Pair),系統日誌(SLog),日誌(Log),輸入打印(PrintWriterPrinter),數組解析(ParseArray),時間單元(TImeUtils),重力(Gravity),佈局填充(LayoutInfalter),視圖(View),窗口管理(WindowManager),窗口管理策略(WindowManagerPolicy),輸入流緩衝(BufferedInputStream),輸出流緩衝(BufferedOutputStream),緩衝讀取(BufferedReader),數據輸入流(DataInputStream),數據輸出流(DataOutputStream),文件(File),文件描述(FileDescriptor),文件輸入流(FileInputStream),文件沒有發現異常(FileNotFoundException),文件輸出流(FileOutputStream),IO異常(IOException),讀取輸入流(InputStreamReader),輸入打印(PrintWriter),字符串寫入(StringWriter),非狀態異常(IllegalStateException),弱引用(WeakReference),數組列表(ArrayList),集合(Collections),比較(Comparator),哈系映射(HashMap),哈系集合(HashSet),迭代(Iterator),列表(List),語言環境(Locale),映射(Map),集合(Set),原子布爾(AtomicBoolean),原子長(AtimicLong).
OK,以上就是需要導入的相關類,可能有的人看到這裏就有點暈了,其實際你看到這裏並能很清晰的知道相干類的話,那說明你真的很懂了,畢竟這個類是一個重量級的類,容量達到了608k,代碼標準行數達到來14382行,看看上面導入的類就知道這個類不可忽視,好來我們知道了上面,現在來具體分析下它的內部運行原理吧,在這裏需要注意:
public class ActivityManagerService extends ActivityManagerNative implements Watchdog.Monitor,BatteryStatesImpl.BatteryCallBack{},這裏它繼承了本地窗口管理類,並且同時實現了觀察狗的監聽器與電池狀態的實現回調,接下來,看首先聲明的一些相關變量:
static final String TAG = "ActivityManager";
154 static final boolean DEBUG = false;
155 static final boolean localLOGV = DEBUG;
156 static final boolean DEBUG_SWITCH = localLOGV || false;
157 static final boolean DEBUG_TASKS = localLOGV || false;
158 static final boolean DEBUG_PAUSE = localLOGV || false;
159 static final boolean DEBUG_OOM_ADJ = localLOGV || false;
160 static final boolean DEBUG_TRANSITION = localLOGV || false;
161 static final boolean DEBUG_BROADCAST = localLOGV || false;
162 static final boolean DEBUG_BROADCAST_LIGHT = DEBUG_BROADCAST || false;
163 static final boolean DEBUG_SERVICE = localLOGV || false;
164 static final boolean DEBUG_SERVICE_EXECUTING = localLOGV || false;
165 static final boolean DEBUG_VISBILITY = localLOGV || false;
166 static final boolean DEBUG_PROCESSES = localLOGV || false;
167 static final boolean DEBUG_PROVIDER = localLOGV || false;
168 static final boolean DEBUG_URI_PERMISSION = localLOGV || false;
169 static final boolean DEBUG_USER_LEAVING = localLOGV || false;
170 static final boolean DEBUG_RESULTS = localLOGV || false;
171 static final boolean DEBUG_BACKUP = localLOGV || false;
172 static final boolean DEBUG_CONFIGURATION = localLOGV || false;
173 static final boolean DEBUG_POWER = localLOGV || false;
174 static final boolean DEBUG_POWER_QUICK = DEBUG_POWER || false;
175 static final boolean VALIDATE_TOKENS = false;
176 static final boolean SHOW_ACTIVITY_START_TIME = true;
177
178 // Control over CPU and battery monitoring.
179 static final long BATTERY_STATS_TIME = 30*60*1000; // write battery stats every 30 minutes.
180 static final boolean MONITOR_CPU_USAGE = true;
181 static final long MONITOR_CPU_MIN_TIME = 5*1000; // don't sample cpu less than every 5 seconds.
182 static final long MONITOR_CPU_MAX_TIME = 0x0fffffff; // wait possibly forever for next cpu sample.
183 static final boolean MONITOR_THREAD_CPU_USAGE = false;
// The flags that are set for all calls we make to the package manager.
186 static final int STOCK_PM_FLAGS = PackageManager.GET_SHARED_LIBRARY_FILES;
187
188 private static final String SYSTEM_DEBUGGABLE = "ro.debuggable";
189
190 static final boolean IS_USER_BUILD = "user".equals(Build.TYPE);
191
192 // Maximum number of recent tasks that we can remember.
193 static final int MAX_RECENT_TASKS = 20;
194
195 // Amount of time after a call to stopAppSwitches() during which we will
196 // prevent further untrusted switches from happening.
197 static final long APP_SWITCH_DELAY_TIME = 5*1000;
198
199 // How long we wait for a launched process to attach to the activity manager
200 // before we decide it's never going to come up for real.
201 static final int PROC_START_TIMEOUT = 10*1000;
202
203 // How long we wait for a launched process to attach to the activity manager
204 // before we decide it's never going to come up for real, when the process was
205 // started with a wrapper for instrumentation (such as Valgrind) because it
206 // could take much longer than usual.
207 static final int PROC_START_TIMEOUT_WITH_WRAPPER = 300*1000;
208
209 // How long to wait after going idle before forcing apps to GC.
210 static final int GC_TIMEOUT = 5*1000;
211
212 // The minimum amount of time between successive GC requests for a process.
213 static final int GC_MIN_INTERVAL = 60*1000;
214
215 // The rate at which we check for apps using excessive power -- 15 mins.
216 static final int POWER_CHECK_DELAY = (DEBUG_POWER_QUICK ? 2 : 15) * 60*1000;
217
218 // The minimum sample duration we will allow before deciding we have
219 // enough data on wake locks to start killing things.
220 static final int WAKE_LOCK_MIN_CHECK_DURATION = (DEBUG_POWER_QUICK ? 1 : 5) * 60*1000;
// The minimum sample duration we will allow before deciding we have
223 // enough data on CPU usage to start killing things.
224 static final int CPU_MIN_CHECK_DURATION = (DEBUG_POWER_QUICK ? 1 : 5) * 60*1000;
225
226 // How long we allow a receiver to run before giving up on it.
227 static final int BROADCAST_TIMEOUT = 10*1000;
228
229 // How long we wait for a service to finish executing.
230 static final int SERVICE_TIMEOUT = 20*1000;
231
232 // How long a service needs to be running until restarting its process
233 // is no longer considered to be a relaunch of the service.
234 static final int SERVICE_RESTART_DURATION = 5*1000;
235
236 // How long a service needs to be running until it will start back at
237 // SERVICE_RESTART_DURATION after being killed.
238 static final int SERVICE_RESET_RUN_DURATION = 60*1000;
239
240 // Multiplying factor to increase restart duration time by, for each time
241 // a service is killed before it has run for SERVICE_RESET_RUN_DURATION.
242 static final int SERVICE_RESTART_DURATION_FACTOR = 4;
243
244 // The minimum amount of time between restarting services that we allow.
245 // That is, when multiple services are restarting, we won't allow each
246 // to restart less than this amount of time from the last one.
247 static final int SERVICE_MIN_RESTART_TIME_BETWEEN = 10*1000;
248
249 // Maximum amount of time for there to be no activity on a service before
250 // we consider it non-essential and allow its process to go on the
251 // LRU background list.
252 static final int MAX_SERVICE_INACTIVITY = 30*60*1000;
253
254 // How long we wait until we timeout on key dispatching.
255 static final int KEY_DISPATCHING_TIMEOUT = 5*1000;
// How long we wait until we timeout on key dispatching during instrumentation.
258 static final int INSTRUMENTATION_KEY_DISPATCHING_TIMEOUT = 60*1000;
259
260 static final int MY_PID = Process.myPid();
261
262 static final String[] EMPTY_STRING_ARRAY = new String[0];
263
264 public ActivityStack mMainStack;
上面是相關的一些前奏變量聲明,看聲明良不小哦,畢竟ActivityManagerService爲Android內核的三大核心功能之一,Android內核的三大核心功能分別是:ActivityManagerService,WindowManagerService,View. 我從功能的角度可以知道ActivityManagerService主要有三大功能,即對應用程序的Activity作統一調度,內存管理與進程管理這三大主要功能,我們分析下,應用程序需要運行Activity,首先會通過ActivityManagerService來決定是否啓動該Activity,再就是Activity退出後,所在的進程並不會立即被殺死,而會短時間存活在內存裏,以便在下次啓動時來提升其速度,當然在內存緊張時會對其殺死,這是由ActivityManagerService來完成的,應用程序並不需要對其管理,再就是進程管理,對其進程運行的API信息進行查詢。
下面我們就單一來講下,Activity調度:
思路:對其應用要啓動的Activity必須通過ActivityManagerService來對記錄的指示啓動,當遇到其Activity停止或者啓動需求時,它都會對其記錄進行更新,從而掌握了Activity的啓動與否的狀態信息,在這裏順便來舉一個Activity啓動的幾種方式:一般有四種:1.可在應用程序中調用this.startActivity()來啓動指定的Activity,2.在Home程序中單擊一個圖標來啓動新的Activity,3.按"Back(回退鍵)"來結束當前Activity,從而自動啓動上一個Activity,4.長按Home鍵,顯示出當前列表,從中選擇一個啓動。從上面可知,啓動可分爲順序啓動與前端處理啓動,後面三種分爲前端處理啓動,看來要講的還很多,今天就講到這裏吧,明天繼續。。。