Android4_SRC_分析~ActivityManagerService~圖解(一)

來源:互聯網
上載者:User

OK,從現在開始,我們會一個要點一個要點的把Android目前在開發上比較中要的幾個知識點從源碼開始詳細分析,當然,在這裡,我主要的是分析framework層下的代碼,今天我給分析是關於ActivityManagerService.java這個類,分析內容主要為其內部原理,由於本類代碼比較多,所以我不可能在一個篇幅中全部給細細分析與展示出來,所以我主要分析其內部原理:
好了先看下面:
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),strict 模式(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鍵,顯示出當前列表,從中選擇一個啟動。從上面可知,啟動可分為順序啟動與前端處理啟動,後面三種分為前端處理啟動,看來要講的還很多,今天就講到這裡吧,明天繼續。。。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.