关于android中的Context

提到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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值