1.1 app getAm
import android.app.ActivityManager;
import android.app.ActivityManager.MemoryInfo;
...
public static long getFreeMemory(Context context) {
final MemoryInfo info = new MemoryInfo();
((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryInfo(info);
return info.availMem;
}
1.2 getSystemService过程
//context.getSystemService(Context.ACTIVITY_SERVICE))是获取到ActivityManager对象
@SystemServiceRegistry.java
registerService(Context.ACTIVITY_SERVICE, ActivityManager.class,
new CachedServiceFetcher<ActivityManager>() {
@Override
public ActivityManager createService(ContextImpl ctx) {
return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler());
}});
1.3 ActivityManager.getMemoryInfo(info)
//看下是怎么改变outInfo值的
public void getMemoryInfo(MemoryInfo outInfo) {
try {
getService().getMemoryInfo(outInfo);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
//getService()获取到ACTIVITY_SERVICE的binder对象IActivityManager
/*
*逻辑为:IActivityManagerSingleton是new一个抽象类,需要Override create()方法,调用IActivityManagerSingleton.get()时,
×从Singleton类知返回的是create()方法得到的mInstance对象,这里就是create()的返回IActivityManager binder对象,这就是Android单例模式
*/
public static IActivityManager getService() {
return IActivityManagerSingleton.get();
}
//Singleton<IActivityManager>?这个类是怎么使用get的
private static final Singleton<IActivityManager> IActivityManagerSingleton =
new Singleton<IActivityManager>() {
@Override
protected IActivityManager create() {
final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
final IActivityManager am = IActivityManager.Stub.asInterface(b); //获取IActivityManager对象
return am;
}
};
@frameworks/base/core/java/android/util/Singleton.java
/**
* Singleton helper class for lazily initialization.
*
* Modeled after frameworks/base/include/utils/Singleton.h
*
* @hide
*/
public abstract class Singleton<T> {
private T mInstance;
protected abstract T create();
public final T get() {
synchronized (this) {
if (mInstance == null) {
mInstance = create();
}
return mInstance;
}
}
}
//AMS实现了IActivityManager.Stub接口,因此实际调用的是AMS里面的方法
public class ActivityManagerService extends IActivityManager.Stub
implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
@Override
public void getMemoryInfo(ActivityManager.MemoryInfo outInfo) {
final long homeAppMem = mProcessList.getMemLevel(ProcessList.HOME_APP_ADJ);
final long cachedAppMem = mProcessList.getMemLevel(ProcessList.CACHED_APP_MIN_ADJ);
outInfo.availMem = getFreeMemory();
outInfo.totalMem = getTotalMemory();
outInfo.threshold = homeAppMem;
outInfo.lowMemory = outInfo.availMem < (homeAppMem + ((cachedAppMem-homeAppMem)/2));
outInfo.hiddenAppThreshold = cachedAppMem;
outInfo.secondaryServerThreshold = mProcessList.getMemLevel(
ProcessList.SERVICE_ADJ);
outInfo.visibleAppThreshold = mProcessList.getMemLevel(
ProcessList.VISIBLE_APP_ADJ);
outInfo.foregroundAppThreshold = mProcessList.getMemLevel(
ProcessList.FOREGROUND_APP_ADJ);
}