Android学习笔记2-1--组件0--Context

来源:互联网 发布:淘宝活动时间表 编辑:程序博客网 时间:2024/05/19 23:58

一、Context

1.1 Context简单介绍

Context是维持Android程序中各组件能够正常工作的一个核心功能类。
Context的继承结构
ContextImpl是Context的实现类,而ContextWrapper是Context的包装类。ContextWrapper构造函数中必须包含一个真正的Context引用mBase,且该wrapper提供attachBaseContext用于给该引用指定真正的Context对象。调用该类的方法都会被转向其所包含的真正的Context对象。如Activity在创建时会new一个ContextImpl对象并在attach方法中关联它。

Context类型包括Application、Service和Activity。它们具体Context的功能是由ContextImpl实现的。
Context类型不包括Receiver和Provider,它们所持有的Context是其他地方传过来的。
一个应用程序中:Context数量=Activity数量+Service数量+1。

1.2 Context关键函数

getApplication返回结果为同个全局对象Application,getApplicationContext返回也是Application对象,不过返回类型为Context,看看它实现:

@Override  public Context getApplicationContext() {      return (mPackageInfo != null)?mPackageInfo.getApplication():mMainThread.getApplication();  } 

上面代码中mPackageInfo包含当前应用的包信息、比如包名、应用的安装目录等。第三方应用包信息mPackageInfo不可能为空,getApplication返回的对象和getApplicationContext是同一个。对于系统应用包信息有可能为空,返回的是什么具体就不深入研究。

1) 服务操作

// 返回系统级service句柄public abstract Object getSystemService(String name);public abstract String getSystemServiceName(Class<?> serviceClass);public abstract ClassLoader getClassLoader();public abstract PackageManager getPackageManager();// service之Database和SharedPreferencespublic abstract SQLiteDatabase openOrCreateDatabase(...);public abstract SharedPreferences getSharedPreferences(...);// service之AssetManager和ResourcesManagerpublic abstract AssetManager getAssets();public abstract Resources getResources();// Directorypublic abstract File getDir(String name, int mode);public abstract File getExternalFilesDir(String type);// Displaypublic abstract Display getDisplay();

2) 消息操作

// 返回当前进程的主线程的Looper,此线程分发调用给应用组件(activities, services等)public abstract Looper getMainLooper();public void registerComponentCallbacks(ComponentCallbacks callback) {    getApplicationContext().registerComponentCallbacks(callback);}public void unregisterComponentCallbacks(ComponentCallbacks callback) {    getApplicationContext().unregisterComponentCallbacks(callback);}

3) 组件操作

public abstract PackageManager getPackageManager();public abstract ApplicationInfo getApplicationInfo();public abstract Context getApplicationContext();public abstract ContentResolver getContentResolver();// 这个方法在onCreat之前就开始运行了attachBaseContext()// 启动新的activitypublic abstract void startActivity(Intent intent, Bundle options);public abstract void startActivities(Intent[] intents, Bundle options);// 连接(断开)以及启动(停止)应用服务public abstract boolean bindService(Intent service, ServiceConnection conn, int flags);public abstract void unbindService(ServiceConnection conn);public abstract ComponentName startService(Intent service);public abstract boolean stopService(Intent service);// 注册(注销)BroadcastReceiver,且它将在主activity线程中运行public abstract Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler);public abstract void unregisterReceiver(BroadcastReceiver receiver);// 广播intent,异步机制public abstract void sendBroadcast(Intent intent, String receiverPermission, int appOp);public abstract void sendOrderedBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras);

4) 主题操作

@Overridepublic void setTheme(int resid) {    mThemeResource = resid;    initializeTheme();}@Overridepublic Resources.Theme getTheme() {    if (mTheme != null) {        return mTheme;    }    mThemeResource = Resources.selectDefaultTheme(mThemeResource,    getApplicationInfo().targetSdkVersion);    initializeTheme();    return mTheme;}

二、ComponentCallbacks2

ComponentCallbacks2(继承于ComponentCallbacks)是一个接口,主要是常用的Application、Activity、Service、ContentProvider等应用程序组件的回调API集。

// 当系统内存不足时,可以通过实现该方法去释放内存或不需要的资源,系统会自动调用该方法void onLowMemory();// 当系统内存不足时,所有后台程序(不是指后台运行的进程)都被杀死时,系统会自动调用该方法void onTrimMemory(int level);// 当设备配置发生改变,而所在组件还在运行时,系统就会调用该方法去运行自定义的代码(需要manifest设置)void onConfigurationChanged(Configuration newConfig);

参考:

[1] ConcurrentHashMap介绍

[2] Android中Context用法详解

[3] Android源码分析-全面理解Context