Android Context

一、Context介绍

接口有关应用程序环境的全局信息。 这是一个抽象类,其实现由Android系统提供。 它允许访问特定于应用程序的资源和类,以及对诸如启动活动,广播和接收意图等应用程序级操作的上调。

Context是Android开发中的一个重要概念,它提供了一种机制来在应用程序的不同组件之间共享和访问全局信息。Context可以理解为应用程序的上下文环境,它包含了应用程序的各种资源和状态信息。

在Android中,Context是一个抽象类,它有多个具体的子类,如Activity、Service、Application等。这些子类都继承了Context类,并且拥有了Context提供的所有功能。

Context的主要功能之一是取消goroutine的执行。通过Context,我们可以在应用程序的不同组件之间传递和取消任务的执行。例如,在一个Activity中启动一个异步任务,在任务执行过程中,如果用户退出了该Activity,我们可以使用Context提供的方法来取消任务的执行,以避免资源的浪费。

此外,Context还提供了访问应用程序的资源和系统服务的方法。通过Context,我们可以获取应用程序的资源,如字符串、颜色、尺寸等。同时,我们还可以通过Context获取系统服务,如网络连接、传感器、数据库等。

总结起来,Context是Android开发中非常重要的一个概念,它提供了应用程序的上下文环境,可以用于共享和访问全局信息,取消任务的执行,访问应用程序的资源和系统服务等。

二、Context相关接口

java/android/content/res

XmlResourceParser

The XML parsing interface returned for an XML resource.

XmlResourceParser是Android中用于解析XML资源的接口。它提供了一种方便的方式来读取和解析XML文件。

XmlResourceParser文件路径:

frameworks/base/core/java/android/content/res/XmlResourceParser.java

XmlResourceParser定义:

public interface XmlResourceParser extends XmlPullParser, AttributeSet, AutoCloseable {}

三、Context相关类

Android Context包括Context、ContextImpl、ContextWrapper、ContextThemeWrapper类,它们的关系如下:

Context类是一个抽象类,具体实现在ContextImpl类中;而ContextWrapper是Context的一个包装类,其里面所有的方法实现都是调用其内部mBase变量的方法,而mBase就是ContextImpl对象;

然而ContextWrapper还有一个ContextThemeWrapper子类,该类中扩展了主题相关的方法。有继承关系图可以看出,Application和Service是继承自ContextWrapper,而Activity是继承自ContextThemeWrapper;然而Service和Applicaton都和UI界面并没有卵关系!因此他们继承自ContextWrapper。所以Activity,Application,Service其实都关联着一个mBase变量,而mBase变量是ContextImpl对象的赋值,也是真正实现抽象类Context的地方。虽然Activity,Application,Service都有一个共同的祖先Context,但是他们自己本身持有的Context对象是不同的,不同Context的应用场景如下图:

java/android/content

Context

接口有关应用程序环境的全局信息。 这是一个抽象类,其实现由Android系统提供。 它允许访问特定于应用程序的资源和类,以及对诸如启动活动,广播和接收意图等应用程序级操作的上调。

Context是一个抽象类,它有多个具体的子类,如Activity、Service、Application等。这些子类都继承了Context类,并且拥有了Context提供的所有功能。

Context文件路径:

frameworks/base/core/java/android/content/Context.java

Context定义:

public abstract class Context {}

Context方法:

