提到android,我们首先想到的是Activity,Service,BroadcastReceiver,ContentProvider,然而在使用这些组件的时候,却离不开Context今天就来研究一下Context。

1.Context是什么

Context是一个抽象类,位于frameworks\base\core\java\android\content目录下,它是一个提供app环境的全局信息的接口,可以通过Context使用app的资源,类,例如启动Activity,启动Service,发送广播等,主要子类是ContextImpl,位于frameworks\base\core\java\android\app目录下。

2.Context里面有哪些数据

Context里定义了一些文件创建的模式常量,例如public static final int MODE_PRIVATE = 0x0000; 如果创建文件时使用该模式,那么只能是app或者跟该app拥有相同的user ID的app才能访问该文件;还有SharedPreference, DateBase相关的一些常量,因为是上层抽象类,所以更加注重文件数据相关的操作。其实更多的数据是在子类ContextImpl中,例如app包相关的信息mPackageInfo,我们常用它来获取包名。还有Resources mResources;我们借助它来获取app的资源信息,数据库等。

3.Context能提供什么操作

Context提供的操作多达上百个,主要是子类是ContextImpl来实现的,这里简单提几个常用的方法。

(1)public Context getApplicationContext();主要是获取app相关的信息

(2)public void setTheme(int resId);设置主题

(3)public String getPackageName();获取包名

(4)public SharedPreferences getSharedPreferences(String name, int mode);获取SharedPreferences,非常轻量级的数据,如开关等。

(5)public FileInputStream openFileInput(String name)
public FileOutputStream openFileOutput(String name, int mode)文件的输入输出流

(6)public File getExternalFilesDir(String type)获取外部存储路径

(7)public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory)创建SQLite数据库。当然还有其他SQLite数据库相关的函数.

(8)public void startActivity(Intent intent)启动一个Activity。

(9)public void sendBroadcast(Intent intent)发送广播,这个是普通第三方app使用的方法;当然如果在framework中或者是系统预装的app,更常见的发送广播的方法是public void sendBroadcastAsUser(Intent intent, UserHandle user)

(10)public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) 注册广播,当然别忘了调用public void unregisterReceiver(BroadcastReceiver receiver),否则会导致广播泄露。

(11)public ComponentName startService(Intent service)启动一个服务,成对的有public boolean stopService(Intent service)。

(12)public boolean bindService(Intent service, ServiceConnection conn,
            int flags)绑定的方式启动服务,与服务通信,成对的有public void unbindService(ServiceConnection conn)

(13)public Object getSystemService(String name)获取系统服务,例如可以借助它来获取WifiManager, ConnectivityManager这些系统服务。

(14)public int checkPermission(String permission, int pid, int uid, IBinder callerToken)检查app是否具有某些权限。

(15)public Display getDisplay()获取显示相关的信息。

4.如何获取一个Context对象

(1)在Acitivity中如何获取一个Context,其实Acitivity本身就是Context的子类,所以Activity对象就是一个Context对象,它们继承链是这样的Aciticty->ContextThemeWrapper->ContextWrapper->Context

(2)在Service中获取Context对象,Service是ContextWrapper的子类,所以Service对象也是一个Context对象。

(3)对于广播,没有Context对象就无法使用

(4)对于ContentProvider一般会有自己的方法去获取context。

更多相关文章

  1. Android(安卓)ListView的item点击无响应的解决方法
  2. 解决导入Android例子时“Unable to resolve target 'android-x'
  3. Android(安卓)Service 系统服务
  4. Android应用程序获取ROOT权限的方法
  5. Android(安卓)中的图形图像的渲染
  6. 如果获取android源码
  7. android 已知资源名称获取资源ID
  8. Android获取网速和下载速度
  9. 类和 Json对象

随机推荐

  1. Android Canvas和Paint
  2. 控件布局_TableLayout
  3. Android UI 优化
  4. android 资源文件
  5. Android 系统联系人相关URI
  6. Android(安卓)kotlin和java反编译后的sma
  7. Android(安卓)AppWidget一个简单教程
  8. Inflate()---Android之Inflate()方法用途
  9. Android动态加载相关文章记录
  10. Android Bitmap转换