转载:http://blog.csdn.net/guolin_blog/article/details/47028975
前几篇文章,我也是费劲心思写了一个ListView系列的三部曲,虽然在内容上可以说是绝对的精华,但是很多朋友都表示看不懂。好吧,这个系列不仅是把大家给难倒了,也确实是把我给难倒了,之前为了写瀑布流ListView的Demo就写了大半个月的时间。那么本篇文章我们就讲点轻松的东西,不去分析那么复杂的源码了,而是来谈一谈大家都熟知的Context。
Context相信所有的Android开发人员基本上每天都在接触,因为它太常见了。但是这并不代表Context没有什么东西好讲的,实际上Context有太多小的细节并不被大家所关注,那么今天我们就来学习一下那些你所不知道的细节。
Context类型
我们知道,Android应用都是使用Java语言来编写的,那么大家可以思考一下,一个Android程序和一个Java程序,他们最大的区别在哪里?划分界限又是什么呢?其实简单点分析,Android程序不像Java程序一样,随便创建一个类,写个main()方法就能跑了,而是要有一个完整的Android工程环境,在这个环境下,我们有像Activity、Service、BroadcastReceiver等系统组件,而这些组件并不是像一个普通的Java对象new一下就能创建实例的了,而是要有它们各自的上下文环境,也就是我们这里讨论的Context。可以这样讲,Context是维持Android程序中各组件能够正常工作的一个核心功能类。
下面我们来看一下Context的继承结构:
Context的继承结构还是稍微有点复杂的,可以看到,直系子类有两个,一个是ContextWrapper,一个是ContextImpl。那么从名字上就可以看出,ContextWrapper是上下文功能的封装类,而ContextImpl则是上下文功能的实现类。而ContextWrapper又有三个直接的子类,ContextThemeWrapper、Service和Application。其中,ContextThemeWrapper是一个带主题的封装类,而它有一个直接子类就是Activity。
那么在这里我们至少看到了几个所比较熟悉的面孔,Activity、Service、还有Application。由此,其实我们就已经可以得出结论了,Context一共有三种类型,分别是Application、Activity和Service。这三个类虽然分别各种承担着不同的作用,但它们都属于Context的一种,而它们具体Context的功能则是由ContextImpl类去实现的。
那么Context到底可以实现哪些功能呢?这个就实在是太多了,弹出Toast、启动Activity、启动Service、发送广播、操作数据库等等等等都需要用到Context。由于Context的具体能力是由ContextImpl类去实现的,因此在绝大多数场景下,Activity、Service和Application这三种类型的Context都是可以通用的。不过有几种场景比较特殊,比如启动Activity,还有弹出Dialog。出于安全原因的考虑,Android是不允许Activity或Dialog凭空出现的,一个Activity的启动必须要建立在另一个Activity的基础之上,也就是以此形成的返回栈。而Dialog则必须在一个Activity上面弹出(除非是System Alert类型的Dialog),因此在这种场景下,我们只能使用Activity类型的Context,否则将会出错。
Context数量
那么一个应用程序中到底有多少个Context呢?其实根据上面的Context类型我们就已经可以得出答案了。Context一共有Application、Activity和Service三种类型,因此一个应用程序中Context数量的计算公式就可以这样写:
上面的1代表着Application的数量,因为一个应用程序中可以有多个Activity和多个Service,但是只能有一个Application。
Application Context的设计
基本上每一个应用程序都会有一个自己的Application,并让它继承自系统的Application类,然后在自己的Application类中去封装一些通用的操作。其实这并不是Google所推荐的一种做法,因为这样我们只是把Application当成了一个通用工具类来使用的,而实际上使用一个简单的单例类也可以实现同样的功能。但是根据我的观察,有太多的项目都是这样使用Application的。当然这种做法也并没有什么副作用,只是说明还是有不少人对于Application理解的还有些欠缺。那么这里我们先来对Application的设计进行分析,讲一些大家所不知道的细节,然后再看一下平时使用Application的问题。
首先新建一个MyApplication并让它继承自Application,然后在AndroidManifest.xml文件中对MyApplication进行指定,如下所示:
指定完成后,当我们的程序启动时Android系统就会创建一个MyApplication的实例,如果这里不指定的话就会默认创建一个Application的实例。
前面提到过,现在很多的Application都是被当作通用工具类来使用的,那么既然作为一个通用工具类,我们要怎样才能获取到它的实例呢?如下所示:
可以看到,代码很简单,只需要调用getApplication()方法就能拿到我们自定义的Application的实例了,打印结果如下所示:
那么除了getApplication()方法,其实还有一个getApplicationContext()方法,这两个方法看上去好像有点关联,那么它们的区别是什么呢?我们将代码修改一下:
同样,我们把getApplicationContext()的结果打印了出来,现在重新运行代码,结果如下图所示:
咦?好像打印出的结果是一样的呀,连后面的内存地址都是相同的,看来它们是同一个对象。其实这个结果也很好理解,因为前面已经说过了,Application本身就是一个Context,所以这里获取getApplicationContext()得到的结果就是MyApplication本身的实例。
那么有的朋友可能就会问了,既然这两个方法得到的结果都是相同的,那么Android为什么要提供两个功能重复的方法呢?实际上这两个方法在作用域上有比较大的区别。getApplication()方法的语义性非常强,一看就知道是用来获取Application实例的,但是这个方法只有在Activity和Service中才能调用的到。那么也许在绝大多数情况下我们都是在Activity或者Service中使用Application的,但是如果在一些其它的场景,比如BroadcastReceiver中也想获得Application的实例,这时就可以借助getApplicationContext()方法了,如下所示:
也就是说,getApplicationContext()方法的作用域会更广一些,任何一个Context的实例,只要调用getApplicationContext()方法都可以拿到我们的Application对象。
那么更加细心的朋友会发现,除了这两个方法之外,其实还有一个getBaseContext()方法,这个baseContext又是什么东西呢?我们还是通过打印的方式来验证一下:
哦?这次得到的是不同的对象了,getBaseContext()方法得到的是一个ContextImpl对象。这个ContextImpl是不是感觉有点似曾相识?回去看一下Context的继承结构图吧,ContextImpl正是上下文功能的实现类。也就是说像Application、Activity这样的类其实并不会去具体实现Context的功能,而仅仅是做了一层接口封装而已,Context的具体功能都是由ContextImpl类去完成的。那么这样的设计到底是怎么实现的呢?我们还是来看一下源码吧。因为Application、Activity、Service都是直接或间接继承自ContextWrapper的,我们就直接看ContextWrapper的源码,如下所示:
由于ContextWrapper中的方法还是非常多的,我就进行了一些筛选,只贴出来了部分方法。那么上面的这些方法相信大家都是非常熟悉的,getResources()、getPackageName()、getSystemService()等等都是我们经常要用到的方法。那么所有这些方法的实现又是什么样的呢?其实所有ContextWrapper中方法的实现都非常统一,就是调用了mBase对象中对应当前方法名的方法。
那么这个mBase对象又是什么呢?我们来看第16行的attachBaseContext()方法,这个方法中传入了一个base参数,并把这个参数赋值给了mBase对象。而attachBaseContext()方法其实是由系统来调用的,它会把ContextImpl对象作为参数传递到attachBaseContext()方法当中,从而赋值给mBase对象,之后ContextWrapper中的所有方法其实都是通过这种委托的机制交由ContextImpl去具体实现的,所以说ContextImpl是上下文功能的实现类是非常准确的。
那么另外再看一下我们刚刚打印的getBaseContext()方法,在第26行。这个方法只有一行代码,就是返回了mBase对象而已,而mBase对象其实就是ContextImpl对象,因此刚才的打印结果也得到了印证。
使用Application的问题
虽说Application的用法确实非常简单,但是我们平时的开发工作当中也着实存在着不少Application误用的场景,那么今天就来看一看有哪些比较容易犯错的地方是我们应该注意的。
Application是Context的其中一种类型,那么是否就意味着,只要是Application的实例,就能随时使用Context的各种方法呢?我们来做个实验试一下就知道了:
这是一个非常简单的自定义Application,我们在MyApplication的构造方法当中获取了当前应用程序的包名,并打印出来。获取包名使用了getPackageName()方法,这个方法就是由Context提供的。那么上面的代码能正常运行吗?跑一下就知道了,你将会看到如下所示的结果:
应用程序一启动就立刻崩溃了,报的是一个空指针异常。看起来好像挺简单的一段代码,怎么就会成空指针了呢?但是如果你尝试把代码改成下面的写法,就会发现一切正常了:
运行结果如下所示:
在构造方法中调用Context的方法就会崩溃,在onCreate()方法中调用Context的方法就一切正常,那么这两个方法之间到底发生了什么事情呢?我们重新回顾一下ContextWrapper类的源码,ContextWrapper中有一个attachBaseContext()方法,这个方法会将传入的一个Context参数赋值给mBase对象,之后mBase对象就有值了。而我们又知道,所有Context的方法都是调用这个mBase对象的同名方法,那么也就是说如果在mBase对象还没赋值的情况下就去调用Context中的任何一个方法时,就会出现空指针异常,上面的代码就是这种情况。Application中方法的执行顺序如下图所示:
Application中在onCreate()方法里去初始化各种全局的变量数据是一种比较推荐的做法,但是如果你想把初始化的时间点提前到极致,也可以去重写attachBaseContext()方法,如下所示:
以上是我们平时在使用Application时需要注意的一个点,下面再来介绍另外一种非常普遍的Application误用情况。
其实Android官方并不太推荐我们使用自定义的Application,基本上只有需要做一些全局初始化的时候可能才需要用到自定义Application,官方文档描述如下:
但是就我的观察而言,现在自定义Application的使用情况基本上可以达到100%了,也就是我们平时自己写测试demo的时候可能不会使用,正式的项目几乎全部都会使用自定义Application。可是使用归使用,有不少项目对自定义Application的用法并不到位,正如官方文档中所表述的一样,多数项目只是把自定义Application当成了一个通用工具类,而这个功能并不需要借助Application来实现,使用单例可能是一种更加标准的方式。
不过自定义Application也并没有什么副作用,它和单例模式二选一都可以实现同样的功能,但是我见过有一些项目,会把自定义Application和单例模式混合到一起使用,这就让人大跌眼镜了。一个非常典型的例子如下所示:
就像单例模式一样,这里提供了一个getInstance()方法,用于获取MyApplication的实例,有了这个实例之后,就可以调用MyApplication中的各种工具方法了。
但是这种写法对吗?这种写法是大错特错!因为我们知道Application是属于系统组件,系统组件的实例是要由系统来去创建的,如果这里我们自己去new一个MyApplication的实例,它就只是一个普通的Java对象而已,而不具备任何Context的能力。有很多人向我反馈使用 LitePal 时发生了空指针错误其实都是由于这个原因,因为你提供给LitePal的只是一个普通的Java对象,它无法通过这个对象来进行Context操作。
那么如果真的想要提供一个获取MyApplication实例的方法,比较标准的写法又是什么样的呢?其实这里我们只需谨记一点,Application全局只有一个,它本身就已经是单例了,无需再用单例模式去为它做多重实例保护了,代码如下所示:
getInstance()方法可以照常提供,但是里面不要做任何逻辑判断,直接返回app对象就可以了,而app对象又是什么呢?在onCreate()方法中我们将app对象赋值成this,this就是当前Application的实例,那么app也就是当前Application的实例了。
------------------------------------------Context方法----------------------------------------------
java.lang.Object | ||
↳ | android.content.Context | |
↳ | android.content.ContextWrapper |
已知的直接子类 |
已知的间接子类 |
班级概况
代理实现Context,将其所有调用简单地委派给另一个Context。可以被子类化以修改行为而不改变原始上下文。
概要
[扩大]
继承常量
| |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
从类 android.content.Context
|
公共建设者 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
ContextWrapper ( Context base) |
公共方法 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
布尔值 |
bindService
(
Intent
service,
ServiceConnection
conn,int flags)
连接到应用程序服务,如果需要创建它。
| ||||||||||
int |
checkCallingOrSelfPermission
(
String
permission)
确定是否一个IPC的调用过程
,或者您
已被授予特定权限。
| ||||||||||
int |
checkCallingOrSelfUriPermission
(
Uri
uri,int modeFlags)
确定是否一个IPC的调用过程
,或者你
已经获准访问特定URI。
| ||||||||||
int |
checkCallingPermission
(
String
permission)
确定您正在处理的IPC的调用进程是否已获得特定权限。
| ||||||||||
int |
checkCallingUriPermission
(
Uri
uri,int modeFlags)
确定呼叫进程和用户ID是否被授予访问特定URI的权限。
| ||||||||||
int |
checkPermission
(
String
权限,int pid,int uid)
确定在系统中运行的特定进程和用户ID是否允许给定的权限。
| ||||||||||
int |
checkUriPermission
(
Uri
uri,int pid,int uid,int modeFlags)
确定特定进程和用户标识是否已被授予访问特定URI的权限。
| ||||||||||
int |
checkUriPermission
(
Uri
uri,
String
readPermission,
String
writePermission,int pid,int uid,int modeFlags)
检查Uri和正常许可。
| ||||||||||
void | clearWallpaper () | ||||||||||
背景 |
createConfigurationContext
(
配置
overrideConfiguration)
为当前上下文返回一个新的Context对象,但其资源被调整以匹配给定的配置。
| ||||||||||
背景 |
createDisplayContext
(
显示
显示)
为当前上下文返回一个新的Context对象,并调整其资源以匹配给定Display的指标。
| ||||||||||
背景 |
createPackageContext
(
String
packageName,int flags)
为给定的应用程序名称返回一个新的Context对象。
| ||||||||||
串[] |
databaseList
()
返回与该Context的应用程序包相关联的私有数据库的字符串数组。
| ||||||||||
布尔值 |
deleteDatabase
(
String
name)
删除与此Context的应用程序包关联的现有私有SQLiteDatabase。
| ||||||||||
布尔值 |
deleteFile
(
String
name)
删除与该Context的应用程序包相关联的给定私有文件。
| ||||||||||
void | enforceCallingOrSelfPermission ( 字符串 权限, 字符串 消息) | ||||||||||
void | enforceCallingOrSelfUriPermission ( Uri uri,int modeFlags, String message) | ||||||||||
void | enforceCallingPermission ( String 权限, String 消息) | ||||||||||
void | enforceCallingUriPermission ( Uri uri,int modeFlags, String message) | ||||||||||
void | enforcePermission ( String 权限,int pid,int uid, String 消息) | ||||||||||
void | enforceUriPermission ( Uri uri,int pid,int uid,int modeFlags, String message) | ||||||||||
void |
enforceUriPermission
(
Uri
uri,
String
readPermission,
String
writePermission,int pid,int uid,int modeFlags,
String
message)
执行Uri和正常许可。
| ||||||||||
串[] |
fileList
()
返回一个字符串数组,命名与该Context的应用程序包关联的私有文件。
| ||||||||||
背景 |
getApplicationContext
()
返回当前进程的单个全局Application对象的上下文。
| ||||||||||
ApplicationInfo |
getApplicationInfo
()
返回此上下文的包的完整应用程序信息。
| ||||||||||
AssetManager |
getAssets
()
返回应用程序包的AssetManager实例。
| ||||||||||
背景 | getBaseContext () | ||||||||||
文件 |
getCacheDir
()
返回文件系统上应用程序特定缓存目录的绝对路径。
| ||||||||||
ClassLoader |
getClassLoader
()
返回一个可以用来检索此包中的类的类加载器。
| ||||||||||
ContentResolver |
getContentResolver
()
返回应用程序包的ContentResolver实例。
| ||||||||||
文件 | getDatabasePath ( String name) | ||||||||||
文件 |
getDir
(
String
name,int mode)
检索,创建如果需要,一个新的目录,应用程序可以在其中放置自己的自定义数据文件。
| ||||||||||
文件 | getExternalCacheDir () | ||||||||||
文件[] |
GetExternalCacheDirs
()
在应用程序可以放置其所拥有的高速缓存文件的所有外部存储设备上返回到特定于应用程序的目录的绝对路径。
| ||||||||||
文件 | getExternalFilesDir ( String type) | ||||||||||
文件[] |
getExternalFilesDirs
(
String
type)
返回所有外部存储设备上应用程序特定目录的绝对路径,应用程序可以放置其拥有的持久性文件。
| ||||||||||
文件 | getFileStreamPath ( String name) | ||||||||||
文件 | getFilesDir () | ||||||||||
Looper |
getMainLooper
()
为当前进程的主线程返回Looper。
| ||||||||||
文件 |
getObbDir
()
返回可以找到此应用程序的OBB文件(如果有的话)的主外部存储目录。
| ||||||||||
文件[] |
getObbDirs
()
返回所有外部存储设备上应用程序特定目录的绝对路径,其中可以找到应用程序的OBB文件(如果有的话)。
| ||||||||||
串 |
getPackageCodePath
()
返回此上下文的主要Android软件包的完整路径。
| ||||||||||
PackageManager |
getPackageManager
()
返回PackageManager实例以查找全局包信息。
| ||||||||||
串 |
getPackageName
()
返回此应用程序的包的名称。
| ||||||||||
串 |
getPackageResourcePath
()
返回此上下文的主要Android软件包的完整路径。
| ||||||||||
资源 |
getResources
()
为应用程序的包返回一个Resources实例。
| ||||||||||
SharedPreferences |
getSharedPreferences
(
String
name,int mode)
检索并保留首选项文件'name'的内容,返回一个SharedPreferences,通过它可以检索和修改其值。
| ||||||||||
目的 |
getSystemService
(
String
name)
通过名称将句柄返回到系统级服务。
| ||||||||||
资源 |
getTheme
()
返回与此上下文关联的Theme对象。
| ||||||||||
可抽出 |
getWallpaper
()
此方法已弃用。请 WallpaperManager.get() 改用。
| ||||||||||
int |
getWallpaperDesiredMinimumHeight
()
此方法已弃用。请 WallpaperManager.getDesiredMinimumHeight() 改用。
| ||||||||||
int |
getWallpaperDesiredMinimumWidth
()
此方法已弃用。请 WallpaperManager.getDesiredMinimumWidth() 改用。
| ||||||||||
void |
grantUriPermission
(
String
toPackage,
Uri
uri,int modeFlags)
授予访问特定Uri到另一个包的权限,无论该包是否具有访问Uri内容提供商的一般权限。
| ||||||||||
布尔值 |
isRestricted
()
指示此上下文是否受限。
| ||||||||||
FileInputStream |
openFileInput
(
String
name)
打开与该Context的应用程序包相关联的私有文件进行阅读。
| ||||||||||
FileOutputStream |
openFileOutput
(
String
name,int mode)
打开与此Context的应用程序包相关联的私有文件进行写入。
| ||||||||||
SQLiteDatabase |
openOrCreateDatabase
(
String
name,int mode,
SQLiteDatabase.CursorFactory
factory)
打开与此Context的应用程序包关联的新的私有SQLiteDatabase。
| ||||||||||
SQLiteDatabase |
openOrCreateDatabase
(
String
name,int mode,
SQLiteDatabase.CursorFactory
factory,
DatabaseErrorHandler
errorHandler)
打开与此Context的应用程序包关联的新的私有SQLiteDatabase。
| ||||||||||
可抽出 |
peekWallpaper
()
此方法已弃用。请 WallpaperManager.peek() 改用。
| ||||||||||
意图 |
registerReceiver
(
BroadcastReceiver
receiver,
IntentFilter
过滤器)
注册要在主活动线程中运行的BroadcastReceiver。
| ||||||||||
意图 |
registerReceiver
(
BroadcastReceiver
receiver,
IntentFilter
filter,
String
broadcastPermission,
Handler
scheduler)
注册接收意向广播,在调度程序的上下文中
运行
。
| ||||||||||
void | removeStickyBroadcast ( 意图 意图) | ||||||||||
void | removeStickyBroadcastAsUser ( Intent intent, UserHandle 用户) | ||||||||||
void | revokeUriPermission ( Uri uri,int modeFlags) | ||||||||||
void |
sendBroadcast
(
意图
意图)
将所有意向广播给所有感兴趣的BroadcastReceivers。
| ||||||||||
void |
sendBroadcast
(
Intent
intent,
String
receiverPermission)
将所有意向广播给所有感兴趣的BroadcastReceivers,允许执行可选的所需权限。
| ||||||||||
void | sendBroadcastAsUser ( Intent intent, UserHandle 用户) | ||||||||||
void | sendBroadcastAsUser ( Intent intent, UserHandle user, String receiverPermission) | ||||||||||
void | sendOrderedBroadcast ( Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,int initialCode, String initialData, Bundle initialExtras) | ||||||||||
void |
sendOrderedBroadcast
(
Intent
intent,
String
receiverPermission)
将给定意图广播给所有感兴趣的BroadcastReceivers,一次提供一个,以允许更多的接收者在将其传送到较不优选的接收器之前消费广播。
| ||||||||||
void | sendOrderedBroadcastAsUser ( Intent intent, UserHandle user, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,int initialCode, String initialData, Bundle initialExtras) | ||||||||||
void |
sendStickyBroadcast
(
意图
意图)
执行一个
sendBroadcast(Intent)
“粘性”,意思是在广播完成后,您发送的意图将保持不变,以便其他人可以通过返回值快速检索该数据
registerReceiver(BroadcastReceiver, IntentFilter)
。
| ||||||||||
void | sendStickyBroadcastAsUser ( 意图 意图, UserHandle 用户) | ||||||||||
void | sendStickyOrderedBroadcast ( Intent intent, BroadcastReceiver resultReceiver, Handler scheduler,int initialCode, String initialData, Bundle initialExtras) | ||||||||||
void | sendStickyOrderedBroadcastAsUser ( Intent intent, UserHandle user, BroadcastReceiver resultReceiver, Handler scheduler,int initialCode, String initialData, Bundle initialExtras) | ||||||||||
void |
setTheme
(int)
设置这个上下文的基础主题。
| ||||||||||
void | setWallpaper ( 位 图位图) | ||||||||||
void | setWallpaper ( InputStream data) | ||||||||||
void | startActivities ( Intent [] intents) | ||||||||||
void |
startActivities
(
Intent []
intents
,
Bundle
选项)
启动多项新活动。
| ||||||||||
void | startActivity ( 意图 意图) | ||||||||||
void |
startActivity
(
意图
意图,
捆绑
选项)
启动新的活动。
| ||||||||||
布尔值 | startInstrumentation ( ComponentName className, String profileFile, Bundle 参数) | ||||||||||
void | startIntentSender ( IntentSender intent, Intent fillInIntent,int flagsMask,int flagsValues,int extraFlags, Bundle options) | ||||||||||
void | startIntentSender ( IntentSender intent, Intent fillInIntent,int flagsMask,int flagsValues,int extraFlags) | ||||||||||
ComponentName |
startService
(
意图
服务)
请求启动给定的应用程序服务。
| ||||||||||
布尔值 |
stopService
(
意图
名称)
请求停止给定的应用程序服务。
| ||||||||||
void |
unbindService
(
ServiceConnection
conn)
断开应用程序服务。
| ||||||||||
void |
unregisterReceiver
(
BroadcastReceiver
receiver)
取消注册之前注册的BroadcastReceiver。
|
保护方法 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
void |
attachBaseContext
(
Context
base)
设置此ContextWrapper的基本上下文。
|
[扩大]
继承方法
| |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
从类 android.content.Context
| |||||||||||
从类 java.lang.Object
|
公共建设者
公共方法
public boolean bindService (Intent service,ServiceConnection conn,int flags)
连接到应用程序服务,如果需要创建它。这定义了应用程序和服务之间的依赖关系。给定的 连接将在创建时接收服务对象,并被告知它是否死亡并重新启动。只要呼叫上下文存在,该服务将被认为是系统所需要的。例如,如果此上下文是停止的活动,则在恢复活动之前,该服务将不再需要继续运行。
SecurityException
如果您没有绑定到给定服务的权限,则此函数将抛出。
注意:不能从BroadcastReceiver
组件调用 此方法。您可以使用从BroadcastReceiver到Service的通信的模式是调用 startService(Intent)
包含要发送的命令的参数,服务stopSelf(int)
在执行该命令时调用其 方法。请参阅API演示应用程序/服务/服务启动参数控制器。然而,使用已经注册的BroadcastReceiver的此方法是可以的 registerReceiver(BroadcastReceiver, IntentFilter)
,因为该BroadcastReceiver的生命周期与另一个对象(注册它的对象)绑定在一起。
参数
服务 | 标识要连接的服务。Intent可以指定显式组件名称或逻辑描述(操作,类别等)以匹配 IntentFilter 服务发布的内容。 |
---|---|
康 | 当服务启动和停止时接收信息。这必须是一个有效的ServiceConnection对象; 它不能为null。 |
标志 | 绑定的操作选项。可能是0, , BIND_AUTO_CREATE ,BIND_DEBUG_UNBIND , BIND_NOT_FOREGROUND ,BIND_ABOVE_CLIENT , BIND_ALLOW_OOM_MANAGEMENT 或BIND_WAIVE_PRIORITY 。 |
返回
- 如果您已成功绑定到该服务,
true
则返回;false
如果没有连接,则返回,因此您将不会收到服务对象。
public int checkCallingOrSelfPermission (String permission)
确定是否一个IPC的调用过程,或者您已被授予特定权限。这是一样的 checkCallingPermission(String)
,除非它授予您自己的权限,如果您当前没有处理IPC。小心使用!
参数
允许 | 正在检查的权限的名称。 |
---|
返回
PERMISSION_GRANTED
如果调用pid / uid被允许该权限,或者PERMISSION_DENIED
如果不是。
public int checkCallingOrSelfUriPermission (Uri uri,int modeFlags)
确定是否一个IPC的调用过程,或者你已经获准访问特定URI。这是一样的 checkCallingUriPermission(Uri, int)
,除非它授予您自己的权限,如果您当前没有处理IPC。小心使用!
参数
uri | 正在检查的uri。 |
---|---|
modeFlags | 获得授权的类型。可能是一个或两个 Intent.FLAG_GRANT_READ_URI_PERMISSION 或 Intent.FLAG_GRANT_WRITE_URI_PERMISSION 。 |
返回
PERMISSION_GRANTED
如果呼叫者被允许访问该uri,或者PERMISSION_DENIED
如果不是。
public int checkCallingPermission (String permission)
确定您正在处理的IPC的调用进程是否已获得特定权限。这基本上是与调用 checkPermission(String, int, int)
与PID和返回UID getCallingPid()
和getCallingUid()
。一个重要的区别是,如果您当前没有处理IPC,则此功能将始终失败。这样做是为了防止意外泄漏的权限; 你可以checkCallingOrSelfPermission(String)
用来避免这种保护。
参数
允许 | 正在检查的权限的名称。 |
---|
返回
PERMISSION_GRANTED
如果调用pid / uid被允许该权限,或者PERMISSION_DENIED
如果不是。
public int checkCallingUriPermission (Uri uri,int modeFlags)
确定调用进程和用户标识是否已被授予访问特定URI的权限。这基本上是与调用checkUriPermission(Uri, int, int, int)
与PID和返回UID getCallingPid()
和getCallingUid()
。一个重要的区别是,如果您当前没有处理IPC,则此功能将始终失败。
参数
uri | 正在检查的uri。 |
---|---|
modeFlags | 获得授权的类型。可能是一个或两个 Intent.FLAG_GRANT_READ_URI_PERMISSION 或 Intent.FLAG_GRANT_WRITE_URI_PERMISSION 。 |
返回
PERMISSION_GRANTED
如果呼叫者被允许访问该uri,或者PERMISSION_DENIED
如果不是。
public int checkPermission (String permission,int pid,int uid)
确定在系统中运行的特定进程和用户ID是否允许给定的权限。
参数
允许 | 正在检查的权限的名称。 |
---|---|
pid | 要检查的进程ID。必须> 0。 |
uid | 要检查的用户ID。0的用户是root用户,它将通过每个权限检查。 |
返回
PERMISSION_GRANTED
如果给定的pid / uid被允许,或者PERMISSION_DENIED
如果不是。
public int checkUriPermission (Uri uri,int pid,int uid,int modeFlags)
确定特定进程和用户标识是否已被授予访问特定URI的权限。这只会检查明确授予的权限 - 如果给定的进程/ uid具有对URI内容提供商的更一般访问权限,则此检查将始终失败。
参数
uri | 正在检查的uri。 |
---|---|
pid | 要检查的进程ID。必须> 0。 |
uid | 要检查的用户ID。0的用户是root用户,它将通过每个权限检查。 |
modeFlags | 获得授权的类型。可能是一个或两个 Intent.FLAG_GRANT_READ_URI_PERMISSION 或 Intent.FLAG_GRANT_WRITE_URI_PERMISSION 。 |
返回
PERMISSION_GRANTED
如果给定的pid / uid被允许访问该uri,或者PERMISSION_DENIED
如果不是。
public int checkUriPermission (Uri uri,String readPermission,String writePermission,int pid,int uid,int modeFlags)
检查Uri和正常许可。这使您可以同时执行checkPermission(String, int, int)
,并checkUriPermission(Uri, int, int, int)
在一次调用。
参数
uri | Uri的权限要检查,否则不执行此检查。 |
---|---|
readPermission | 提供整体读取权限的权限,否则不执行此检查。 |
writePermission | 提供整体写入权限的权限,否则不执行此检查。 |
pid | 要检查的进程ID。必须> 0。 |
uid | 要检查的用户ID。0的用户是root用户,它将通过每个权限检查。 |
modeFlags | 获得授权的类型。可能是一个或两个 Intent.FLAG_GRANT_READ_URI_PERMISSION 或 Intent.FLAG_GRANT_WRITE_URI_PERMISSION 。 |
返回
PERMISSION_GRANTED
如果呼叫者被允许访问该uri或保持一个给定的权限,或者PERMISSION_DENIED
如果不是。
public void clearWallpaper ()
public Context createConfigurationContext (配置 overrideConfiguration)
为当前上下文返回一个新的Context对象,但其资源被调整以匹配给定的配置。每次调用此方法返回一个Context对象的新实例; 上下文对象不是共享的,但是通常的状态(ClassLoader,同一配置的其他资源)可能是这样,Context本身可以是相当轻量级的。
参数
overrideConfiguration | 一个Configuration 指定什么值在原来的语境资源的基础配置进行修改。如果基本配置发生更改(例如由于方向更改),则此上下文的资源也将更改,除了那些已使用值显式覆盖的内容。 |
---|
返回
- A
Context
给定配置覆盖。
public Context createDisplayContext (显示显示)
为当前上下文返回一个新的Context对象,并调整其资源以匹配给定Display的指标。每次调用此方法返回一个Context对象的新实例; 上下文对象不是共享的,但是通常的状态(ClassLoader,同一配置的其他资源)可能是这样,Context本身可以是相当轻量级的。返回的显示上下文提供了一个配置为在给定显示上显示窗口的WindowManager
(见getSystemService(String)
)。WindowManager的getDefaultDisplay()
方法可以用于从返回的上下文中检索显示。
参数
显示 | 一个Display 对象,指定要衡量Context资源的度量标准的显示,以及应显示哪些新窗口。 |
---|
返回
- A
Context
用于显示。
public Context createPackageContext (String packageName,int flags)
为给定的应用程序名称返回一个新的Context对象。该上下文与命名应用程序启动时获取的内容相同,包含相同的资源和类加载器。每次调用此方法返回一个Context对象的新实例; 上下文对象不共享,但它们共享公共状态(Resources,ClassLoader等),因此Context实例本身是相当轻量级的。
PackageManager.NameNotFoundException
如果没有给定的包名称的应用程序,则抛出。
抛出SecurityException
如果请求上下文不能加载到调用者的出于安全原因的过程(参见 CONTEXT_INCLUDE_CODE
更多信息}。
参数
packageName | 应用程序包的名称 |
---|---|
标志 | 选项标志,其中之一CONTEXT_INCLUDE_CODE 或CONTEXT_IGNORE_SECURITY 。 |
返回
- A
Context
用于应用程序。
public boolean deleteDatabase (String name)
删除与此Context的应用程序包关联的现有私有SQLiteDatabase。
参数
名称 | 数据库的名称(在应用程序包中唯一)。 |
---|
返回
true
如果数据库被成功删除; 否则false
。
public boolean deleteFile (String name)
删除与该Context的应用程序包相关联的给定私有文件。
参数
名称 | 要删除的文件的名称; 不能包含路径分隔符。 |
---|
返回
true
如果文件已成功删除; 否则false
。
public void enforceCallingOrSelfPermission (String permission,String message)
如果您和您正在处理的IPC的调用进程都不被授予特定权限,则抛出一个 SecurityException
。这是一样的enforceCallingPermission(String, String)
,除非它授予您自己的权限,如果您当前没有处理IPC。小心使用!
参数
允许 | 正在检查的权限的名称。 |
---|---|
信息 | 如果抛出异常,则包含该消息。 |
public void enforceCallingOrSelfUriPermission (Uri uri,int modeFlags,String message)
如果IPC的调用过程或者您没有被授予访问特定URI的权限,则抛出SecurityException
。这是一样的enforceCallingUriPermission(Uri, int, String)
,除非它授予您自己的权限,如果您当前没有处理IPC。小心使用!
参数
uri | 正在检查的uri。 |
---|---|
modeFlags | 获得授权的类型。可能是一个或两个 Intent.FLAG_GRANT_READ_URI_PERMISSION 或 Intent.FLAG_GRANT_WRITE_URI_PERMISSION 。 |
信息 | 如果抛出异常,则包含该消息。 |
public void enforceCallingPermission (String permission,String message)
如果您正在处理的IPC的调用进程尚未被授予特定权限,则抛出一个SecurityException
。这基本上是与调用 enforcePermission(String, int, int, String)
与PID和返回UID getCallingPid()
和getCallingUid()
。一个重要的区别是,如果您当前没有处理IPC,则此函数将始终抛出SecurityException异常。这样做是为了防止意外泄漏的权限; 你可以enforceCallingOrSelfPermission(String, String)
用来避免这种保护。
参数
允许 | 正在检查的权限的名称。 |
---|---|
信息 | 如果抛出异常,则包含该消息。 |
public void enforceCallingUriPermission (Uri uri,int modeFlags,String message)
如果调用进程和用户标识未被授予访问特定URI的权限,则抛出SecurityException
。这基本上是与调用 enforceUriPermission(Uri, int, int, int, String)
与PID和返回UID getCallingPid()
和getCallingUid()
。一个重要的区别是,如果您当前没有处理IPC,则此函数将始终抛出SecurityException异常。
参数
uri | 正在检查的uri。 |
---|---|
modeFlags | 获得授权的类型。可能是一个或两个 Intent.FLAG_GRANT_READ_URI_PERMISSION 或 Intent.FLAG_GRANT_WRITE_URI_PERMISSION 。 |
信息 | 如果抛出异常,则包含该消息。 |
public void enforcePermission (String permission,int pid,int uid,String message)
如果在系统中运行的特定进程和用户ID不允许给定的权限,则抛出一个SecurityException
。
参数
允许 | 正在检查的权限的名称。 |
---|---|
pid | 要检查的进程ID。必须> 0。 |
uid | 要检查的用户ID。0的用户是root用户,它将通过每个权限检查。 |
信息 | 如果抛出异常,则包含该消息。 |
public void enforceUriPermission (Uri uri,int pid,int uid,int modeFlags,String message)
如果特定进程和用户ID未被授予访问特定URI的权限,则抛出SecurityException
。这只会检查明确授予的权限 - 如果给定的进程/ uid具有对URI内容提供商的更一般访问权限,则此检查将始终失败。
参数
uri | 正在检查的uri。 |
---|---|
pid | 要检查的进程ID。必须> 0。 |
uid | 要检查的用户ID。0的用户是root用户,它将通过每个权限检查。 |
modeFlags | 获得授权的类型。可能是一个或两个 Intent.FLAG_GRANT_READ_URI_PERMISSION 或 Intent.FLAG_GRANT_WRITE_URI_PERMISSION 。 |
信息 | 如果抛出异常,则包含该消息。 |
public void enforceUriPermission (Uri uri,String readPermission,String writePermission,int pid,int uid,int modeFlags,String message)
执行Uri和正常许可。这使您可以同时执行enforcePermission(String, int, int, String)
,并enforceUriPermission(Uri, int, int, int, String)
在一次调用。
参数
uri | Uri的权限要检查,否则不执行此检查。 |
---|---|
readPermission | 提供整体读取权限的权限,否则不执行此检查。 |
writePermission | 提供整体写入权限的权限,否则不执行此检查。 |
pid | 要检查的进程ID。必须> 0。 |
uid | 要检查的用户ID。0的用户是root用户,它将通过每个权限检查。 |
modeFlags | 获得授权的类型。可能是一个或两个 Intent.FLAG_GRANT_READ_URI_PERMISSION 或 Intent.FLAG_GRANT_WRITE_URI_PERMISSION 。 |
信息 | 如果抛出异常,则包含该消息。 |
public Context getApplicationContext ()
返回当前进程的单个全局Application对象的上下文。这通常只能在需要一个生命周期与当前上下文分开的Context的情况下使用,该过程与进程的生命周期而不是当前组件相关联。
考虑一下如何与之互动 registerReceiver(BroadcastReceiver, IntentFilter)
:
-
如果从活动上下文中使用,接收方正在该活动中注册。这意味着在活动完成销毁之前,您应该注销; 事实上,如果你不这样做,框架将清理您的泄漏注册,因为它删除活动并记录错误。因此,如果您使用活动上下文来注册一个静态的接收者(对进程的全局性,与活动实例无关),那么该注册将被删除,无论您使用的活动被销毁。
-
如果从这里返回的上下文使用,接收方正在注册与您的应用程序相关联的全局状态。因此,永远不会被你注册。如果接收器与静态数据相关联,而不是特定的组件,则这是必要的。但是如果您忘记取消注册,取消绑定等等,那么在其他地方使用ApplicationContext可能会导致严重的泄漏。
public File getCacheDir ()
返回文件系统上应用程序特定缓存目录的绝对路径。这些文件将是设备在存储空间不足时首先被删除的文件。这些文件将被删除不能保证。 注意:您不应该依靠系统为您删除这些文件; 您应该总是有一个合理的最大值,例如1 MB,用于使用缓存文件的空间量,并在超出该空间时修剪这些文件。
返回
- 目录保存应用程序缓存文件的路径。
public File getDatabasePath (String name)
返回openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory)
存储创建数据库的文件系统上的绝对路径 。
参数
名称 | 要获取路径的数据库的名称。 |
---|
返回
- 给定数据库的绝对路径。
public File getDir (String name,int mode)
检索,创建如果需要,一个新的目录,应用程序可以在其中放置自己的自定义数据文件。您可以使用返回的File对象来创建和访问此目录中的文件。请注意,通过File对象创建的文件只能由您自己的应用程序访问; 您只能设置整个目录的模式,而不是单个文件。
参数
名称 | 要检索的目录的名称。这是作为应用程序数据一部分创建的目录。 |
---|---|
模式 | 操作模式。使用0或MODE_PRIVATE 默认操作,MODE_WORLD_READABLE 并 MODE_WORLD_WRITEABLE 控制权限。 |
返回
- 一个
File
请求的目录对象。该目录将被创建,如果它不存在。
public File getExternalCacheDir ()
返回主外部文件系统(即Environment.getExternalStorageDirectory()
应用程序可以放置其所拥有的缓存文件的位置)的绝对路径,这些文件在应用程序的内部,用户通常不作为媒体可见。
这就像getCacheDir()
在卸载应用程序时这些文件将被删除,但是有一些重要的区别:
- 该平台并不总是监视外部存储器中可用的空间,因此可能不会自动删除这些文件。目前,这里的唯一时间文件将被平台删除,当运行
JELLY_BEAN_MR1
或更新时Environment.isExternalStorageEmulated()
返回true。请注意,您应该管理您将使用的最大空间,就像这样getCacheDir()
。 - 外部文件不总是可用的:如果用户将外部存储器安装在计算机上或将其删除,则它们将消失。有关
Environment
存储状态的信息,请参阅API 。 - 这些文件没有执行安全性。例如,任何持有的应用程序
WRITE_EXTERNAL_STORAGE
都可以写入这些文件。
从开始KITKAT
,无需读取或写入返回路径的权限; 呼叫应用程序始终可以访问它。这仅适用于为调用应用程序的程序包名生成的路径。访问属于其他包的路径WRITE_EXTERNAL_STORAGE
和/或是READ_EXTERNAL_STORAGE
必需的。
在具有多个用户(如描述UserManager
)的设备上,每个用户都有自己的隔离外部存储。应用程序只能为运行的用户访问外部存储。
返回
- 在外部存储器上保存应用程序缓存文件的目录的路径。如果外部存储器当前未安装,则返回null,因此无法确保路径存在; 当可用时,您将需要再次调用此方法。
public File [] getExternalCacheDirs ()
在应用程序可以放置其所拥有的高速缓存文件的所有外部存储设备上返回到特定于应用程序的目录的绝对路径。这些文件是应用程序内部的,通常用户作为媒体通常不可见。
这就像getCacheDir()
在卸载应用程序时这些文件将被删除,但是有一些重要的区别:
- 外部文件不总是可用的:如果用户将外部存储器安装在计算机上或将其删除,则它们将消失。
- 这些文件没有执行安全性。
这里返回的外部存储设备被认为是设备的永久部分,包括模拟的外部存储和物理介质插槽,例如电池盒中的SD卡。返回的路径不包括瞬态设备,如USB闪存驱动器。
应用程序可以在任何或所有返回的设备上存储数据。例如,应用程序可能选择将大型文件存储在具有最多可用空间的设备上,如通过测量StatFs
。
无需读取或写入返回路径的权限; 呼叫应用程序始终可以访问它们。在二级外部存储设备上写入这些路径之外的访问不可用。
返回的第一个路径与getExternalCacheDir()
。返回的路径可能是null
存储设备不可用。
public File getExternalFilesDir (String type)
返回主外部文件系统(即某处Environment.getExternalStorageDirectory()
)的目录的绝对路径,其中应用程序可以放置其拥有的持久性文件。这些文件是应用程序的内部,用户作为媒体通常不可见。
这就像getFilesDir()
在卸载应用程序时这些文件将被删除,但是有一些重要的区别:
- 外部文件不总是可用的:如果用户将外部存储器安装在计算机上或将其删除,则它们将消失。有关
Environment
存储状态的信息,请参阅API 。 - 这些文件没有执行安全性。例如,任何持有的应用程序
WRITE_EXTERNAL_STORAGE
都可以写入这些文件。
从开始KITKAT
,无需读取或写入返回路径的权限; 呼叫应用程序始终可以访问它。这仅适用于为调用应用程序的程序包名生成的路径。访问属于其他包的路径WRITE_EXTERNAL_STORAGE
和/或是READ_EXTERNAL_STORAGE
必需的。
在具有多个用户(如描述UserManager
)的设备上,每个用户都有自己的隔离外部存储。应用程序只能为运行的用户访问外部存储。
以下是在应用程序的私有存储中操作文件的典型代码示例:
void createExternalStoragePrivateFile (){ //创建一个我们将私有文件放在外部//存储上的路径。File file = new File (getExternalFilesDir (null ),“DemoFile.jpg” ); 尝试{ //非常简单的代码将图片从应用程序的//资源复制到外部文件中。请注意,此代码不会检查错误,并假定图片很小(不要尝试以块形式复制)。请注意,如果外部存储器//当前未安装,则会静默失败。InputStream is = getResources ()。openRawResource (ř 。绘制。气球); OutputStream os = new FileOutputStream (file ); byte [] data = new byte [ is 。available ()]; 是。读(数据); os 。写(数据); 是。关闭(); os 。关闭(); } catch (IOException e ){ //无法创建文件,可能是因为外部存储尚未安装。登录。w (“ExternalStorage” ,“写入错误” + 文件,e ); } } void deleteExternalStoragePrivateFile (){ //获取外部存储上的文件路径。如果外部//存储器当前没有挂载,这将失败。File file = new File (getExternalFilesDir (null ),“DemoFile.jpg” ); if (file != null ){ file 。delete (); } } boolean hasExternalStoragePrivateFile (){ //获取外部存储上的文件路径。如果外部//存储器当前没有挂载,这将失败。File file = new File (getExternalFilesDir (null ),“DemoFile.jpg” ); 如果(文件!= null ){ return file 。exists (); } return false ; }
如果向此函数提供非空类型,则返回的文件将是指定给定类型的子目录的路径。虽然介质扫描程序不会自动扫描这些文件,但您可以使用这些文件将其显式添加到介质数据库 MediaScannerConnection.scanFile
。请注意,这不同于 Environment.getExternalStoragePublicDirectory()
,它提供了所有应用程序共享的媒体目录。这里返回的目录由应用程序拥有,并且在卸载应用程序时将删除其内容。与此不同 Environment.getExternalStoragePublicDirectory()
,此处返回的目录将自动为您创建。
以下是在应用程序的私有存储中处理图片并将其添加到媒体数据库的典型代码示例:
void createExternalStoragePrivatePicture (){ //创建一个路径,我们将把我们的图片放在我们自己的私人//图片目录中。请注意,我们不需要在DIRECTORY_PICTURES中放置//图片,因为媒体扫描器将会看到//这些目录中的所有媒体; 这可能与其他//媒体类型(例如DIRECTORY_MUSIC)有用,可帮助您将媒体分类到用户显示。文件路径= getExternalFilesDir (环境。DIRECTORY_PICTURES ); File file = new File (path ,“DemoPicture.jpg” ); 尝试{ //非常简单的代码将图片从应用程序的//资源复制到外部文件中。请注意,此代码不会检查错误,并假定图片很小(不要尝试以块形式复制)。请注意,如果外部存储器//当前未安装,则会静默失败。InputStream is = getResources ()。openRawResource (ř 。绘制。气球); OutputStream os = new FileOutputStream (file ); byte [] data = new byte [ is 。available ()]; 是。读(数据); os 。写(数据); 是。关闭(); os 。关闭(); //告诉媒体扫描器有关新文件,以便它立即可供用户使用。MediaScannerConnection 。SCANFILE (此,新的String [] { 文件。的toString ()},null ,新的MediaScannerConnection 。OnScanCompletedListener (){ public void onScanCompleted (String path ,Uri uri ){ Log 。i (“ExternalStorage” ,“Scanned” + path + “:” ); 登录。我(“ExternalStorage” ,“ - > uri =” + uri ); } }); } catch (IOException e ){ //无法创建文件,可能是因为外部存储尚未安装。登录。w (“ExternalStorage” ,“写入错误” + 文件,e ); } } void deleteExternalStoragePrivatePicture (){ //创建一个路径,我们将把我们的图片放在用户的公共图片目录中,并删除该文件。如果外部//存储器当前没有挂载,这将失败。文件路径= getExternalFilesDir (环境。DIRECTORY_PICTURES ); if (path != null ){ File file = new File (path ,“DemoPicture.jpg” ); 文件。delete (); } } boolean hasExternalStoragePrivatePicture (){ //创建一个路径,我们将把我们的图片放在用户的公共图片目录中,并检查文件是否存在。如果//当前未安装外部存储器,则会认为//图片不存在。文件路径= getExternalFilesDir (环境。DIRECTORY_PICTURES ); if (path != null ){ File file = new File (path ,“DemoPicture.jpg” ); 返回文件。exists (); } return false ; } 文件路径= getExternalFilesDir (环境。DIRECTORY_PICTURES ); if (path != null ){ File file = new File (path ,“DemoPicture.jpg” ); 返回文件。exists (); } return false ; } 文件路径= getExternalFilesDir (环境。DIRECTORY_PICTURES ); if (path != null ){ File file = new File (path ,“DemoPicture.jpg” ); 返回文件。exists (); } return false ; } if (path != null ){ File file = new File (path ,“DemoPicture.jpg” ); 返回文件。exists (); } return false ; } if (path != null ){ File file = new File (path ,“DemoPicture.jpg” ); 返回文件。exists (); } return false ; }
参数
类型 | 要返回的文件目录的类型。可能是空的文件,目录或子目录下面的环境常量之一根: DIRECTORY_MUSIC , DIRECTORY_PODCASTS , DIRECTORY_RINGTONES ,DIRECTORY_ALARMS , DIRECTORY_NOTIFICATIONS , DIRECTORY_PICTURES ,或 DIRECTORY_MOVIES 。 |
---|
返回
- 在外部存储器上保存应用程序文件的目录的路径。如果外部存储器当前未安装,则返回null,因此无法确保路径存在; 当可用时,您将需要再次调用此方法。
public File [] getExternalFilesDirs (String type)
返回所有外部存储设备上应用程序特定目录的绝对路径,应用程序可以放置其拥有的持久性文件。这些文件是应用程序内部的,通常用户作为媒体通常不可见。
这就像getFilesDir()
在卸载应用程序时这些文件将被删除,但是有一些重要的区别:
- 外部文件不总是可用的:如果用户将外部存储器安装在计算机上或将其删除,则它们将消失。
- 这些文件没有执行安全性。
这里返回的外部存储设备被认为是设备的永久部分,包括模拟的外部存储和物理介质插槽,例如电池盒中的SD卡。返回的路径不包括瞬态设备,如USB闪存驱动器。
应用程序可以在任何或所有返回的设备上存储数据。例如,应用程序可能选择将大型文件存储在具有最多可用空间的设备上,如通过测量StatFs
。
无需读取或写入返回路径的权限; 呼叫应用程序始终可以访问它们。在二级外部存储设备上写入这些路径之外的访问不可用。
返回的第一个路径与getExternalFilesDir(String)
。返回的路径可能是null
存储设备不可用。
public File getFilesDir ()
返回文件系统openFileOutput(String, int)
中存储创建文件的目录的绝对路径。
返回
- 目录保存应用程序文件的路径。
public Looper getMainLooper ()
为当前进程的主线程返回Looper。这是用于调度应用程序组件(活动,服务等)的线程。
根据定义,该方法返回与通过调用获得的结果相同的结果Looper.getMainLooper()
。
返回
- 主要活套。
public File getObbDir ()
返回可以找到此应用程序的OBB文件(如果有的话)的主外部存储目录。请注意,如果应用程序没有任何OBB文件,则该目录可能不存在。
这就像getFilesDir()
在卸载应用程序时这些文件将被删除,但是有一些重要的区别:
- 外部文件不总是可用的:如果用户将外部存储器安装在计算机上或将其删除,则它们将消失。
- 这些文件没有执行安全性。例如,任何持有的应用程序
WRITE_EXTERNAL_STORAGE
都可以写入这些文件。
从开始KITKAT
,无需读取或写入返回路径的权限; 呼叫应用程序始终可以访问它。这仅适用于为调用应用程序的程序包名生成的路径。访问属于其他包的路径WRITE_EXTERNAL_STORAGE
和/或是READ_EXTERNAL_STORAGE
必需的。
在具有多个用户(如所述UserManager
)的设备上,多个用户可以共享相同的OBB存储位置。应用程序应确保在不同用户下运行的多个实例不会互相干扰。
public File [] getObbDirs ()
返回所有外部存储设备上应用程序特定目录的绝对路径,其中可以找到应用程序的OBB文件(如果有的话)。注意,如果应用程序没有任何OBB文件,这些目录可能不存在。
这就像getFilesDir()
在卸载应用程序时这些文件将被删除,但是有一些重要的区别:
- 外部文件不总是可用的:如果用户将外部存储器安装在计算机上或将其删除,则它们将消失。
- 这些文件没有执行安全性。
这里返回的外部存储设备被认为是设备的永久部分,包括模拟的外部存储和物理介质插槽,例如电池盒中的SD卡。返回的路径不包括瞬态设备,如USB闪存驱动器。
应用程序可以在任何或所有返回的设备上存储数据。例如,应用程序可能选择将大型文件存储在具有最多可用空间的设备上,如通过测量StatFs
。
无需读取或写入返回路径的权限; 呼叫应用程序始终可以访问它们。在二级外部存储设备上写入这些路径之外的访问不可用。
返回的第一个路径与getObbDir()
。返回的路径可能是null
存储设备不可用。
public String getPackageCodePath ()
返回此上下文的主要Android软件包的完整路径。Android包是一个包含应用程序的主要代码和资产的ZIP文件。
注意:这对于应用程序通常不是有用的,因为它们不应该直接访问文件系统。
返回
- 字符串代码和资产的路径。
public String getPackageResourcePath ()
返回此上下文的主要Android软件包的完整路径。Android包是一个包含应用程序主要资源的ZIP文件。
注意:这对于应用程序通常不是有用的,因为它们不应该直接访问文件系统。
返回
- 字符串资源的路径。
public SharedPreferences getSharedPreferences (String name,int mode)
检索并保留首选项文件'name'的内容,返回一个SharedPreferences,通过它可以检索和修改其值。只有一个SharedPreferences对象的实例返回给任何一个同名的调用者,这意味着它们会在制作完成后立即看到对方的编辑。
参数
名称 | 所需的首选项文件。如果此名称的首选项文件不存在,则在您检索编辑器(SharedPreferences.edit())然后提交更改(Editor.commit())时将创建它。 |
---|---|
模式 | 操作模式。使用0或MODE_PRIVATE 默认操作,MODE_WORLD_READABLE 并MODE_WORLD_WRITEABLE 控制权限。MODE_MULTI_PROCESS 如果多个进程突破相同的SharedPreferences文件,也可以使用该位 。 MODE_MULTI_PROCESS 始终在应用程序中定位Gingerbread(Android 2.3)及以下版本,默认情况下在以后版本中关闭。 |
返回
SharedPreferences
可用于检索和修改偏好值的单个实例。
public Object getSystemService (String name)
通过名称将句柄返回到系统级服务。返回对象的类根据请求的名称而异。目前可用的名称有:
-
您可以在其中放置自定义窗口的顶级窗口管理器。返回的对象是a
WindowManager
。 -
A
LayoutInflater
在这种情况下膨胀布局资源。 -
A
ActivityManager
用于与系统的全局活动状态进行交互。 -
A
PowerManager
用于控制电源管理。 -
A
AlarmManager
用于在您选择时收到意向。 -
A
NotificationManager
用于通知用户背景事件。 -
A
KeyguardManager
用于控制键盘保护 -
A
LocationManager
用于控制位置(例如,GPS)更新。 -
A
SearchManager
用于处理搜索。 -
A
Vibrator
用于与振动器硬件相互作用。 -
A
ConnectivityManager
用于处理网络连接的管理。 -
A
WifiManager
用于管理Wi-Fi连接。 -
一个
InputMethodManager
用于输入法管理。 -
一种
UiModeManager
用于控制用户界面模式。 -
A
DownloadManager
用于请求HTTP下载
WINDOW_SERVICE
(“窗口”)
LAYOUT_INFLATER_SERVICE
(“layout_inflater”)
ACTIVITY_SERVICE
(“活动”)
POWER_SERVICE
(“功率”)
ALARM_SERVICE
(“报警”)
NOTIFICATION_SERVICE
(“通知”)
KEYGUARD_SERVICE
(“keyguard”)
LOCATION_SERVICE
(“位置”)
SEARCH_SERVICE
(“搜索”)
VIBRATOR_SERVICE
(“振动器”)
CONNECTIVITY_SERVICE
(“连接”)
WIFI_SERVICE
(“无线上网”)
INPUT_METHOD_SERVICE
(“输入法”)
UI_MODE_SERVICE
(“uimode”)
DOWNLOAD_SERVICE
(“下载”)
注意:通过此API获取的系统服务可能与从其获取的上下文密切相关。一般来说,不要在各种不同的上下文(活动,应用程序,服务,提供商等)之间共享服务对象
参数
名称 | 所需服务的名称。 |
---|
返回
- 该服务,如果名称不存在,则为null。
public int getWallpaperDesiredMinimumHeight ()
此方法已弃用。
请WallpaperManager.getDesiredMinimumHeight()
改用。
public int getWallpaperDesiredMinimumWidth ()
此方法已弃用。
请WallpaperManager.getDesiredMinimumWidth()
改用。
public void grantUriPermission (String toPackage,Uri uri,int modeFlags)
授予访问特定Uri到另一个包的权限,无论该包是否具有访问Uri内容提供商的一般权限。这可以用于授予特定的临时权限,通常是响应于用户交互(例如用户打开您希望其他人显示的附件)。
通常,您应该使用Intent.FLAG_GRANT_READ_URI_PERMISSION
或 Intent.FLAG_GRANT_WRITE_URI_PERMISSION
使用Intent直接启动活动而不是此功能。如果您直接使用此功能,那么revokeUriPermission(Uri, int)
当目标不再允许访问它时,您应该确保调用 。
要成功,拥有Uri的内容提供商必须 grantUriPermissions
在其清单中设置<grant-uri-permissions>
属性或包含 标签。
参数
包装 | 您希望允许访问Uri的软件包。 |
---|---|
uri | 您想要授予访问权限的Uri。 |
modeFlags | 所需的访问模式。任何组合 Intent.FLAG_GRANT_READ_URI_PERMISSION 或 Intent.FLAG_GRANT_WRITE_URI_PERMISSION 。 |
public FileInputStream openFileInput (String name)
打开与该Context的应用程序包相关联的私有文件进行阅读。
参数
名称 | 要打开的文件的名称; 不能包含路径分隔符。 |
---|
返回
public FileOutputStream openFileOutput (String name,int mode)
打开与此Context的应用程序包相关联的私有文件进行写入。创建文件(如果不存在)。
参数
名称 | 要打开的文件的名称; 不能包含路径分隔符。 |
---|---|
模式 | 操作模式。使用0或MODE_PRIVATE 默认操作,MODE_APPEND 附加到现有文件, MODE_WORLD_READABLE 并MODE_WORLD_WRITEABLE 控制权限。 |
返回
public SQLiteDatabase openOrCreateDatabase (String name,int mode,SQLiteDatabase.CursorFactory factory)
打开与此Context的应用程序包关联的新的私有SQLiteDatabase。创建数据库文件(如果不存在)。
参数
名称 | 数据库的名称(在应用程序包中唯一)。 |
---|---|
模式 | 操作模式。使用0或MODE_PRIVATE 默认操作,MODE_WORLD_READABLE 并MODE_WORLD_WRITEABLE 控制权限。用于MODE_ENABLE_WRITE_AHEAD_LOGGING 默认启用预写记录。 |
厂 | 调用查询时调用实例化一个游标的可选工厂类。 |
返回
- 具有给定名称的新创建的数据库的内容。
public SQLiteDatabase openOrCreateDatabase (String name,int mode,SQLiteDatabase.CursorFactoryfactory,DatabaseErrorHandler errorHandler)
打开与此Context的应用程序包关联的新的私有SQLiteDatabase。创建数据库文件(如果不存在)。
接受输入参数:DatabaseErrorHandler
当sqlite报告数据库损坏时,用于处理损坏的具体实例。
参数
名称 | 数据库的名称(在应用程序包中唯一)。 |
---|---|
模式 | 操作模式。使用0或MODE_PRIVATE 默认操作,MODE_WORLD_READABLE 并MODE_WORLD_WRITEABLE 控制权限。用于MODE_ENABLE_WRITE_AHEAD_LOGGING 默认启用预写记录。 |
厂 | 调用查询时调用实例化一个游标的可选工厂类。 |
errorHandler | 在DatabaseErrorHandler 当sqlite的报告数据库损坏时使用。如果为空,DefaultDatabaseErrorHandler 则为假。 |
返回
- 具有给定名称的新创建的数据库的内容。
public Intent registerReceiver (BroadcastReceiver receiver,IntentFilter filter)
注册要在主活动线程中运行的BroadcastReceiver。该 接收器将匹配任何广播意图被称为过滤器,在主应用程序线程。
该系统可以播放“粘性”的意图 - 这些在广播完成后留下来,发送到任何后续的注册。如果您的IntentFilter匹配这些粘意图之一,是意图将这个函数返回 ,并发送至接收器,就好像它刚刚被播出。
可能有多个粘性意图匹配过滤器,在这种情况下,这些将被发送到接收器。在这种情况下,这些函数只能直接返回其中的一个; 返回的哪一个由系统任意决定。
如果你知道你注册的意图是粘性的,你可以为你的接收者提供null 。在这种情况下,没有注册接收者 - 该函数只返回匹配过滤器的粘性意图。在多次匹配的情况下,适用与上述相同的规则。
查看BroadcastReceiver
有关Intent广播的更多信息。
由于ICE_CREAM_SANDWICH
,用这种方法注册的接收器将正确尊重 setPackage(String)
指定的意图正在播出。在此之前,它将被忽略并传递给所有匹配的注册接收器。如果使用这个安全,请小心。
注意:该方法不能从 BroadcastReceiver
组件调用; 也就是说,来自在应用程序的清单中声明的BroadcastReceiver。然而,可以从另一个已经在运行时注册的BroadcastReceiver来调用此方法registerReceiver(BroadcastReceiver, IntentFilter)
,因为这样注册的BroadcastReceiver的生命周期与注册的对象相关联。
参数
接收器 | BroadcastReceiver处理广播。 |
---|---|
过滤 | 选择要接收的意向广播。 |
返回
- 第一个粘性意图发现匹配过滤器,如果没有匹配过滤器,则为null。
public Intent registerReceiver (BroadcastReceiver receiver,IntentFilter filter,String broadcastPermission,Handlerscheduler)
注册接收意向广播,在调度程序的上下文中 运行。查看 registerReceiver(BroadcastReceiver, IntentFilter)
更多信息。这允许您强制执行谁可以向接收方广播意图的权限,或者让接收者在与主应用程序线程不同的线程中运行。
查看BroadcastReceiver
有关Intent广播的更多信息。
由于ICE_CREAM_SANDWICH
,用这种方法注册的接收器将正确尊重 setPackage(String)
指定的意图正在播出。在此之前,它将被忽略并传递给所有匹配的注册接收器。如果使用这个安全,请小心。
参数
接收器 | BroadcastReceiver处理广播。 |
---|---|
过滤 | 选择要接收的意向广播。 |
broadcastPermission | 字符串命名广播者必须持有的权限才能向您发送Intent。如果为空,则不需要权限。 |
调度器 | 处理程序识别将接收到意图的线程。如果为null,将使用进程的主线程。 |
返回
- 第一个粘性意图发现匹配过滤器,如果没有匹配过滤器,则为null。
public void removeStickyBroadcast (Intent intent)
删除以前发送的数据sendStickyBroadcast(Intent)
,这样就好像粘性广播从未发生过。
您必须持有该BROADCAST_STICKY
权限才能使用此API。如果您不持有该权限,SecurityException
将被抛出。
参数
意图 | 以前广播的意图。 |
---|
public void removeStickyBroadcastAsUser (Intent intent,UserHandle user)
版本removeStickyBroadcast(Intent)
允许您指定要发送广播的用户。这不适用于系统映像上未预先安装的应用程序。使用它需要持有INTERACT_ACROSS_USERS权限。
您必须持有该BROADCAST_STICKY
权限才能使用此API。如果您不持有该权限,SecurityException
将被抛出。
参数
意图 | 以前广播的意图。 |
---|---|
用户 | UserHandle从中删除粘性广播。 |
public void revokeUriPermission (Uri uri,int modeFlags)
删除所有访问以前添加的特定内容提供商Uri的权限grantUriPermission(String, Uri, int)
。给定的Uri将匹配与给定Uri相同或子路径的所有以前授予的Uris。也就是说,撤销“content:// foo / target”将撤销“content:// foo / target”和“content:// foo / target / sub”,而不是“content:// foo”。
参数
uri | 你想撤销Uri的访问权限。 |
---|---|
modeFlags | 所需的访问模式。任何组合 Intent.FLAG_GRANT_READ_URI_PERMISSION 或 Intent.FLAG_GRANT_WRITE_URI_PERMISSION 。 |
public void sendBroadcast (Intent intent)
将所有意向广播给所有感兴趣的BroadcastReceivers。这个调用是异步的 它立即返回,并且您将在运行接收器时继续执行。接收机不传播结果,接收机不能中止广播。如果要允许接收者传播结果或中止广播,则必须使用有序广播发送 sendOrderedBroadcast(Intent, String)
。
查看BroadcastReceiver
有关Intent广播的更多信息。
参数
意图 | 意图广播; 所有符合此意图的接收者都将收到广播。 |
---|
public void sendBroadcast (Intent intent,String receiverPermission)
将所有意向广播给所有感兴趣的BroadcastReceivers,允许执行可选的所需权限。这个调用是异步的 它立即返回,并且您将在运行接收器时继续执行。接收机不传播结果,接收机不能中止广播。如果要允许接收者传播结果或中止广播,则必须使用有序广播发送 sendOrderedBroadcast(Intent, String)
。
查看BroadcastReceiver
有关Intent广播的更多信息。
参数
意图 | 意图广播; 所有符合此意图的接收者都将收到广播。 |
---|---|
receiverPermission | (可选)字符串命名接收方必须拥有的权限才能接收广播。如果为空,则不需要权限。 |
public void sendBroadcastAsUser (Intent intent,UserHandle user)
版本sendBroadcast(Intent)
允许您指定要发送广播的用户。这不适用于系统映像上未预先安装的应用程序。使用它需要持有INTERACT_ACROSS_USERS权限。
参数
意图 | 意图广播 |
---|---|
用户 | UserHandle发送的意图。 |
public void sendBroadcastAsUser (Intent intent,UserHandle user,String receiverPermission)
版本sendBroadcast(Intent, String)
允许您指定要发送广播的用户。这不适用于系统映像上未预先安装的应用程序。使用它需要持有INTERACT_ACROSS_USERS权限。
参数
意图 | 意图广播; 所有符合此意图的接收者都将收到广播。 |
---|---|
用户 | UserHandle发送的意图。 |
receiverPermission | (可选)字符串命名接收方必须拥有的权限才能接收广播。如果为空,则不需要权限。 |
public void sendOrderedBroadcast (Intent intent,String receiverPermission,BroadcastReceiver resultReceiver,Handlerscheduler,int initialCode,String initialData,Bundle initialExtras)
版本sendBroadcast(Intent)
允许您从广播中接收数据。这是通过在调用时提供您自己的BroadcastReceiver来完成的,这将在广播结束时被视为最终的接收者 - 其onReceive(Context, Intent)
方法将使用从其他接收器收集 的结果值进行调用。广播将以与呼叫相同的方式进行序列化 sendOrderedBroadcast(Intent, String)
。
喜欢sendBroadcast(Intent)
,这种方法是异步的; 它将在resultReceiver.onReceive()被调用之前返回。
查看BroadcastReceiver
有关Intent广播的更多信息。
参数
意图 | 意图广播; 所有符合此意图的接收者都将收到广播。 |
---|---|
receiverPermission | 字符串命名接收者必须拥有的权限才能接收广播。如果为空,则不需要权限。 |
resultReceiver | 您自己的BroadcastReceiver将其视为广播的最终接收者。 |
调度器 | 用于调度resultReceiver回调的自定义处理程序; 如果为null,它将被安排在Context的主线程中。 |
initialCode | 结果代码的初始值。经常活动.RESULT_OK。 |
initialData | 结果数据的初始值。通常为零。 |
initialExtras | 结果额外的初始值。通常为零。 |
public void sendOrderedBroadcast (Intent intent,String receiverPermission)
将给定意图广播给所有感兴趣的BroadcastReceivers,一次提供一个,以允许更多的接收者在将其传送到较不优选的接收器之前消费广播。这个调用是异步的 它立即返回,并且您将在运行接收器时继续执行。
查看BroadcastReceiver
有关Intent广播的更多信息。
参数
意图 | 意图广播; 所有符合此意图的接收者都将收到广播。 |
---|---|
receiverPermission | (可选)字符串命名接收方必须拥有的权限才能接收广播。如果为空,则不需要权限。 |
public void sendOrderedBroadcastAsUser (Intent intent,UserHandle user,String receiverPermission,BroadcastReceiverresultReceiver,Handler scheduler,int initialCode,String initialData,Bundle initialExtras)
版本 sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
允许您指定要发送广播的用户。这不适用于系统映像上未预先安装的应用程序。使用它需要持有INTERACT_ACROSS_USERS权限。
查看BroadcastReceiver
有关Intent广播的更多信息。
参数
意图 | 意图广播; 所有符合此意图的接收者都将收到广播。 |
---|---|
用户 | UserHandle发送的意图。 |
receiverPermission | 字符串命名接收者必须拥有的权限才能接收广播。如果为空,则不需要权限。 |
resultReceiver | 您自己的BroadcastReceiver将其视为广播的最终接收者。 |
调度器 | 用于调度resultReceiver回调的自定义处理程序; 如果为null,它将被安排在Context的主线程中。 |
initialCode | 结果代码的初始值。经常活动.RESULT_OK。 |
initialData | 结果数据的初始值。通常为零。 |
initialExtras | 结果额外的初始值。通常为零。 |
public void sendStickyBroadcast (Intent intent)
执行一个sendBroadcast(Intent)
“粘性”,意味着广播完成后,您发送的意图将保持不变,以便其他人可以通过返回值快速检索该数据registerReceiver(BroadcastReceiver, IntentFilter)
。在所有其他方面,这样做都是一样的 sendBroadcast(Intent)
。
您必须持有该BROADCAST_STICKY
权限才能使用此API。如果您不持有该权限,SecurityException
将被抛出。
参数
意图 | 意图广播; 所有符合此意图的接收器都将接收广播,而意向将被重新广播到未来的接收者。 |
---|
public void sendStickyBroadcastAsUser (Intent intent,UserHandle user)
版本sendStickyBroadcast(Intent)
允许您指定要发送广播的用户。这不适用于系统映像上未预先安装的应用程序。使用它需要持有INTERACT_ACROSS_USERS权限。
参数
意图 | 意图广播; 所有符合此意图的接收器都将接收广播,而意向将被重新广播到未来的接收者。 |
---|---|
用户 | UserHandle发送的意图。 |
public void sendStickyOrderedBroadcast (Intent intent,BroadcastReceiver resultReceiver,Handler scheduler,int initialCode,String initialData,Bundle initialExtras)
版本sendStickyBroadcast(Intent)
允许您从广播中接收数据。这是通过在调用时提供您自己的BroadcastReceiver来完成的,这将在广播结束时被视为最终的接收者 - 其onReceive(Context, Intent)
方法将使用从其他接收器收集 的结果值进行调用。广播将以与呼叫相同的方式进行序列化 sendOrderedBroadcast(Intent, String)
。
喜欢sendBroadcast(Intent)
,这种方法是异步的; 它将在resultReceiver.onReceive()被调用之前返回。请注意,存储的粘性数据只是您最初提供给广播的数据,而不是由接收者进行的任何更改的结果。
查看BroadcastReceiver
有关Intent广播的更多信息。
参数
意图 | 意图广播; 所有符合此意图的接收者都将收到广播。 |
---|---|
resultReceiver | 您自己的BroadcastReceiver将其视为广播的最终接收者。 |
调度器 | 用于调度resultReceiver回调的自定义处理程序; 如果为null,它将被安排在Context的主线程中。 |
initialCode | 结果代码的初始值。经常活动.RESULT_OK。 |
initialData | 结果数据的初始值。通常为零。 |
initialExtras | 结果额外的初始值。通常为零。 |
public void sendStickyOrderedBroadcastAsUser (Intent intent,UserHandle user,BroadcastReceiver resultReceiver,Handlerscheduler,int initialCode,String initialData,Bundle initialExtras)
版本 sendStickyOrderedBroadcast(Intent, BroadcastReceiver, Handler, int, String, Bundle)
允许您指定要发送广播的用户。这不适用于系统映像上未预先安装的应用程序。使用它需要持有INTERACT_ACROSS_USERS权限。
查看BroadcastReceiver
有关Intent广播的更多信息。
参数
意图 | 意图广播; 所有符合此意图的接收者都将收到广播。 |
---|---|
用户 | UserHandle发送的意图。 |
resultReceiver | 您自己的BroadcastReceiver将其视为广播的最终接收者。 |
调度器 | 用于调度resultReceiver回调的自定义处理程序; 如果为null,它将被安排在Context的主线程中。 |
initialCode | 结果代码的初始值。经常活动.RESULT_OK。 |
initialData | 结果数据的初始值。通常为零。 |
initialExtras | 结果额外的初始值。通常为零。 |
public void setTheme (int resid)
设置这个上下文的基础主题。请注意,在上下文中实例化任何视图之前(例如在调用setContentView(View)
或 调用之前)应该调用此参数inflate(int, ViewGroup)
。
参数
渣滓 | 描述主题的风格资源。 |
---|
public void setWallpaper (InputStream data)
public void startActivities (Intent [] intents )
同样startActivities(Intent[], Bundle)
,没有指定的选项。
参数
意图 | 一系列意向启动。 |
---|
public void startActivities (Intent [] intents ,Bundle options)
启动多项新活动。这通常与调用 startActivity(Intent)
数组中的第一个Intent一样,在创建时调用startActivity(Intent)
第二个条目的活动等。请注意,与该方法不同,通常不会在此创建除数组中最后一个以外的任何活动点,而是当用户首次访问它们时(由于从顶部的活动返回)创建。
ActivityNotFoundException
如果没有为任何给定的Intent 找到活动,此方法将抛出。在这种情况下,活动堆栈的状态是未定义的(列表中的某些意图可能在其中,有些不在),因此您可能希望避免这种情况。
参数
意图 | 一系列意向启动。 |
---|---|
选项 | 关于如何启动活动的其他选项。查看Context.startActivity(Intent, Bundle) 更多详情。 |
public void startActivity (Intent intent)
同样startActivity(Intent, Bundle)
,没有指定的选项。
参数
意图 | 描述要开始的活动。 |
---|
public void startActivity (Intent intent,Bundle options)
启动新的活动。您将不会收到有关活动何时退出的任何信息。
请注意,如果从外部调用此方法 Activity
,则Intent必须包含FLAG_ACTIVITY_NEW_TASK
启动标志。这是因为,没有从现有的活动开始,没有任何现有的任务来放置新的活动,因此它需要放在自己的单独任务中。
ActivityNotFoundException
如果没有找到运行给定Intent的Activity,该方法将抛出。
参数
意图 | 描述要开始的活动。 |
---|---|
选项 | 关于如何启动活动的其他选项。如果没有选项,可能为null。看看ActivityOptions 如何构建这里提供的捆绑包; 没有支持手动构建它们的定义。 |
public boolean startInstrumentation (ComponentName className,String profileFile,Bundle arguments)
开始执行一个Instrumentation
类。给定的Instrumentation组件将通过杀死其目标应用程序(如果当前运行),启动目标进程,实例化仪器组件,然后让其驱动应用程序来运行。
此功能不是同步的 - 一旦仪器启动并运行,它将返回。
仪器通常只允许与未签名或签名的软件包一起运行,该软件包也带有签名的签名(确保目标信任工具)。
参数
班级名称 | 要运行的Instrumentation组件的名称。 |
---|---|
profileFile | 仪表运行时写入分析数据的可选路径,否则不进行分析。 |
参数 | 附加的可选参数传递给仪器,或为空。 |
返回
true
如果仪器成功启动,否则false
无法找到。
public void startIntentSender (IntentSender intent,Intent fillInIntent,int flagsMask,int flagsValues,int extraFlags,Bundleoptions)
喜欢startActivity(Intent, Bundle)
,但采取IntentSender启动。如果IntentSender是一个活动,那么这个活动就像你在startActivity(Intent)
这里打电话给你一样;否则,它的相关联的动作将被执行(例如发送广播),就像你已经调用 IntentSender.sendIntent
一样。
参数
意图 | IntentSender启动。 |
---|---|
fillInIntent | 如果非空,则将作为intent参数提供sendIntent(Context, int, Intent, IntentSender.OnFinished, Handler) 。 |
flagsMask | 您想要更改的原始IntentSender中的Intent标志。 |
flagsValues | 在flagsMask中设置的任何位的所需值 |
extraFlags | 始终设置为0。 |
选项 | 关于如何启动活动的其他选项。查看Context.startActivity(Intent, Bundle) 更多详情。如果IntentSender还提供了选项,这里给出的选项将覆盖与IntentSender给出的任何冲突。 |
public void startIntentSender (IntentSender intent,Intent fillInIntent,int flagsMask,int flagsValues,int extraFlags)
参数
意图 | IntentSender启动。 |
---|---|
fillInIntent | 如果非空,则将作为intent参数提供sendIntent(Context, int, Intent, IntentSender.OnFinished, Handler) 。 |
flagsMask | 您想要更改的原始IntentSender中的Intent标志。 |
flagsValues | 在flagsMask中设置的任何位的所需值 |
extraFlags | 始终设置为0。 |
public ComponentName startService (意图服务)
请求启动给定的应用程序服务。意图应包含要启动的特定服务实现的完整类名称或要定位的特定包名称。如果Intent指定较少,则会记录有关此警告的信息,并且查找和使用的多个匹配服务中的哪一个将不被定义。如果此服务尚未运行,它将被实例化并启动(如果需要,为其创建一个进程); 如果它正在运行,那么它仍然运行。
对此方法的每次调用将导致对目标服务onStartCommand(Intent, int, int)
方法的相应调用,具有此处给出的意图。这提供了一种方便的方式将作业提交到服务,而无需绑定和调用其接口。
使用startService()将覆盖由bindService(Intent, ServiceConnection, int)
以下管理的默认服务生命周期:它要求服务保持运行直到stopService(Intent)
被调用,而不管任何客户端是否连接到它。请注意,对startService()的调用不是嵌套的:无论你调用startService()多少次,一次调用stopService(Intent)
将会停止它。
系统尝试尽可能多地运行服务。他们应该停止的唯一时间是,如果当前的前台应用程序正在使用这么多资源,服务需要被杀死。如果在服务过程中发生任何错误,它将自动重新启动。
SecurityException
如果您没有启动给定服务的权限,则此函数将抛出。
参数
服务 | 标识要开始的服务。意图必须是完全显式的(提供组件名称)或指定其定向的特定包名称。附加值可能包含在意向附加中,以提供参数以及此特定的开始调用。 |
---|
返回
- 如果服务正在启动或已经运行,
ComponentName
则返回已启动的实际服务; 否则如果服务不存在则返回null。
public boolean stopService (Intent name)
请求停止给定的应用程序服务。如果服务没有运行,没有任何反应。否则停止。请注意,对startService()的调用不计算在内,无论启动多少次,都会停止该服务。
请注意,如果停止的服务仍然具有与ServiceConnection
集合绑定的对象BIND_AUTO_CREATE
,则在所有这些绑定都被删除之前,它将不会被销毁。有关Service
服务生命周期的更多详细信息,请参阅文档。
SecurityException
如果您没有停止给定服务的权限,则此函数将抛出。
参数
名称 | 要停止的服务说明 意图必须是完全显式的(提供组件名称)或指定其定向的特定包名称。 |
---|
返回
- 如果存在与已经运行的给定Intent匹配的服务,则它被停止并被
true
返回; 否则false
返回。
public void unbindService (ServiceConnection conn)
断开应用程序服务。随着服务重新启动,您将不再接听电话,现在该服务可以随时停止。
参数
康 | 之前提供给bindService()的连接接口。此参数不能为空。 |
---|
public void unregisterReceiver (BroadcastReceiver receiver)
取消注册之前注册的BroadcastReceiver。 已经为此BroadcastReceiver注册的所有过滤器将被删除。
参数
接收器 | BroadcastReceiver取消注册。 |
---|
保护方法
java.lang.Object | ||
↳ | android.content.Context | |
↳ | android.content.ContextWrapper |
已知的直接子类 |
已知的间接子类 |
班级概况
代理实现Context,将其所有调用简单地委派给另一个Context。可以被子类化以修改行为而不改变原始上下文。
概要
[扩大]
继承常量
| |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
从类 android.content.Context
|
公共建设者 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
ContextWrapper ( Context base) |
公共方法 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
布尔值 |
bindService
(
Intent
service,
ServiceConnection
conn,int flags)
连接到应用程序服务,如果需要创建它。
| ||||||||||
int |
checkCallingOrSelfPermission
(
String
permission)
确定是否一个IPC的调用过程
,或者您
已被授予特定权限。
| ||||||||||
int |
checkCallingOrSelfUriPermission
(
Uri
uri,int modeFlags)
确定是否一个IPC的调用过程
,或者你
已经获准访问特定URI。
| ||||||||||
int |
checkCallingPermission
(
String
permission)
确定您正在处理的IPC的调用进程是否已获得特定权限。
| ||||||||||
int |
checkCallingUriPermission
(
Uri
uri,int modeFlags)
确定呼叫进程和用户ID是否被授予访问特定URI的权限。
| ||||||||||
int |
checkPermission
(
String
权限,int pid,int uid)
确定在系统中运行的特定进程和用户ID是否允许给定的权限。
| ||||||||||
int |
checkUriPermission
(
Uri
uri,int pid,int uid,int modeFlags)
确定特定进程和用户标识是否已被授予访问特定URI的权限。
| ||||||||||
int |
checkUriPermission
(
Uri
uri,
String
readPermission,
String
writePermission,int pid,int uid,int modeFlags)
检查Uri和正常许可。
| ||||||||||
void | clearWallpaper () | ||||||||||
背景 |
createConfigurationContext
(
配置
overrideConfiguration)
为当前上下文返回一个新的Context对象,但其资源被调整以匹配给定的配置。
| ||||||||||
背景 |
createDisplayContext
(
显示
显示)
为当前上下文返回一个新的Context对象,并调整其资源以匹配给定Display的指标。
| ||||||||||
背景 |
createPackageContext
(
String
packageName,int flags)
为给定的应用程序名称返回一个新的Context对象。
| ||||||||||
串[] |
databaseList
()
返回与该Context的应用程序包相关联的私有数据库的字符串数组。
| ||||||||||
布尔值 |
deleteDatabase
(
String
name)
删除与此Context的应用程序包关联的现有私有SQLiteDatabase。
| ||||||||||
布尔值 |
deleteFile
(
String
name)
删除与该Context的应用程序包相关联的给定私有文件。
| ||||||||||
void | enforceCallingOrSelfPermission ( 字符串 权限, 字符串 消息) | ||||||||||
void | enforceCallingOrSelfUriPermission ( Uri uri,int modeFlags, String message) | ||||||||||
void | enforceCallingPermission ( String 权限, String 消息) | ||||||||||
void | enforceCallingUriPermission ( Uri uri,int modeFlags, String message) | ||||||||||
void | enforcePermission ( String 权限,int pid,int uid, String 消息) | ||||||||||
void | enforceUriPermission ( Uri uri,int pid,int uid,int modeFlags, String message) | ||||||||||
void |
enforceUriPermission
(
Uri
uri,
String
readPermission,
String
writePermission,int pid,int uid,int modeFlags,
String
message)
执行Uri和正常许可。
| ||||||||||
串[] |
fileList
()
返回一个字符串数组,命名与该Context的应用程序包关联的私有文件。
| ||||||||||
背景 |
getApplicationContext
()
返回当前进程的单个全局Application对象的上下文。
| ||||||||||
ApplicationInfo |
getApplicationInfo
()
返回此上下文的包的完整应用程序信息。
| ||||||||||
AssetManager |
getAssets
()
返回应用程序包的AssetManager实例。
| ||||||||||
背景 | getBaseContext () | ||||||||||
文件 |
getCacheDir
()
返回文件系统上应用程序特定缓存目录的绝对路径。
| ||||||||||
ClassLoader |
getClassLoader
()
返回一个可以用来检索此包中的类的类加载器。
| ||||||||||
ContentResolver |
getContentResolver
()
返回应用程序包的ContentResolver实例。
| ||||||||||
文件 | getDatabasePath ( String name) | ||||||||||
文件 |
getDir
(
String
name,int mode)
检索,创建如果需要,一个新的目录,应用程序可以在其中放置自己的自定义数据文件。
| ||||||||||
文件 | getExternalCacheDir () | ||||||||||
文件[] |
GetExternalCacheDirs
()
在应用程序可以放置其所拥有的高速缓存文件的所有外部存储设备上返回到特定于应用程序的目录的绝对路径。
| ||||||||||
文件 | getExternalFilesDir ( String type) | ||||||||||
文件[] |
getExternalFilesDirs
(
String
type)
返回所有外部存储设备上应用程序特定目录的绝对路径,应用程序可以放置其拥有的持久性文件。
| ||||||||||
文件 | getFileStreamPath ( String name) | ||||||||||
文件 | getFilesDir () | ||||||||||
Looper |
getMainLooper
()
为当前进程的主线程返回Looper。
| ||||||||||
文件 |
getObbDir
()
返回可以找到此应用程序的OBB文件(如果有的话)的主外部存储目录。
| ||||||||||
文件[] |
getObbDirs
()
返回所有外部存储设备上应用程序特定目录的绝对路径,其中可以找到应用程序的OBB文件(如果有的话)。
| ||||||||||
串 |
getPackageCodePath
()
返回此上下文的主要Android软件包的完整路径。
| ||||||||||
PackageManager |
getPackageManager
()
返回PackageManager实例以查找全局包信息。
| ||||||||||
串 |
getPackageName
()
返回此应用程序的包的名称。
| ||||||||||
串 |
getPackageResourcePath
()
返回此上下文的主要Android软件包的完整路径。
| ||||||||||
资源 |
getResources
()
为应用程序的包返回一个Resources实例。
| ||||||||||
SharedPreferences |
getSharedPreferences
(
String
name,int mode)
检索并保留首选项文件'name'的内容,返回一个SharedPreferences,通过它可以检索和修改其值。
| ||||||||||
目的 |
getSystemService
(
String
name)
通过名称将句柄返回到系统级服务。
| ||||||||||
资源 |
getTheme
()
返回与此上下文关联的Theme对象。
| ||||||||||
可抽出 | getWallpaper () | ||||||||||
int | getWallpaperDesiredMinimumHeight () | ||||||||||
int | getWallpaperDesiredMinimumWidth () | ||||||||||
void |
grantUriPermission
(
String
toPackage,
Uri
uri,int modeFlags)
授予访问特定Uri到另一个包的权限,无论该包是否具有访问Uri内容提供商的一般权限。
| ||||||||||
布尔值 |
isRestricted
()
指示此上下文是否受限。
| ||||||||||
FileInputStream |
openFileInput
(
String
name)
打开与该Context的应用程序包相关联的私有文件进行阅读。
| ||||||||||
FileOutputStream |
openFileOutput
(
String
name,int mode)
打开与此Context的应用程序包相关联的私有文件进行写入。
| ||||||||||
SQLiteDatabase |
openOrCreateDatabase
(
String
name,int mode,
SQLiteDatabase.CursorFactory
factory)
打开与此Context的应用程序包关联的新的私有SQLiteDatabase。
| ||||||||||
SQLiteDatabase |
openOrCreateDatabase
(
String
name,int mode,
SQLiteDatabase.CursorFactory
factory,
DatabaseErrorHandler
errorHandler)
打开与此Context的应用程序包关联的新的私有SQLiteDatabase。
| ||||||||||
可抽出 | peekWallpaper () | ||||||||||
意图 |
registerReceiver
(
BroadcastReceiver
receiver,
IntentFilter
过滤器)
注册要在主活动线程中运行的BroadcastReceiver。
| ||||||||||
意图 |
registerReceiver
(
BroadcastReceiver
receiver,
IntentFilter
filter,
String
broadcastPermission,
Handler
scheduler)
注册接收意向广播,在调度程序的上下文中
运行
。
| ||||||||||
void | removeStickyBroadcast ( 意图 意图) | ||||||||||
void | removeStickyBroadcastAsUser ( Intent intent, UserHandle 用户) | ||||||||||
void | revokeUriPermission ( Uri uri,int modeFlags) | ||||||||||
void |
sendBroadcast
(
意图
意图)
将所有意向广播给所有感兴趣的BroadcastReceivers。
| ||||||||||
void |
sendBroadcast
(
Intent
intent,
String
receiverPermission)
将所有意向广播给所有感兴趣的BroadcastReceivers,允许执行可选的所需权限。
| ||||||||||
void | sendBroadcastAsUser ( Intent intent, UserHandle 用户) | ||||||||||
void | sendBroadcastAsUser ( Intent intent, UserHandle user, String receiverPermission) | ||||||||||
void | sendOrderedBroadcast ( Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,int initialCode, String initialData, Bundle initialExtras) | ||||||||||
void |
sendOrderedBroadcast
(
Intent
intent,
String
receiverPermission)
将给定意图广播给所有感兴趣的BroadcastReceivers,一次提供一个,以允许更多的接收者在将其传送到较不优选的接收器之前消费广播。
| ||||||||||
void | sendOrderedBroadcastAsUser ( Intent intent, UserHandle user, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,int initialCode, String initialData, Bundle initialExtras) | ||||||||||
void |
sendStickyBroadcast
(
意图
意图)
执行一个
sendBroadcast(Intent)
“粘性”,意思是在广播完成后,您发送的意图将保持不变,以便其他人可以通过返回值快速检索该数据
registerReceiver(BroadcastReceiver, IntentFilter)
。
| ||||||||||
void | sendStickyBroadcastAsUser ( 意图 意图, UserHandle 用户) | ||||||||||
void | sendStickyOrderedBroadcast ( Intent intent, BroadcastReceiver resultReceiver, Handler scheduler,int initialCode, String initialData, Bundle initialExtras) | ||||||||||
void | sendStickyOrderedBroadcastAsUser ( Intent intent, UserHandle user, BroadcastReceiver resultReceiver, Handler scheduler,int initialCode, String initialData, Bundle initialExtras) | ||||||||||
void |
setTheme
(int)
设置这个上下文的基础主题。
| ||||||||||
void | setWallpaper ( 位 图位图) | ||||||||||
void | setWallpaper ( InputStream data) | ||||||||||
void | startActivities ( Intent [] intents) | ||||||||||
void |
startActivities
(
Intent []
intents
,
Bundle
选项)
启动多项新活动。
| ||||||||||
void | startActivity ( 意图 意图) | ||||||||||
void |
startActivity
(
意图
意图,
捆绑
选项)
启动新的活动。
| ||||||||||
布尔值 | startInstrumentation ( ComponentName className, String profileFile, Bundle 参数) | ||||||||||
void | startIntentSender ( IntentSender intent, Intent fillInIntent,int flagsMask,int flagsValues,int extraFlags, Bundle options) | ||||||||||
void | startIntentSender ( IntentSender intent, Intent fillInIntent,int flagsMask,int flagsValues,int extraFlags) | ||||||||||
ComponentName |
startService
(
意图
服务)
请求启动给定的应用程序服务。
| ||||||||||
布尔值 |
stopService
(
意图
名称)
请求停止给定的应用程序服务。
| ||||||||||
void |
unbindService
(
ServiceConnection
conn)
断开应用程序服务。
| ||||||||||
void |
unregisterReceiver
(
BroadcastReceiver
receiver)
取消注册之前注册的BroadcastReceiver。
|
保护方法 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
void |
attachBaseContext
(
Context
base)
设置此ContextWrapper的基本上下文。
|
[扩大]
继承方法
| |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
从类 android.content.Context
| |||||||||||
从类 java.lang.Object
|
公共建设者
公共方法
public boolean bindService (Intent service,ServiceConnection conn,int flags)
连接到应用程序服务,如果需要创建它。这定义了应用程序和服务之间的依赖关系。给定的 连接将在创建时接收服务对象,并被告知它是否死亡并重新启动。只要呼叫上下文存在,该服务将被认为是系统所需要的。例如,如果此上下文是停止的活动,则在恢复活动之前,该服务将不再需要继续运行。
SecurityException
如果您没有绑定到给定服务的权限,则此函数将抛出。
注意:不能从BroadcastReceiver
组件调用 此方法。您可以使用从BroadcastReceiver到Service的通信的模式是调用 startService(Intent)
包含要发送的命令的参数,服务stopSelf(int)
在执行该命令时调用其 方法。请参阅API演示应用程序/服务/服务启动参数控制器。然而,使用已经注册的BroadcastReceiver的此方法是可以的 registerReceiver(BroadcastReceiver, IntentFilter)
,因为该BroadcastReceiver的生命周期与另一个对象(注册它的对象)绑定在一起。
参数
服务 | 标识要连接的服务。Intent可以指定显式组件名称或逻辑描述(操作,类别等)以匹配 IntentFilter 服务发布的内容。 |
---|---|
康 | 当服务启动和停止时接收信息。这必须是一个有效的ServiceConnection对象; 它不能为null。 |
标志 | 绑定的操作选项。可能是0, , BIND_AUTO_CREATE ,BIND_DEBUG_UNBIND , BIND_NOT_FOREGROUND ,BIND_ABOVE_CLIENT , BIND_ALLOW_OOM_MANAGEMENT 或BIND_WAIVE_PRIORITY 。 |
返回
- 如果您已成功绑定到该服务,
true
则返回;false
如果没有连接,则返回,因此您将不会收到服务对象。
public int checkCallingOrSelfPermission (String permission)
确定是否一个IPC的调用过程,或者您已被授予特定权限。这是一样的 checkCallingPermission(String)
,除非它授予您自己的权限,如果您当前没有处理IPC。小心使用!
参数
允许 | 正在检查的权限的名称。 |
---|
返回
PERMISSION_GRANTED
如果调用pid / uid被允许该权限,或者PERMISSION_DENIED
如果不是。
public int checkCallingOrSelfUriPermission (Uri uri,int modeFlags)
确定是否一个IPC的调用过程,或者你已经获准访问特定URI。这是一样的 checkCallingUriPermission(Uri, int)
,除非它授予您自己的权限,如果您当前没有处理IPC。小心使用!
参数
uri | 正在检查的uri。 |
---|---|
modeFlags | 获得授权的类型。可能是一个或两个 Intent.FLAG_GRANT_READ_URI_PERMISSION 或 Intent.FLAG_GRANT_WRITE_URI_PERMISSION 。 |
返回
PERMISSION_GRANTED
如果呼叫者被允许访问该uri,或者PERMISSION_DENIED
如果不是。
public int checkCallingPermission (String permission)
确定您正在处理的IPC的调用进程是否已获得特定权限。这基本上是与调用 checkPermission(String, int, int)
与PID和返回UID getCallingPid()
和getCallingUid()
。一个重要的区别是,如果您当前没有处理IPC,则此功能将始终失败。这样做是为了防止意外泄漏的权限; 你可以checkCallingOrSelfPermission(String)
用来避免这种保护。
参数
允许 | 正在检查的权限的名称。 |
---|
返回
PERMISSION_GRANTED
如果调用pid / uid被允许该权限,或者PERMISSION_DENIED
如果不是。
public int checkCallingUriPermission (Uri uri,int modeFlags)
确定调用进程和用户标识是否已被授予访问特定URI的权限。这基本上是与调用checkUriPermission(Uri, int, int, int)
与PID和返回UID getCallingPid()
和getCallingUid()
。一个重要的区别是,如果您当前没有处理IPC,则此功能将始终失败。
参数
uri | 正在检查的uri。 |
---|---|
modeFlags | 获得授权的类型。可能是一个或两个 Intent.FLAG_GRANT_READ_URI_PERMISSION 或 Intent.FLAG_GRANT_WRITE_URI_PERMISSION 。 |
返回
PERMISSION_GRANTED
如果呼叫者被允许访问该uri,或者PERMISSION_DENIED
如果不是。
public int checkPermission (String permission,int pid,int uid)
确定在系统中运行的特定进程和用户ID是否允许给定的权限。
参数
允许 | 正在检查的权限的名称。 |
---|---|
pid | 要检查的进程ID。必须> 0。 |
uid | 要检查的用户ID。0的用户是root用户,它将通过每个权限检查。 |
返回
PERMISSION_GRANTED
如果给定的pid / uid被允许,或者PERMISSION_DENIED
如果不是。
public int checkUriPermission (Uri uri,int pid,int uid,int modeFlags)
确定特定进程和用户标识是否已被授予访问特定URI的权限。这只会检查明确授予的权限 - 如果给定的进程/ uid具有对URI内容提供商的更一般访问权限,则此检查将始终失败。
参数
uri | 正在检查的uri。 |
---|---|
pid | 要检查的进程ID。必须> 0。 |
uid | 要检查的用户ID。0的用户是root用户,它将通过每个权限检查。 |
modeFlags | 获得授权的类型。可能是一个或两个 Intent.FLAG_GRANT_READ_URI_PERMISSION 或 Intent.FLAG_GRANT_WRITE_URI_PERMISSION 。 |
返回
PERMISSION_GRANTED
如果给定的pid / uid被允许访问该uri,或者PERMISSION_DENIED
如果不是。
public int checkUriPermission (Uri uri,String readPermission,String writePermission,int pid,int uid,int modeFlags)
检查Uri和正常许可。这使您可以同时执行checkPermission(String, int, int)
,并checkUriPermission(Uri, int, int, int)
在一次调用。
参数
uri | Uri的权限要检查,否则不执行此检查。 |
---|---|
readPermission | 提供整体读取权限的权限,否则不执行此检查。 |
writePermission | 提供整体写入权限的权限,否则不执行此检查。 |
pid | 要检查的进程ID。必须> 0。 |
uid | 要检查的用户ID。0的用户是root用户,它将通过每个权限检查。 |
modeFlags | 获得授权的类型。可能是一个或两个 Intent.FLAG_GRANT_READ_URI_PERMISSION 或 Intent.FLAG_GRANT_WRITE_URI_PERMISSION 。 |
返回
PERMISSION_GRANTED
如果呼叫者被允许访问该uri或保持一个给定的权限,或者PERMISSION_DENIED
如果不是。
public void clearWallpaper ()
public Context createConfigurationContext (配置 overrideConfiguration)
为当前上下文返回一个新的Context对象,但其资源被调整以匹配给定的配置。每次调用此方法返回一个Context对象的新实例; 上下文对象不是共享的,但是通常的状态(ClassLoader,同一配置的其他资源)可能是这样,Context本身可以是相当轻量级的。
参数
overrideConfiguration | 一个Configuration 指定什么值在原来的语境资源的基础配置进行修改。如果基本配置发生更改(例如由于方向更改),则此上下文的资源也将更改,除了那些已使用值显式覆盖的内容。 |
---|
返回
- A
Context
给定配置覆盖。
public Context createDisplayContext (显示显示)
为当前上下文返回一个新的Context对象,并调整其资源以匹配给定Display的指标。每次调用此方法返回一个Context对象的新实例; 上下文对象不是共享的,但是通常的状态(ClassLoader,同一配置的其他资源)可能是这样,Context本身可以是相当轻量级的。返回的显示上下文提供了一个配置为在给定显示上显示窗口的WindowManager
(见getSystemService(String)
)。WindowManager的getDefaultDisplay()
方法可以用于从返回的上下文中检索显示。
参数
显示 | 一个Display 对象,指定要衡量Context资源的度量标准的显示,以及应显示哪些新窗口。 |
---|
返回
- A
Context
用于显示。
public Context createPackageContext (String packageName,int flags)
为给定的应用程序名称返回一个新的Context对象。该上下文与命名应用程序启动时获取的内容相同,包含相同的资源和类加载器。每次调用此方法返回一个Context对象的新实例; 上下文对象不共享,但它们共享公共状态(Resources,ClassLoader等),因此Context实例本身是相当轻量级的。
PackageManager.NameNotFoundException
如果没有给定的包名称的应用程序,则抛出。
抛出SecurityException
如果请求上下文不能加载到调用者的出于安全原因的过程(参见 CONTEXT_INCLUDE_CODE
更多信息}。
参数
packageName | 应用程序包的名称 |
---|---|
标志 | 选项标志,其中之一CONTEXT_INCLUDE_CODE 或CONTEXT_IGNORE_SECURITY 。 |
返回
- A
Context
用于应用程序。
public boolean deleteDatabase (String name)
删除与此Context的应用程序包关联的现有私有SQLiteDatabase。
参数
名称 | 数据库的名称(在应用程序包中唯一)。 |
---|
返回
true
如果数据库被成功删除; 否则false
。
public boolean deleteFile (String name)
删除与该Context的应用程序包相关联的给定私有文件。
参数
名称 | 要删除的文件的名称; 不能包含路径分隔符。 |
---|
返回
true
如果文件已成功删除; 否则false
。
public void enforceCallingOrSelfPermission (String permission,String message)
如果您和您正在处理的IPC的调用进程都不被授予特定权限,则抛出一个 SecurityException
。这是一样的enforceCallingPermission(String, String)
,除非它授予您自己的权限,如果您当前没有处理IPC。小心使用!
参数
允许 | 正在检查的权限的名称。 |
---|---|
信息 | 如果抛出异常,则包含该消息。 |
public void enforceCallingOrSelfUriPermission (Uri uri,int modeFlags,String message)
如果IPC的调用过程或者您没有被授予访问特定URI的权限,则抛出SecurityException
。这是一样的enforceCallingUriPermission(Uri, int, String)
,除非它授予您自己的权限,如果您当前没有处理IPC。小心使用!
参数
uri | 正在检查的uri。 |
---|---|
modeFlags | 获得授权的类型。可能是一个或两个 Intent.FLAG_GRANT_READ_URI_PERMISSION 或 Intent.FLAG_GRANT_WRITE_URI_PERMISSION 。 |
信息 | 如果抛出异常,则包含该消息。 |
public void enforceCallingPermission (String permission,String message)
如果您正在处理的IPC的调用进程尚未被授予特定权限,则抛出一个SecurityException
。这基本上是与调用 enforcePermission(String, int, int, String)
与PID和返回UID getCallingPid()
和getCallingUid()
。一个重要的区别是,如果您当前没有处理IPC,则此函数将始终抛出SecurityException异常。这样做是为了防止意外泄漏的权限; 你可以enforceCallingOrSelfPermission(String, String)
用来避免这种保护。
参数
允许 | 正在检查的权限的名称。 |
---|---|
信息 | 如果抛出异常,则包含该消息。 |
public void enforceCallingUriPermission (Uri uri,int modeFlags,String message)
如果调用进程和用户标识未被授予访问特定URI的权限,则抛出SecurityException
。这基本上是与调用 enforceUriPermission(Uri, int, int, int, String)
与PID和返回UID getCallingPid()
和getCallingUid()
。一个重要的区别是,如果您当前没有处理IPC,则此函数将始终抛出SecurityException异常。
参数
uri | 正在检查的uri。 |
---|---|
modeFlags | 获得授权的类型。可能是一个或两个 Intent.FLAG_GRANT_READ_URI_PERMISSION 或 Intent.FLAG_GRANT_WRITE_URI_PERMISSION 。 |
信息 | 如果抛出异常,则包含该消息。 |
public void enforcePermission (String permission,int pid,int uid,String message)
如果在系统中运行的特定进程和用户ID不允许给定的权限,则抛出一个SecurityException
。
参数
允许 | 正在检查的权限的名称。 |
---|---|
pid | 要检查的进程ID。必须> 0。 |
uid | 要检查的用户ID。0的用户是root用户,它将通过每个权限检查。 |
信息 | 如果抛出异常,则包含该消息。 |
public void enforceUriPermission (Uri uri,int pid,int uid,int modeFlags,String message)
如果特定进程和用户ID未被授予访问特定URI的权限,则抛出SecurityException
。这只会检查明确授予的权限 - 如果给定的进程/ uid具有对URI内容提供商的更一般访问权限,则此检查将始终失败。
参数
uri | 正在检查的uri。 |
---|---|
pid | 要检查的进程ID。必须> 0。 |
uid | 要检查的用户ID。0的用户是root用户,它将通过每个权限检查。 |
modeFlags | 获得授权的类型。可能是一个或两个 Intent.FLAG_GRANT_READ_URI_PERMISSION 或 Intent.FLAG_GRANT_WRITE_URI_PERMISSION 。 |
信息 | 如果抛出异常,则包含该消息。 |
public void enforceUriPermission (Uri uri,String readPermission,String writePermission,int pid,int uid,int modeFlags,String message)
执行Uri和正常许可。这使您可以同时执行enforcePermission(String, int, int, String)
,并enforceUriPermission(Uri, int, int, int, String)
在一次调用。
参数
uri | Uri的权限要检查,否则不执行此检查。 |
---|---|
readPermission | 提供整体读取权限的权限,否则不执行此检查。 |
writePermission | 提供整体写入权限的权限,否则不执行此检查。 |
pid | 要检查的进程ID。必须> 0。 |
uid | 要检查的用户ID。0的用户是root用户,它将通过每个权限检查。 |
modeFlags | 获得授权的类型。可能是一个或两个 Intent.FLAG_GRANT_READ_URI_PERMISSION 或 Intent.FLAG_GRANT_WRITE_URI_PERMISSION 。 |
信息 | 如果抛出异常,则包含该消息。 |
public Context getApplicationContext ()
返回当前进程的单个全局Application对象的上下文。这通常只能在需要一个生命周期与当前上下文分开的Context的情况下使用,该过程与进程的生命周期而不是当前组件相关联。
考虑一下如何与之互动 registerReceiver(BroadcastReceiver, IntentFilter)
:
-
如果从活动上下文中使用,接收方正在该活动中注册。这意味着在活动完成销毁之前,您应该注销; 事实上,如果你不这样做,框架将清理您的泄漏注册,因为它删除活动并记录错误。因此,如果您使用活动上下文来注册一个静态的接收者(对进程的全局性,与活动实例无关),那么该注册将被删除,无论您使用的活动被销毁。
-
如果从这里返回的上下文使用,接收方正在注册与您的应用程序相关联的全局状态。因此,永远不会被你注册。如果接收器与静态数据相关联,而不是特定的组件,则这是必要的。但是如果您忘记取消注册,取消绑定等等,那么在其他地方使用ApplicationContext可能会导致严重的泄漏。
public File getCacheDir ()
返回文件系统上应用程序特定缓存目录的绝对路径。这些文件将是设备在存储空间不足时首先被删除的文件。这些文件将被删除不能保证。 注意:您不应该依靠系统为您删除这些文件; 您应该总是有一个合理的最大值,例如1 MB,用于使用缓存文件的空间量,并在超出该空间时修剪这些文件。
返回
- 目录保存应用程序缓存文件的路径。
public File getDatabasePath (String name)
返回openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory)
存储创建数据库的文件系统上的绝对路径 。
参数
名称 | 要获取路径的数据库的名称。 |
---|
返回
- 给定数据库的绝对路径。
public File getDir (String name,int mode)
检索,创建如果需要,一个新的目录,应用程序可以在其中放置自己的自定义数据文件。您可以使用返回的File对象来创建和访问此目录中的文件。请注意,通过File对象创建的文件只能由您自己的应用程序访问; 您只能设置整个目录的模式,而不是单个文件。
参数
名称 | 要检索的目录的名称。这是作为应用程序数据一部分创建的目录。 |
---|---|
模式 | 操作模式。使用0或MODE_PRIVATE 默认操作,MODE_WORLD_READABLE 并 MODE_WORLD_WRITEABLE 控制权限。 |
返回
- 一个
File
请求的目录对象。该目录将被创建,如果它不存在。
public File getExternalCacheDir ()
返回主外部文件系统(即Environment.getExternalStorageDirectory()
应用程序可以放置其所拥有的缓存文件的位置)的绝对路径,这些文件在应用程序的内部,用户通常不作为媒体可见。
这就像getCacheDir()
在卸载应用程序时这些文件将被删除,但是有一些重要的区别:
- 该平台并不总是监视外部存储器中可用的空间,因此可能不会自动删除这些文件。目前,这里的唯一时间文件将被平台删除,当运行
JELLY_BEAN_MR1
或更新时Environment.isExternalStorageEmulated()
返回true。请注意,您应该管理您将使用的最大空间,就像这样getCacheDir()
。 - 外部文件不总是可用的:如果用户将外部存储器安装在计算机上或将其删除,则它们将消失。有关
Environment
存储状态的信息,请参阅API 。 - 这些文件没有执行安全性。例如,任何持有的应用程序
WRITE_EXTERNAL_STORAGE
都可以写入这些文件。
从开始KITKAT
,无需读取或写入返回路径的权限; 呼叫应用程序始终可以访问它。这仅适用于为调用应用程序的程序包名生成的路径。访问属于其他包的路径WRITE_EXTERNAL_STORAGE
和/或是READ_EXTERNAL_STORAGE
必需的。
在具有多个用户(如描述UserManager
)的设备上,每个用户都有自己的隔离外部存储。应用程序只能为运行的用户访问外部存储。
返回
- 在外部存储器上保存应用程序缓存文件的目录的路径。如果外部存储器当前未安装,则返回null,因此无法确保路径存在; 当可用时,您将需要再次调用此方法。
public File [] getExternalCacheDirs ()
在应用程序可以放置其所拥有的高速缓存文件的所有外部存储设备上返回到特定于应用程序的目录的绝对路径。这些文件是应用程序内部的,通常用户作为媒体通常不可见。
这就像getCacheDir()
在卸载应用程序时这些文件将被删除,但是有一些重要的区别:
- 外部文件不总是可用的:如果用户将外部存储器安装在计算机上或将其删除,则它们将消失。
- 这些文件没有执行安全性。
这里返回的外部存储设备被认为是设备的永久部分,包括模拟的外部存储和物理介质插槽,例如电池盒中的SD卡。返回的路径不包括瞬态设备,如USB闪存驱动器。
应用程序可以在任何或所有返回的设备上存储数据。例如,应用程序可能选择将大型文件存储在具有最多可用空间的设备上,如通过测量StatFs
。
无需读取或写入返回路径的权限; 呼叫应用程序始终可以访问它们。在二级外部存储设备上写入这些路径之外的访问不可用。
返回的第一个路径与getExternalCacheDir()
。返回的路径可能是null
存储设备不可用。
public File getExternalFilesDir (String type)
返回主外部文件系统(即某处Environment.getExternalStorageDirectory()
)的目录的绝对路径,其中应用程序可以放置其拥有的持久性文件。这些文件是应用程序的内部,用户作为媒体通常不可见。
这就像getFilesDir()
在卸载应用程序时这些文件将被删除,但是有一些重要的区别:
- 外部文件不总是可用的:如果用户将外部存储器安装在计算机上或将其删除,则它们将消失。有关
Environment
存储状态的信息,请参阅API 。 - 这些文件没有执行安全性。例如,任何持有的应用程序
WRITE_EXTERNAL_STORAGE
都可以写入这些文件。
从开始KITKAT
,无需读取或写入返回路径的权限; 呼叫应用程序始终可以访问它。这仅适用于为调用应用程序的程序包名生成的路径。访问属于其他包的路径WRITE_EXTERNAL_STORAGE
和/或是READ_EXTERNAL_STORAGE
必需的。
在具有多个用户(如描述UserManager
)的设备上,每个用户都有自己的隔离外部存储。应用程序只能为运行的用户访问外部存储。
以下是在应用程序的私有存储中操作文件的典型代码示例:
void createExternalStoragePrivateFile (){ //创建一个我们将私有文件放在外部//存储上的路径。File file = new File (getExternalFilesDir (null ),“DemoFile.jpg” ); 尝试{ //非常简单的代码将图片从应用程序的//资源复制到外部文件中。请注意,此代码不会检查错误,并假定图片很小(不要尝试以块形式复制)。请注意,如果外部存储器//当前未安装,则会静默失败。InputStream is = getResources ()。openRawResource (ř 。绘制。气球); OutputStream os = new FileOutputStream (file ); byte [] data = new byte [ is 。available ()]; 是。读(数据); os 。写(数据); 是。关闭(); os 。关闭(); } catch (IOException e ){ //无法创建文件,可能是因为外部存储尚未安装。登录。w (“ExternalStorage” ,“写入错误” + 文件,e ); } } void deleteExternalStoragePrivateFile (){ //获取外部存储上的文件路径。如果外部//存储器当前没有挂载,这将失败。File file = new File (getExternalFilesDir (null ),“DemoFile.jpg” ); if (file != null ){ file 。delete (); } } boolean hasExternalStoragePrivateFile (){ //获取外部存储上的文件路径。如果外部//存储器当前没有挂载,这将失败。File file = new File (getExternalFilesDir (null ),“DemoFile.jpg” ); 如果(文件!= null ){ return file 。exists (); } return false ; }
如果向此函数提供非空类型,则返回的文件将是指定给定类型的子目录的路径。虽然介质扫描程序不会自动扫描这些文件,但您可以使用这些文件将其显式添加到介质数据库 MediaScannerConnection.scanFile
。请注意,这不同于 Environment.getExternalStoragePublicDirectory()
,它提供了所有应用程序共享的媒体目录。这里返回的目录由应用程序拥有,并且在卸载应用程序时将删除其内容。与此不同 Environment.getExternalStoragePublicDirectory()
,此处返回的目录将自动为您创建。
以下是在应用程序的私有存储中处理图片并将其添加到媒体数据库的典型代码示例:
void createExternalStoragePrivatePicture (){ //创建一个路径,我们将把我们的图片放在我们自己的私人//图片目录中。请注意,我们不需要在DIRECTORY_PICTURES中放置//图片,因为媒体扫描器将会看到//这些目录中的所有媒体; 这可能与其他//媒体类型(例如DIRECTORY_MUSIC)有用,可帮助您将媒体分类到用户显示。文件路径= getExternalFilesDir (环境。DIRECTORY_PICTURES ); File file = new File (path ,“DemoPicture.jpg” ); 尝试{ //非常简单的代码将图片从应用程序的//资源复制到外部文件中。请注意,此代码不会检查错误,并假定图片很小(不要尝试以块形式复制)。请注意,如果外部存储器//当前未安装,则会静默失败。InputStream is = getResources ()。openRawResource (ř 。绘制。气球); OutputStream os = new FileOutputStream (file ); byte [] data = new byte [ is 。available ()]; 是。读(数据); os 。写(数据); 是。关闭(); os 。关闭(); //告诉媒体扫描器有关新文件,以便它立即可供用户使用。MediaScannerConnection 。SCANFILE (此,新的String [] { 文件。的toString ()},null ,新的MediaScannerConnection 。OnScanCompletedListener (){ public void onScanCompleted (String path ,Uri uri ){ Log 。i (“ExternalStorage” ,“Scanned” + path + “:” ); 登录。我(“ExternalStorage” ,“ - > uri =” + uri ); } }); } catch (IOException e ){ //无法创建文件,可能是因为外部存储尚未安装。登录。w (“ExternalStorage” ,“写入错误” + 文件,e ); } } void deleteExternalStoragePrivatePicture (){ //创建一个路径,我们将把我们的图片放在用户的公共图片目录中,并删除该文件。如果外部//存储器当前没有挂载,这将失败。文件路径= getExternalFilesDir (环境。DIRECTORY_PICTURES ); if (path != null ){ File file = new File (path ,“DemoPicture.jpg” ); 文件。delete (); } } boolean hasExternalStoragePrivatePicture (){ //创建一个路径,我们将把我们的图片放在用户的公共图片目录中,并检查文件是否存在。如果//当前未安装外部存储器,则会认为//图片不存在。文件路径= getExternalFilesDir (环境。DIRECTORY_PICTURES ); if (path != null ){ File file = new File (path ,“DemoPicture.jpg” ); 返回文件。exists (); } return false ; } 文件路径= getExternalFilesDir (环境。DIRECTORY_PICTURES ); if (path != null ){ File file = new File (path ,“DemoPicture.jpg” ); 返回文件。exists (); } return false ; } 文件路径= getExternalFilesDir (环境。DIRECTORY_PICTURES ); if (path != null ){ File file = new File (path ,“DemoPicture.jpg” ); 返回文件。exists (); } return false ; } if (path != null ){ File file = new File (path ,“DemoPicture.jpg” ); 返回文件。exists (); } return false ; } if (path != null ){ File file = new File (path ,“DemoPicture.jpg” ); 返回文件。exists (); } return false ; }
参数
类型 | 要返回的文件目录的类型。可能是空的文件,目录或子目录下面的环境常量之一根: DIRECTORY_MUSIC , DIRECTORY_PODCASTS , DIRECTORY_RINGTONES ,DIRECTORY_ALARMS , DIRECTORY_NOTIFICATIONS , DIRECTORY_PICTURES ,或 DIRECTORY_MOVIES 。 |
---|
返回
- 在外部存储器上保存应用程序文件的目录的路径。如果外部存储器当前未安装,则返回null,因此无法确保路径存在; 当可用时,您将需要再次调用此方法。
public File [] getExternalFilesDirs (String type)
返回所有外部存储设备上应用程序特定目录的绝对路径,应用程序可以放置其拥有的持久性文件。这些文件是应用程序内部的,通常用户作为媒体通常不可见。
这就像getFilesDir()
在卸载应用程序时这些文件将被删除,但是有一些重要的区别:
- 外部文件不总是可用的:如果用户将外部存储器安装在计算机上或将其删除,则它们将消失。
- 这些文件没有执行安全性。
这里返回的外部存储设备被认为是设备的永久部分,包括模拟的外部存储和物理介质插槽,例如电池盒中的SD卡。返回的路径不包括瞬态设备,如USB闪存驱动器。
应用程序可以在任何或所有返回的设备上存储数据。例如,应用程序可能选择将大型文件存储在具有最多可用空间的设备上,如通过测量StatFs
。
无需读取或写入返回路径的权限; 呼叫应用程序始终可以访问它们。在二级外部存储设备上写入这些路径之外的访问不可用。
返回的第一个路径与getExternalFilesDir(String)
。返回的路径可能是null
存储设备不可用。
public File getFilesDir ()
返回文件系统openFileOutput(String, int)
中存储创建文件的目录的绝对路径。
返回
- 目录保存应用程序文件的路径。
public Looper getMainLooper ()
为当前进程的主线程返回Looper。这是用于调度应用程序组件(活动,服务等)的线程。
根据定义,该方法返回与通过调用获得的结果相同的结果Looper.getMainLooper()
。
返回
- 主要活套。
public File getObbDir ()
返回可以找到此应用程序的OBB文件(如果有的话)的主外部存储目录。请注意,如果应用程序没有任何OBB文件,则该目录可能不存在。
这就像getFilesDir()
在卸载应用程序时这些文件将被删除,但是有一些重要的区别:
- 外部文件不总是可用的:如果用户将外部存储器安装在计算机上或将其删除,则它们将消失。
- 这些文件没有执行安全性。例如,任何持有的应用程序
WRITE_EXTERNAL_STORAGE
都可以写入这些文件。
从开始KITKAT
,无需读取或写入返回路径的权限; 呼叫应用程序始终可以访问它。这仅适用于为调用应用程序的程序包名生成的路径。访问属于其他包的路径WRITE_EXTERNAL_STORAGE
和/或是READ_EXTERNAL_STORAGE
必需的。
在具有多个用户(如所述UserManager
)的设备上,多个用户可以共享相同的OBB存储位置。应用程序应确保在不同用户下运行的多个实例不会互相干扰。
public File [] getObbDirs ()
返回所有外部存储设备上应用程序特定目录的绝对路径,其中可以找到应用程序的OBB文件(如果有的话)。注意,如果应用程序没有任何OBB文件,这些目录可能不存在。
这就像getFilesDir()
在卸载应用程序时这些文件将被删除,但是有一些重要的区别:
- 外部文件不总是可用的:如果用户将外部存储器安装在计算机上或将其删除,则它们将消失。
- 这些文件没有执行安全性。
这里返回的外部存储设备被认为是设备的永久部分,包括模拟的外部存储和物理介质插槽,例如电池盒中的SD卡。返回的路径不包括瞬态设备,如USB闪存驱动器。
应用程序可以在任何或所有返回的设备上存储数据。例如,应用程序可能选择将大型文件存储在具有最多可用空间的设备上,如通过测量StatFs
。
无需读取或写入返回路径的权限; 呼叫应用程序始终可以访问它们。在二级外部存储设备上写入这些路径之外的访问不可用。
返回的第一个路径与getObbDir()
。返回的路径可能是null
存储设备不可用。
public String getPackageCodePath ()
返回此上下文的主要Android软件包的完整路径。Android包是一个包含应用程序的主要代码和资产的ZIP文件。
注意:这对于应用程序通常不是有用的,因为它们不应该直接访问文件系统。
返回
- 字符串代码和资产的路径。
public String getPackageResourcePath ()
返回此上下文的主要Android软件包的完整路径。Android包是一个包含应用程序主要资源的ZIP文件。
注意:这对于应用程序通常不是有用的,因为它们不应该直接访问文件系统。
返回
- 字符串资源的路径。
public SharedPreferences getSharedPreferences (String name,int mode)
检索并保留首选项文件'name'的内容,返回一个SharedPreferences,通过它可以检索和修改其值。只有一个SharedPreferences对象的实例返回给任何一个同名的调用者,这意味着它们会在制作完成后立即看到对方的编辑。
参数
名称 | 所需的首选项文件。如果此名称的首选项文件不存在,则在您检索编辑器(SharedPreferences.edit())然后提交更改(Editor.commit())时将创建它。 |
---|---|
模式 | 操作模式。使用0或MODE_PRIVATE 默认操作,MODE_WORLD_READABLE 并MODE_WORLD_WRITEABLE 控制权限。MODE_MULTI_PROCESS 如果多个进程突破相同的SharedPreferences文件,也可以使用该位 。 MODE_MULTI_PROCESS 始终在应用程序中定位Gingerbread(Android 2.3)及以下版本,默认情况下在以后版本中关闭。 |
返回
SharedPreferences
可用于检索和修改偏好值的单个实例。
public Object getSystemService (String name)
通过名称将句柄返回到系统级服务。返回对象的类根据请求的名称而异。目前可用的名称有:
-
您可以在其中放置自定义窗口的顶级窗口管理器。返回的对象是a
WindowManager
。 -
A
LayoutInflater
在这种情况下膨胀布局资源。 -
A
ActivityManager
用于与系统的全局活动状态进行交互。 -
A
PowerManager
用于控制电源管理。 -
A
AlarmManager
用于在您选择时收到意向。 -
A
NotificationManager
用于通知用户背景事件。 -
A
KeyguardManager
用于控制键盘保护 -
A
LocationManager
用于控制位置(例如,GPS)更新。 -
A
SearchManager
用于处理搜索。 -
A
Vibrator
用于与振动器硬件相互作用。 -
A
ConnectivityManager
用于处理网络连接的管理。 -
A
WifiManager
用于管理Wi-Fi连接。 -
一个
InputMethodManager
用于输入法管理。 -
一种
UiModeManager
用于控制用户界面模式。 -
A
DownloadManager
用于请求HTTP下载
WINDOW_SERVICE
(“窗口”)
LAYOUT_INFLATER_SERVICE
(“layout_inflater”)
ACTIVITY_SERVICE
(“活动”)
POWER_SERVICE
(“功率”)
ALARM_SERVICE
(“报警”)
NOTIFICATION_SERVICE
(“通知”)
KEYGUARD_SERVICE
(“keyguard”)
LOCATION_SERVICE
(“位置”)
SEARCH_SERVICE
(“搜索”)
VIBRATOR_SERVICE
(“振动器”)
CONNECTIVITY_SERVICE
(“连接”)
WIFI_SERVICE
(“无线上网”)
INPUT_METHOD_SERVICE
(“输入法”)
UI_MODE_SERVICE
(“uimode”)
DOWNLOAD_SERVICE
(“下载”)
注意:通过此API获取的系统服务可能与从其获取的上下文密切相关。一般来说,不要在各种不同的上下文(活动,应用程序,服务,提供商等)之间共享服务对象
参数
名称 | 所需服务的名称。 |
---|
返回
- 该服务,如果名称不存在,则为null。
public int getWallpaperDesiredMinimumHeight ()
此方法已弃用。
请WallpaperManager.getDesiredMinimumHeight()
改用。
public int getWallpaperDesiredMinimumWidth ()
此方法已弃用。
请WallpaperManager.getDesiredMinimumWidth()
改用。
public void grantUriPermission (String toPackage,Uri uri,int modeFlags)
授予访问特定Uri到另一个包的权限,无论该包是否具有访问Uri内容提供商的一般权限。这可以用于授予特定的临时权限,通常是响应于用户交互(例如用户打开您希望其他人显示的附件)。
通常,您应该使用Intent.FLAG_GRANT_READ_URI_PERMISSION
或 Intent.FLAG_GRANT_WRITE_URI_PERMISSION
使用Intent直接启动活动而不是此功能。如果您直接使用此功能,那么revokeUriPermission(Uri, int)
当目标不再允许访问它时,您应该确保调用 。
要成功,拥有Uri的内容提供商必须 grantUriPermissions
在其清单中设置<grant-uri-permissions>
属性或包含 标签。
参数
包装 | 您希望允许访问Uri的软件包。 |
---|---|
uri | 您想要授予访问权限的Uri。 |
modeFlags | 所需的访问模式。任何组合 Intent.FLAG_GRANT_READ_URI_PERMISSION 或 Intent.FLAG_GRANT_WRITE_URI_PERMISSION 。 |
public FileInputStream openFileInput (String name)
打开与该Context的应用程序包相关联的私有文件进行阅读。
参数
名称 | 要打开的文件的名称; 不能包含路径分隔符。 |
---|
返回
public FileOutputStream openFileOutput (String name,int mode)
打开与此Context的应用程序包相关联的私有文件进行写入。创建文件(如果不存在)。
参数
名称 | 要打开的文件的名称; 不能包含路径分隔符。 |
---|---|
模式 | 操作模式。使用0或MODE_PRIVATE 默认操作,MODE_APPEND 附加到现有文件, MODE_WORLD_READABLE 并MODE_WORLD_WRITEABLE 控制权限。 |
返回
public SQLiteDatabase openOrCreateDatabase (String name,int mode,SQLiteDatabase.CursorFactory factory)
打开与此Context的应用程序包关联的新的私有SQLiteDatabase。创建数据库文件(如果不存在)。
参数
名称 | 数据库的名称(在应用程序包中唯一)。 |
---|---|
模式 | 操作模式。使用0或MODE_PRIVATE 默认操作,MODE_WORLD_READABLE 并MODE_WORLD_WRITEABLE 控制权限。用于MODE_ENABLE_WRITE_AHEAD_LOGGING 默认启用预写记录。 |
厂 | 调用查询时调用实例化一个游标的可选工厂类。 |
返回
- 具有给定名称的新创建的数据库的内容。
public SQLiteDatabase openOrCreateDatabase (String name,int mode,SQLiteDatabase.CursorFactoryfactory,DatabaseErrorHandler errorHandler)
打开与此Context的应用程序包关联的新的私有SQLiteDatabase。创建数据库文件(如果不存在)。
接受输入参数:DatabaseErrorHandler
当sqlite报告数据库损坏时,用于处理损坏的具体实例。
参数
名称 | 数据库的名称(在应用程序包中唯一)。 |
---|---|
模式 | 操作模式。使用0或MODE_PRIVATE 默认操作,MODE_WORLD_READABLE 并MODE_WORLD_WRITEABLE 控制权限。用于MODE_ENABLE_WRITE_AHEAD_LOGGING 默认启用预写记录。 |
厂 | 调用查询时调用实例化一个游标的可选工厂类。 |
errorHandler | 在DatabaseErrorHandler 当sqlite的报告数据库损坏时使用。如果为空,DefaultDatabaseErrorHandler 则为假。 |
返回
- 具有给定名称的新创建的数据库的内容。
public Intent registerReceiver (BroadcastReceiver receiver,IntentFilter filter)
注册要在主活动线程中运行的BroadcastReceiver。该 接收器将匹配任何广播意图被称为过滤器,在主应用程序线程。
该系统可以播放“粘性”的意图 - 这些在广播完成后留下来,发送到任何后续的注册。如果您的IntentFilter匹配这些粘意图之一,是意图将这个函数返回 ,并发送至接收器,就好像它刚刚被播出。
可能有多个粘性意图匹配过滤器,在这种情况下,这些将被发送到接收器。在这种情况下,这些函数只能直接返回其中的一个; 返回的哪一个由系统任意决定。
如果你知道你注册的意图是粘性的,你可以为你的接收者提供null 。在这种情况下,没有注册接收者 - 该函数只返回匹配过滤器的粘性意图。在多次匹配的情况下,适用与上述相同的规则。
查看BroadcastReceiver
有关Intent广播的更多信息。
由于ICE_CREAM_SANDWICH
,用这种方法注册的接收器将正确尊重 setPackage(String)
指定的意图正在播出。在此之前,它将被忽略并传递给所有匹配的注册接收器。如果使用这个安全,请小心。
注意:该方法不能从 BroadcastReceiver
组件调用; 也就是说,来自在应用程序的清单中声明的BroadcastReceiver。然而,可以从另一个已经在运行时注册的BroadcastReceiver来调用此方法registerReceiver(BroadcastReceiver, IntentFilter)
,因为这样注册的BroadcastReceiver的生命周期与注册的对象相关联。
参数
接收器 | BroadcastReceiver处理广播。 |
---|---|
过滤 | 选择要接收的意向广播。 |
返回
- 第一个粘性意图发现匹配过滤器,如果没有匹配过滤器,则为null。
public Intent registerReceiver (BroadcastReceiver receiver,IntentFilter filter,String broadcastPermission,Handlerscheduler)
注册接收意向广播,在调度程序的上下文中 运行。查看 registerReceiver(BroadcastReceiver, IntentFilter)
更多信息。这允许您强制执行谁可以向接收方广播意图的权限,或者让接收者在与主应用程序线程不同的线程中运行。
查看BroadcastReceiver
有关Intent广播的更多信息。
由于ICE_CREAM_SANDWICH
,用这种方法注册的接收器将正确尊重 setPackage(String)
指定的意图正在播出。在此之前,它将被忽略并传递给所有匹配的注册接收器。如果使用这个安全,请小心。
参数
接收器 | BroadcastReceiver处理广播。 |
---|---|
过滤 | 选择要接收的意向广播。 |
broadcastPermission | 字符串命名广播者必须持有的权限才能向您发送Intent。如果为空,则不需要权限。 |
调度器 | 处理程序识别将接收到意图的线程。如果为null,将使用进程的主线程。 |
返回
- 第一个粘性意图发现匹配过滤器,如果没有匹配过滤器,则为null。
public void removeStickyBroadcast (Intent intent)
删除以前发送的数据sendStickyBroadcast(Intent)
,这样就好像粘性广播从未发生过。
您必须持有该BROADCAST_STICKY
权限才能使用此API。如果您不持有该权限,SecurityException
将被抛出。
参数
意图 | 以前广播的意图。 |
---|
public void removeStickyBroadcastAsUser (Intent intent,UserHandle user)
版本removeStickyBroadcast(Intent)
允许您指定要发送广播的用户。这不适用于系统映像上未预先安装的应用程序。使用它需要持有INTERACT_ACROSS_USERS权限。
您必须持有该BROADCAST_STICKY
权限才能使用此API。如果您不持有该权限,SecurityException
将被抛出。
参数
意图 | 以前广播的意图。 |
---|---|
用户 | UserHandle从中删除粘性广播。 |
public void revokeUriPermission (Uri uri,int modeFlags)
删除所有访问以前添加的特定内容提供商Uri的权限grantUriPermission(String, Uri, int)
。给定的Uri将匹配与给定Uri相同或子路径的所有以前授予的Uris。也就是说,撤销“content:// foo / target”将撤销“content:// foo / target”和“content:// foo / target / sub”,而不是“content:// foo”。
参数
uri | 你想撤销Uri的访问权限。 |
---|---|
modeFlags | 所需的访问模式。任何组合 Intent.FLAG_GRANT_READ_URI_PERMISSION 或 Intent.FLAG_GRANT_WRITE_URI_PERMISSION 。 |
public void sendBroadcast (Intent intent)
将所有意向广播给所有感兴趣的BroadcastReceivers。这个调用是异步的 它立即返回,并且您将在运行接收器时继续执行。接收机不传播结果,接收机不能中止广播。如果要允许接收者传播结果或中止广播,则必须使用有序广播发送 sendOrderedBroadcast(Intent, String)
。
查看BroadcastReceiver
有关Intent广播的更多信息。
参数
意图 | 意图广播; 所有符合此意图的接收者都将收到广播。 |
---|
public void sendBroadcast (Intent intent,String receiverPermission)
将所有意向广播给所有感兴趣的BroadcastReceivers,允许执行可选的所需权限。这个调用是异步的 它立即返回,并且您将在运行接收器时继续执行。接收机不传播结果,接收机不能中止广播。如果要允许接收者传播结果或中止广播,则必须使用有序广播发送 sendOrderedBroadcast(Intent, String)
。
查看BroadcastReceiver
有关Intent广播的更多信息。
参数
意图 | 意图广播; 所有符合此意图的接收者都将收到广播。 |
---|---|
receiverPermission | (可选)字符串命名接收方必须拥有的权限才能接收广播。如果为空,则不需要权限。 |
public void sendBroadcastAsUser (Intent intent,UserHandle user)
版本sendBroadcast(Intent)
允许您指定要发送广播的用户。这不适用于系统映像上未预先安装的应用程序。使用它需要持有INTERACT_ACROSS_USERS权限。
参数
意图 | 意图广播 |
---|---|
用户 | UserHandle发送的意图。 |
public void sendBroadcastAsUser (Intent intent,UserHandle user,String receiverPermission)
版本sendBroadcast(Intent, String)
允许您指定要发送广播的用户。这不适用于系统映像上未预先安装的应用程序。使用它需要持有INTERACT_ACROSS_USERS权限。
参数
意图 | 意图广播; 所有符合此意图的接收者都将收到广播。 |
---|---|
用户 | UserHandle发送的意图。 |
receiverPermission | (可选)字符串命名接收方必须拥有的权限才能接收广播。如果为空,则不需要权限。 |
public void sendOrderedBroadcast (Intent intent,String receiverPermission,BroadcastReceiver resultReceiver,Handlerscheduler,int initialCode,String initialData,Bundle initialExtras)
版本sendBroadcast(Intent)
允许您从广播中接收数据。这是通过在调用时提供您自己的BroadcastReceiver来完成的,这将在广播结束时被视为最终的接收者 - 其onReceive(Context, Intent)
方法将使用从其他接收器收集 的结果值进行调用。广播将以与呼叫相同的方式进行序列化 sendOrderedBroadcast(Intent, String)
。
喜欢sendBroadcast(Intent)
,这种方法是异步的; 它将在resultReceiver.onReceive()被调用之前返回。
查看BroadcastReceiver
有关Intent广播的更多信息。
参数
意图 | 意图广播; 所有符合此意图的接收者都将收到广播。 |
---|---|
receiverPermission | 字符串命名接收者必须拥有的权限才能接收广播。如果为空,则不需要权限。 |
resultReceiver | 您自己的BroadcastReceiver将其视为广播的最终接收者。 |
调度器 | 用于调度resultReceiver回调的自定义处理程序; 如果为null,它将被安排在Context的主线程中。 |
initialCode | 结果代码的初始值。经常活动.RESULT_OK。 |
initialData | 结果数据的初始值。通常为零。 |
initialExtras | 结果额外的初始值。通常为零。 |
public void sendOrderedBroadcast (Intent intent,String receiverPermission)
将给定意图广播给所有感兴趣的BroadcastReceivers,一次提供一个,以允许更多的接收者在将其传送到较不优选的接收器之前消费广播。这个调用是异步的 它立即返回,并且您将在运行接收器时继续执行。
查看BroadcastReceiver
有关Intent广播的更多信息。
参数
意图 | 意图广播; 所有符合此意图的接收者都将收到广播。 |
---|---|
receiverPermission | (可选)字符串命名接收方必须拥有的权限才能接收广播。如果为空,则不需要权限。 |
public void sendOrderedBroadcastAsUser (Intent intent,UserHandle user,String receiverPermission,BroadcastReceiverresultReceiver,Handler scheduler,int initialCode,String initialData,Bundle initialExtras)
版本 sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
允许您指定要发送广播的用户。这不适用于系统映像上未预先安装的应用程序。使用它需要持有INTERACT_ACROSS_USERS权限。
查看BroadcastReceiver
有关Intent广播的更多信息。
参数
意图 | 意图广播; 所有符合此意图的接收者都将收到广播。 |
---|---|
用户 | UserHandle发送的意图。 |
receiverPermission | 字符串命名接收者必须拥有的权限才能接收广播。如果为空,则不需要权限。 |
resultReceiver | 您自己的BroadcastReceiver将其视为广播的最终接收者。 |
调度器 | 用于调度resultReceiver回调的自定义处理程序; 如果为null,它将被安排在Context的主线程中。 |
initialCode | 结果代码的初始值。经常活动.RESULT_OK。 |
initialData | 结果数据的初始值。通常为零。 |
initialExtras | 结果额外的初始值。通常为零。 |
public void sendStickyBroadcast (Intent intent)
执行一个sendBroadcast(Intent)
“粘性”,意味着广播完成后,您发送的意图将保持不变,以便其他人可以通过返回值快速检索该数据registerReceiver(BroadcastReceiver, IntentFilter)
。在所有其他方面,这样做都是一样的 sendBroadcast(Intent)
。
您必须持有该BROADCAST_STICKY
权限才能使用此API。如果您不持有该权限,SecurityException
将被抛出。
参数
意图 | 意图广播; 所有符合此意图的接收器都将接收广播,而意向将被重新广播到未来的接收者。 |
---|
public void sendStickyBroadcastAsUser (Intent intent,UserHandle user)
版本sendStickyBroadcast(Intent)
允许您指定要发送广播的用户。这不适用于系统映像上未预先安装的应用程序。使用它需要持有INTERACT_ACROSS_USERS权限。
参数
意图 | 意图广播; 所有符合此意图的接收器都将接收广播,而意向将被重新广播到未来的接收者。 |
---|---|
用户 | UserHandle发送的意图。 |
public void sendStickyOrderedBroadcast (Intent intent,BroadcastReceiver resultReceiver,Handler scheduler,int initialCode,String initialData,Bundle initialExtras)
版本sendStickyBroadcast(Intent)
允许您从广播中接收数据。这是通过在调用时提供您自己的BroadcastReceiver来完成的,这将在广播结束时被视为最终的接收者 - 其onReceive(Context, Intent)
方法将使用从其他接收器收集 的结果值进行调用。广播将以与呼叫相同的方式进行序列化 sendOrderedBroadcast(Intent, String)
。
喜欢sendBroadcast(Intent)
,这种方法是异步的; 它将在resultReceiver.onReceive()被调用之前返回。请注意,存储的粘性数据只是您最初提供给广播的数据,而不是由接收者进行的任何更改的结果。
查看BroadcastReceiver
有关Intent广播的更多信息。
参数
意图 | 意图广播; 所有符合此意图的接收者都将收到广播。 |
---|---|
resultReceiver | 您自己的BroadcastReceiver将其视为广播的最终接收者。 |
调度器 | 用于调度resultReceiver回调的自定义处理程序; 如果为null,它将被安排在Context的主线程中。 |
initialCode | 结果代码的初始值。经常活动.RESULT_OK。 |
initialData | 结果数据的初始值。通常为零。 |
initialExtras | 结果额外的初始值。通常为零。 |
public void sendStickyOrderedBroadcastAsUser (Intent intent,UserHandle user,BroadcastReceiver resultReceiver,Handlerscheduler,int initialCode,String initialData,Bundle initialExtras)
版本 sendStickyOrderedBroadcast(Intent, BroadcastReceiver, Handler, int, String, Bundle)
允许您指定要发送广播的用户。这不适用于系统映像上未预先安装的应用程序。使用它需要持有INTERACT_ACROSS_USERS权限。
查看BroadcastReceiver
有关Intent广播的更多信息。
参数
意图 | 意图广播; 所有符合此意图的接收者都将收到广播。 |
---|---|
用户 | UserHandle发送的意图。 |
resultReceiver | 您自己的BroadcastReceiver将其视为广播的最终接收者。 |
调度器 | 用于调度resultReceiver回调的自定义处理程序; 如果为null,它将被安排在Context的主线程中。 |
initialCode | 结果代码的初始值。经常活动.RESULT_OK。 |
initialData | 结果数据的初始值。通常为零。 |
initialExtras | 结果额外的初始值。通常为零。 |
public void setTheme (int resid)
设置这个上下文的基础主题。请注意,在上下文中实例化任何视图之前(例如在调用setContentView(View)
或 调用之前)应该调用此参数inflate(int, ViewGroup)
。
参数
渣滓 | 描述主题的风格资源。 |
---|
public void setWallpaper (InputStream data)
public void startActivities (Intent [] intents )
同样startActivities(Intent[], Bundle)
,没有指定的选项。
参数
意图 | 一系列意向启动。 |
---|
public void startActivities (Intent [] intents ,Bundle options)
启动多项新活动。这通常与调用 startActivity(Intent)
数组中的第一个Intent一样,在创建时调用startActivity(Intent)
第二个条目的活动等。请注意,与该方法不同,通常不会在此创建除数组中最后一个以外的任何活动点,而是当用户首次访问它们时(由于从顶部的活动返回)创建。
ActivityNotFoundException
如果没有为任何给定的Intent 找到活动,此方法将抛出。在这种情况下,活动堆栈的状态是未定义的(列表中的某些意图可能在其中,有些不在),因此您可能希望避免这种情况。
参数
意图 | 一系列意向启动。 |
---|---|
选项 | 关于如何启动活动的其他选项。查看Context.startActivity(Intent, Bundle) 更多详情。 |
public void startActivity (Intent intent)
同样startActivity(Intent, Bundle)
,没有指定的选项。
参数
意图 | 描述要开始的活动。 |
---|
public void startActivity (Intent intent,Bundle options)
启动新的活动。您将不会收到有关活动何时退出的任何信息。
请注意,如果从外部调用此方法 Activity
,则Intent必须包含FLAG_ACTIVITY_NEW_TASK
启动标志。这是因为,没有从现有的活动开始,没有任何现有的任务来放置新的活动,因此它需要放在自己的单独任务中。
ActivityNotFoundException
如果没有找到运行给定Intent的Activity,该方法将抛出。
参数
意图 | 描述要开始的活动。 |
---|---|
选项 | 关于如何启动活动的其他选项。如果没有选项,可能为null。看看ActivityOptions 如何构建这里提供的捆绑包; 没有支持手动构建它们的定义。 |
public boolean startInstrumentation (ComponentName className,String profileFile,Bundle arguments)
开始执行一个Instrumentation
类。给定的Instrumentation组件将通过杀死其目标应用程序(如果当前运行),启动目标进程,实例化仪器组件,然后让其驱动应用程序来运行。
此功能不是同步的 - 一旦仪器启动并运行,它将返回。
仪器通常只允许与未签名或签名的软件包一起运行,该软件包也带有签名的签名(确保目标信任工具)。
参数
班级名称 | 要运行的Instrumentation组件的名称。 |
---|---|
profileFile | 仪表运行时写入分析数据的可选路径,否则不进行分析。 |
参数 | 附加的可选参数传递给仪器,或为空。 |
返回
true
如果仪器成功启动,否则false
无法找到。
public void startIntentSender (IntentSender intent,Intent fillInIntent,int flagsMask,int flagsValues,int extraFlags,Bundleoptions)
喜欢startActivity(Intent, Bundle)
,但采取IntentSender启动。如果IntentSender是一个活动,那么这个活动就像你在startActivity(Intent)
这里打电话给你一样;否则,它的相关联的动作将被执行(例如发送广播),就像你已经调用 IntentSender.sendIntent
一样。
参数
意图 | IntentSender启动。 |
---|---|
fillInIntent | 如果非空,则将作为intent参数提供sendIntent(Context, int, Intent, IntentSender.OnFinished, Handler) 。 |
flagsMask | 您想要更改的原始IntentSender中的Intent标志。 |
flagsValues | 在flagsMask中设置的任何位的所需值 |
extraFlags | 始终设置为0。 |
选项 | 关于如何启动活动的其他选项。查看Context.startActivity(Intent, Bundle) 更多详情。如果IntentSender还提供了选项,这里给出的选项将覆盖与IntentSender给出的任何冲突。 |
public void startIntentSender (IntentSender intent,Intent fillInIntent,int flagsMask,int flagsValues,int extraFlags)
参数
意图 | IntentSender启动。 |
---|---|
fillInIntent | 如果非空,则将作为intent参数提供sendIntent(Context, int, Intent, IntentSender.OnFinished, Handler) 。 |
flagsMask | 您想要更改的原始IntentSender中的Intent标志。 |
flagsValues | 在flagsMask中设置的任何位的所需值 |
extraFlags | 始终设置为0。 |
public ComponentName startService (意图服务)
请求启动给定的应用程序服务。意图应包含要启动的特定服务实现的完整类名称或要定位的特定包名称。如果Intent指定较少,则会记录有关此警告的信息,并且查找和使用的多个匹配服务中的哪一个将不被定义。如果此服务尚未运行,它将被实例化并启动(如果需要,为其创建一个进程); 如果它正在运行,那么它仍然运行。
对此方法的每次调用将导致对目标服务onStartCommand(Intent, int, int)
方法的相应调用,具有此处给出的意图。这提供了一种方便的方式将作业提交到服务,而无需绑定和调用其接口。
使用startService()将覆盖由bindService(Intent, ServiceConnection, int)
以下管理的默认服务生命周期:它要求服务保持运行直到stopService(Intent)
被调用,而不管任何客户端是否连接到它。请注意,对startService()的调用不是嵌套的:无论你调用startService()多少次,一次调用stopService(Intent)
将会停止它。
系统尝试尽可能多地运行服务。他们应该停止的唯一时间是,如果当前的前台应用程序正在使用这么多资源,服务需要被杀死。如果在服务过程中发生任何错误,它将自动重新启动。
SecurityException
如果您没有启动给定服务的权限,则此函数将抛出。
参数
服务 | 标识要开始的服务。意图必须是完全显式的(提供组件名称)或指定其定向的特定包名称。附加值可能包含在意向附加中,以提供参数以及此特定的开始调用。 |
---|
返回
- 如果服务正在启动或已经运行,
ComponentName
则返回已启动的实际服务; 否则如果服务不存在则返回null。
public boolean stopService (Intent name)
请求停止给定的应用程序服务。如果服务没有运行,没有任何反应。否则停止。请注意,对startService()的调用不计算在内,无论启动多少次,都会停止该服务。
请注意,如果停止的服务仍然具有与ServiceConnection
集合绑定的对象BIND_AUTO_CREATE
,则在所有这些绑定都被删除之前,它将不会被销毁。有关Service
服务生命周期的更多详细信息,请参阅文档。
SecurityException
如果您没有停止给定服务的权限,则此函数将抛出。
参数
名称 | 要停止的服务说明 意图必须是完全显式的(提供组件名称)或指定其定向的特定包名称。 |
---|
返回
- 如果存在与已经运行的给定Intent匹配的服务,则它被停止并被
true
返回; 否则false
返回。
public void unbindService (ServiceConnection conn)
断开应用程序服务。随着服务重新启动,您将不再接听电话,现在该服务可以随时停止。
参数
康 | 之前提供给bindService()的连接接口。此参数不能为空。 |
---|
public void unregisterReceiver (BroadcastReceiver receiver)
取消注册之前注册的BroadcastReceiver。 已经为此BroadcastReceiver注册的所有过滤器将被删除。
参数
接收器 | BroadcastReceiver取消注册。 |
---|