public abstract boolean bindService(Intent service, ServiceConnection conn, int flags):连接到应用程序服务,根据需要创建它。
public abstract int checkCallingOrSelfPermission(String permission):确定IPC的调用过程 还是您已被授予特定权限。
public abstract int checkCallingOrSelfUriPermission( Uri uri, int modeFlags):确定IPC的调用进程 或您是否被授予访问特定URI的权限。
public abstract int checkCallingPermission(String permission):确定您正在处理的IPC的调用进程是否已被授予特定权限。
public abstract int checkCallingUriPermission(Uri uri, int modeFlags):确定调用进程和用户标识是否已被授予访问特定URI的权限。
public abstract int checkPermission(String permission, int pid, int uid):确定是否允许给定的权限用于系统中运行的特定进程和用户标识。
public abstract int checkSelfPermission(String permission):确定您是否已获得特定权限。
public abstract int checkUriPermission(Uri uri, String readPermission, String writePermission, int pid, int uid, int modeFlags):检查Uri和普通权限。
public abstract int checkUriPermission(Uri uri, int pid, int uid, int modeFlags):确定是否已授予特定进程和用户标识访问特定URI的权限。
public abstract Context createConfigurationContext(Configuration overrideConfiguration):为当前上下文返回一个新的Context对象,但其资源被调整以匹配给定的配置。
public abstract Context createDeviceProtectedStorageContext():为当前上下文返回一个新的Context对象,但其存储API由受设备保护的存储支持。
public abstract Context createDisplayContext(Display display):为当前上下文返回一个新的Context对象,但其资源被调整为匹配给定Display的指标。
public abstract Context createPackageContext(String packageName, int flags):为给定的应用程序名称返回一个新的Context对象。
public abstract String[] databaseList():返回一个字符串数组,命名与此Context的应用程序包关联的专用数据库。
public abstract boolean deleteDatabase(String name):删除与此Context的应用程序包关联的现有私有SQLiteDatabase。
public abstract boolean deleteFile(String name):删除与此Context的应用程序包关联的给定私人文件。
public abstract boolean deleteSharedPreferences(String name):删除现有的共享首选项文件。
public abstract void enforceCallingOrSelfPermission(String permission, String message):如果您或您正在处理的IPC的调用过程都未获得特定许可,则抛出 SecurityException 。
public abstract void enforceCallingOrSelfUriPermission(Uri uri, int modeFlags, String message):如果IPC的调用进程 或您未被授予访问特定URI的权限,则抛出 SecurityException 。
public abstract void enforceCallingPermission(String permission, String message):如果您正在处理的IPC的调用过程没有被授予特定权限,则抛出 SecurityException 。
public abstract void enforceCallingUriPermission(Uri uri, int modeFlags, String message):如果调用进程和用户标识没有被授予访问特定URI的权限,则抛出 SecurityException 。
public abstract void enforcePermission(String permission, int pid, int uid, String message):如果在系统中运行的特定进程和用户标识不允许给定权限,则抛出 SecurityException 。
public abstract void enforceUriPermission(Uri uri, String readPermission, String writePermission, int pid, int uid, int modeFlags, String message):强制执行Uri和普通权限。
public abstract void enforceUriPermission(Uri uri, int pid, int uid, int modeFlags, String message):如果某个特定的进程和用户标识没有被授予访问特定URI的权限,则抛出 SecurityException 。
public abstract String[] fileList():返回一个字符串数组,命名与此Context的应用程序包关联的私有文件。
public abstract Context getApplicationContext():返回当前进程的单个全局应用程序对象的上下文。
public abstract ApplicationInfo getApplicationInfo():返回此上下文包的完整应用程序信息。
public abstract AssetManager getAssets():返回应用程序包的AssetManager实例。
public abstract File getCacheDir():返回文件系统上特定于应用程序的缓存目录的绝对路径。
public abstract ClassLoader getClassLoader():返回一个你可以用来检索这个包中的类的类加载器。
public abstract File getCodeCacheDir():返回专用于存储缓存代码的文件系统上特定于应用程序的缓存目录的绝对路径。
public final int getColor(int id):返回与特定资源ID关联的颜色并为当前主题设计样式。
public final ColorStateList getColorStateList(int id):返回与特定资源ID关联的颜色状态列表,并为当前主题设计风格。
public abstract ContentResolver getContentResolver():为你的应用程序包返回一个ContentResolver实例。
public abstract File getDataDir():返回存储属于此应用程序的所有私人文件的文件系统上目录的绝对路径。
public abstract File getDatabasePath(String name):返回存储使用 openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory)创建的数据库的文件系统上的绝对路径。
public abstract File getDir(String name, int mode):根据需要检索,创建应用程序可以放置自己的自定义数据文件的新目录。
public final Drawable getDrawable(int id):返回与特定资源ID关联的可绘制对象,并为当前主题创建样式。
public abstract File getExternalCacheDir():返回应用程序可以放置其拥有的缓存文件的主共享/外部存储设备上特定于应用程序的目录的绝对路径。
public abstract File[] getExternalCacheDirs():返回应用程序可以放置它拥有的缓存文件的所有共享/外部存储设备上特定于应用程序的目录的绝对路径。
public abstract File getExternalFilesDir(String type):返回应用程序可以放置其拥有的持久性文件的主共享/外部存储设备上目录的绝对路径。
public abstract File[] getExternalFilesDirs(String type):返回应用程序可以放置其拥有的持久性文件的所有共享/外部存储设备上特定于应用程序的目录的绝对路径。
public abstract File[] getExternalMediaDirs():返回应用程序可放置媒体文件的所有共享/外部存储设备上特定于应用程序的目录的绝对路径。
public abstract File getFileStreamPath(String name):返回存储使用 openFileOutput(String, int)创建的文件的文件系统上的绝对路径。
public abstract File getFilesDir():返回存储使用 openFileOutput(String, int)创建的文件的文件系统上目录的绝对路径。
public abstract Looper getMainLooper():返回当前进程主线程的Looper。
public abstract File getNoBackupFilesDir():返回类似于 getFilesDir()的文件系统上目录的绝对路径。
public abstract File getObbDir():返回此应用程序的OBB文件(如果有)的主要共享/外部存储目录。
public abstract File[] getObbDirs():返回应用程序的OBB文件(如果有)的所有共享/外部存储设备上的应用程序特定目录的绝对路径。
public abstract String getPackageCodePath():返回此上下文的主要Android包的完整路径。
public abstract PackageManager getPackageManager():返回PackageManager实例以查找全局包信息。
public abstract String getPackageName():返回此应用程序包的名称。
public abstract String getPackageResourcePath():返回此上下文的主要Android包的完整路径。
public abstract Resources getResources():返回应用程序包的资源实例。
public abstract SharedPreferences getSharedPreferences(String name, int mode):检索并保存首选项文件'name'的内容,返回一个SharedPreferences,通过它可以检索和修改其值。
public final String getString(int resId, Object... formatArgs):从应用程序包的默认字符串表中返回一个本地化的格式化字符串,替换 Formatter和 format(String, Object...)定义的格式参数。
public final String getString(int resId):从应用程序包的默认字符串表中返回一个本地化的字符串。
public final <T> T getSystemService(Class<T> serviceClass):按类返回句柄到系统级服务。
public abstract Object getSystemService(String name):按名称将句柄返回到系统级服务。
public abstract String getSystemServiceName(Class<?> serviceClass):获取由指定的类表示的系统级服务的名称。
public final CharSequence getText(int resId):从应用程序包的默认字符串表中返回一个本地化的,风格化的CharSequence。
public abstract Resources.Theme getTheme():返回与此上下文关联的主题对象。
public abstract void grantUriPermission(String toPackage, Uri uri, int modeFlags):无论该软件包是否具有访问Uri内容提供者的一般权限,都可以授予访问另一个软件包的特定Uri的权限。
public abstract boolean isDeviceProtectedStorage():指示此Context的存储API是否受设备保护存储支持。
public boolean isRestricted():指示此上下文是否受限制。
public abstract boolean moveDatabaseFrom(Context sourceContext, String name):将现有数据库文件从给定的源存储上下文移动到此上下文。
public abstract boolean moveSharedPreferencesFrom(Context sourceContext, String name):将现有的共享首选项文件从给定的源存储上下文移至此上下文。
public final TypedArray obtainStyledAttributes(AttributeSet set, int[] attrs):在此Context的主题中检索样式化属性信息。
public final TypedArray obtainStyledAttributes(AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes):在此Context的主题中检索样式化属性信息
public final TypedArray obtainStyledAttributes(int resid, int[] attrs):在此Context的主题中检索样式化属性信息。
public final TypedArray obtainStyledAttributes(int[] attrs):在此Context的主题中检索样式化属性信息。
public abstract FileInputStream openFileInput(String name):打开与此Context的应用程序包关联的私人文件以供阅读。
public abstract FileOutputStream openFileOutput(String name, int mode):打开与此Context的应用程序包关联的私有文件以进行写入。
public abstract SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler):打开与此Context的应用程序包关联的新私有SQLiteDatabase。
public abstract SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory):打开与此Context的应用程序包关联的新私有SQLiteDatabase。
public void registerComponentCallbacks(ComponentCallbacks callback):将新的 ComponentCallbacks添加到Context的基本应用程序中,将在与ComponentCallbacks活动方法和其他组件调用相同的时间被调用。
public abstract Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter):注册BroadcastReceiver以在主要活动线程中运行。
public abstract Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler):注册以接收意图广播,以在 调度程序的上下文中运行。
public abstract void revokeUriPermission(Uri uri, int modeFlags):删除所有权限以访问之前添加了 grantUriPermission(String, Uri, int)的特定内容提供商Uri。
public abstract void sendBroadcast(Intent intent, String receiverPermission):将给定的意图广播给所有感兴趣的BroadcastReceivers,允许强制执行可选的必需权限。
public abstract void sendBroadcast(Intent intent):将给定的意图广播给所有感兴趣的BroadcastReceivers。
public abstract void sendBroadcastAsUser(Intent intent, UserHandle user):版本 sendBroadcast(Intent) ,允许您指定广播将被发送到的用户。
public abstract void sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission):版本 sendBroadcast(Intent, String) ,允许您指定广播将发送到的用户。
public abstract void  sendOrderedBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras):版本 sendBroadcast(Intent) ,允许您从广播接收数据。
public abstract void sendOrderedBroadcast(Intent intent, String receiverPermission):将给定的意图广播给所有感兴趣的BroadcastReceivers,一次发送一个,让更多的首选接收者在将广播发送给次优先接收者之前消费广播。
public abstract void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras):版本 sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle) ,允许您指定广播将发送到的用户。
public abstract void setTheme(int resid):为此上下文设置基本主题。
public abstract void startActivities(Intent[] intents, Bundle options):启动多项新活动。
public abstract void startActivities(Intent[] intents):与没有指定选项的 startActivities(Intent[], Bundle)相同。
public abstract void startActivity(Intent intent):与没有指定选项的 startActivity(Intent, Bundle)相同。
public abstract void startActivity(Intent intent, Bundle options):启动一项新活动。
public abstract boolean startInstrumentation(ComponentName className, String profileFile, Bundle arguments):开始执行一个 Instrumentation类。
public abstract void startIntentSender(IntentSender intent, Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags):与没有指定选项的 startIntentSender(IntentSender, Intent, int, int, int, Bundle)相同。
public abstract void startIntentSender(IntentSender intent, Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags, Bundle options):像 startActivity(Intent, Bundle)一样,但需要启动一个IntentSender。
public abstract ComponentName startService(Intent service):请求启动给定的应用程序服务。
public abstract boolean stopService(Intent service):请求停止给定的应用程序服务。
public abstract void unbindService(ServiceConnection conn):断开应用程序服务。
public void unregisterComponentCallbacks(ComponentCallbacks callback):删除以前用 registerComponentCallbacks(ComponentCallbacks)注册的 ComponentCallbacks对象。
public abstract void unregisterReceiver(BroadcastReceiver receiver):取消注册以前注册的BroadcastReceiver。
public ContentCaptureOptions getContentCaptureOptions() :获取此上下文的内容捕获选项,如果未列入允许列表,则为 {@code null}。

ContextWrapper

ContextWrapper是Android中的一个类,它是一个包装类,用于包装一个现有的Context对象,并对其进行扩展或修改。通过继承ContextWrapper类,我们可以在不修改原始Context对象的情况下,对其进行功能增强或定制。

ContextWrapper文件路径:

frameworks/base/core/java/android/content/ContextWrapper.java

ContextWrapper定义:

public class ContextWrapper extends Context {}

ContextWrapper方法:

public @Nullable ContentCaptureOptions getContentCaptureOptions():获取内容捕获选项

ContentCaptureOptions

Content capture options for a given package.

给定包的内容捕获选项。

ContentCaptureOptions文件路径:

frameworks/base/core/java/android/content/ContentCaptureOptions.java

ContentCaptureOptions定义:

public final class ContentCaptureOptions implements Parcelable {}

ContextParams

此类表示有关通过 { Context#createContext} 创建的上下文应如何行为的规则。

ContextParams文件路径:

frameworks/base/core/java/android/content/ContextParams.java

ContextParams定义:

public final class ContextParams {
    public static final class Builder {}
}

java/android/app

ContextImpl

ContextImpl实现了抽象类Context里面的所有方法,获取资源,启动Activity,Service等。值得注意的是在ContextImpl创建的时候就会利用静态区来注册系统的各种服务,因此每个持有Context引用的类都可以通过getSystemService来轻松的获取系统服务了。

ContextImpl文件路径:

frameworks/base/core/java/android/app/ContextImpl.java

ContextImpl定义:

class ReceiverRestrictedContext extends ContextWrapper {}
class ContextImpl extends Context {}

 java/android/view

ContextThemeWrapper

ContextThemeWrapper直接继承与ContextWrapper,间接继承于Context,它是Android中的一个特殊的Context的子类,它用于在应用程序中应用不同的主题。它是一个包装类,通过装饰设计模式将原始的Context对象进行包装,以便在不改变原始Context的情况下,为应用程序提供不同的主题。

ContextThemeWrapper的作用是为应用程序提供一个新的Context对象,该对象具有与原始Context相同的功能,但应用了不同的主题。通过使用ContextThemeWrapper,我们可以在不修改应用程序的其他部分的情况下,为应用程序的不同部分或不同的Activity应用不同的主题。

例如,我们可以使用ContextThemeWrapper来为应用程序的某个Activity应用一个特定的主题,而不影响其他Activity的主题。这对于实现应用程序的不同界面风格或主题切换功能非常有用。

需要注意的是,ContextThemeWrapper只是一个包装类,它本身并不提供任何新的功能或方法。它的作用仅仅是将原始的Context对象进行包装,并提供一个新的Context对象,该对象应用了不同的主题。

ContextThemeWrapper文件路径:

frameworks/base/core/java/android/view/ContextThemeWrapper.java

ContextThemeWrapper定义:

public class ContextThemeWrapper extends ContextWrapper {}

ContextThemeWrapper 方法:

void applyOverrideConfiguration(Configuration overrideConfiguration):调用以在此上下文中设置“覆盖配置” - 这是一种回复应用于上下文的标准配置的一个或多个值的配置。
AssetManager getAssets():返回应用程序包的AssetManager实例。
Resources getResources():返回应用程序包的资源实例。
Object getSystemService(String name):按名称将句柄返回到系统级服务
Resources.Theme getTheme():返回与此上下文关联的主题对象。
void setTheme(int resid):为此上下文设置基本主题。

三、Context流程分析

Context startActivity流程分析

Android13 Context startActivity流程分析-CSDN博客

Context startService流程分析

Android13 Context startService流程分析-CSDN博客​​​​​​​

Context bindService流程分析

Android13 Context bindService流程分析-CSDN博客

Context unbindService流程分析

​​​​​​​Android13 Context unbindService流程分析-CSDN博客

Context stopService流程分析

Android13 Context stopService流程分析-CSDN博客

Context sendBroadcast流程分析

Android13 Context sendBroadcast流程分析-CSDN博客

Context registerReceiver流程分析

Android13 Context registerReceiver流程分析-CSDN博客​​​​​​​

  • 26
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值