成都网站建设设计

将想法与焦点和您一起共享

android常量,Android常量切换

Android 保持屏幕常亮的几种方法

一、前言

创新新互联,凭借10余年的网站设计制作、成都网站设计经验,本着真心·诚心服务的企业理念服务于成都中小企业设计网站有上千余家案例。做网站建设,选创新互联建站

在实际开发的过程中,会有一些需要保持屏幕常亮,避免进入锁屏状态的需求。最常见的就是视频播放的过程中,如果屏幕突然暗了,或者直接锁屏,会非常的影响用户的体验。

本篇文章就对 Android 下,如何保持屏幕常量,做一个简单的记录和总结。

二、几种常见的方法

1、WakeLock

使用 WakeLock 是一种教科书式的比较常规的手段,使用起来也非常的简单。

可以看到,WakeLock 主要是通过 PowerManager 获取,然后通过acquire()方法获取一个 WakeLock 资源,WakeLock 也是一种资源,在使用完成之后,别忘了调用release()方法进行释放。

使用 WakeLock 还需要额外的声明 WAKE_LOCK 权限。

当然,使用 WakeLock 暂时来看,应该还是没有什么问题的。但是实际上,所有和屏幕亮度相关的 WakeLock 的 Flag ,在 API level 17+ 之上,都已经被标记废弃了。可以看出 Android 在节能上做了很多努力,屏幕是费电大户,既然已经被废弃掉了,正常来说,我们还是不推荐使用的。

更多和 PowerManager.WakeLock 相关的内容,可以看看之前的一篇文章《PowerManager 不是只有 WakeLock 》。

2、FLAG_KEEP_SCREEN_ON

前面说了,WakeLock 已经被标记废弃。虽然被废弃了,但是实际上 Android 还是给我们提供了对应的解决方案的,那就是使用FLAG_KEEP_SCREEN_ON的方式来标记屏幕常亮。

FLAG_KEEP_SCREEN_ON 使用起来也非常的简单,它是一个页面 Window 上的一个 Flag ,使用addFlags()方法添加。

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

当然,这里使用完成之后,也是需要取消掉的。取消这个 Flag 使用clearFlags()方法来取消。

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

通常我们会在一个 Activity 的onResume()和onPause()方法中,分别调用这两个方法。

看看 FLAG_KEEP_SCREEN_ON 的文档解释。

从这里可以看出来,它只作用在一个被显示的 Window 上,并且保持设备屏幕高亮度的常亮。

其实这里也可以看出来,官方废弃 WakeLock 而推荐使用 FLAG_KEEP_SCREEN_ON ,一部分原因在于 WakeLock 是一个全局的资源,而 FLAG_KEEP_SCREEN_ON 只是一个和 window 相关的资源,作用范围更小了一些。并且它比 WakeLock 更好的一点在于,它不需要额外的申请权限,一般来说,我们还是推荐使用它的。

3、keepScreenOn

除了给 Window 添加一个 FLAG_KEEP_SCREEN_ON 的 Flag 之外,还可以对当前可见的 View 调用 keepScreenOn() 方法来设置屏幕常亮。

keepScreenOn() 是 View 对象上的方法,同时也提供了布局中的属性android:keepScreenOn来方便我们在布局中对其进行设置。

需要注意的一点,使用 keepScreenOn() 设置的常亮标识,需要当前 View 保持屏幕可见才行。所以一般而言,我们会在页面的根布局中,添加此属性。

通过文档可以看到,实际上它的原理和 FLAG_KEEP_SCREEN_ON 一样的,只是它更简单,只需要对某个 View 设置,如果该 View 可见即生效,否者就不生效。

4、MediaPlayer的 setScreenOnWhilePlaying()

如果我们是使用一个 MediaPlayer 来进行视频播放的话,MediaPlayer 还提供了setScreenOnWhilePlaying()方法,来设置屏幕常量。

其实没什么好说的,继续查看源码可以看到其实最终调用的还是keepScreenOn()方法。当然多了解一种方法也没有什么坏处。

三、小结

保持屏幕常亮的方式有很多,选用我们需要的即可。当然,最好还是不要使用 WakeLock 了,比较已经被标记为废弃了。

android 静态常量和枚举哪个好

常量是直接编译在代码中的,而枚举则是一种类,你可以通过反射根据值反查出它的枚举形式是什么。

枚举定义了值的范围,但是常量没有。所以要根据你的实际情况选择。

比如你有一个变量,是中国所有的省,那么最好用枚举,因为这些是固定不变的。在代码里使用的时候更方便,也易懂。

Android蓝牙设备的常量值是什么意思

可以理解为蓝牙设备支持的协议类型device type 的取值如 DEVICE_TYPE_CLASSIC 1 BR/EDRDEVICE_TYPE_LE 2 LE-onlyDEVICE_TYPE_DUAL 3 双模式BR/EDR/LEDEVICE_TYPE_UNKNOWN 0 蓝牙不可用

android如何调用自定义类中的常量

常量用类名.常量名的方式调用

例如

class Test{

public static final int FINAL_VALUE = 1;

}

然后在任意类中都可以使用

Test.FINAL_VALUE来调用

Android 权限常量保存在哪个类中

1. 保存键值对(Saving Key-Value Sets)

如果你要存储存储小型的键值对(key-value)数据集的话,可以使用SharedPreferences API。SharedPreferences对象是一个包含键值对的文件,提供了读和写的方法。每一个SharedPreferences文件都被框架(framework)管理,并且既可以是私有的,也可以使公有的。以下内容主要是:使用SharedPreferences APIs 来存储和检索简单的数值。

Write to Shared Preferences

要写入数据,

1.先在SharedPreferences通过调用edit()方法创建一个SharedPreferences.Editor 。

2.通过putInt()和putString()来把键值对写入,

3.然后调用commit()方法来保存。

For example:

//新建一个SharedPreferences文件,设定为private模式

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);

//新建一个editor对象,通过SharedPreferences对象的edit()方法。

SharedPreferences.Editor editor = sharedPref.edit();

//调用editor的putInt()方法,参数就是键值对。

editor.putInt(getString(R.string.saved_high_score), newHighScore);

//调用editor的commit()方法,保存。

editor.commit();

Read from Shared Preferences

调用SharedPreferences对象的getInt()方法和getString()方法,读取SharedPreferences文件。参数可以写default,也可以写key。返回值都是value。

//创建一个SharedPreferences对象

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);

//参数我default情况

long default = getResources().getInteger(R.string.saved_high_score_default));

//参数为(key,default)情况

long highScore = sharedPref.getInt(getString(R.string.saved_high_score), default);

2.保存文件(saving files)

android系统里对文件进行读写,主要使用了File APIs。

File对象主要用来读写大的数据量。比如图像文件、通过网络交换的文件。

以下内容基于读者已经了解Linux文件系统以及java.io里的标准文件输入输出API。

内部存储Internal storage的特点:

1.一直可用

2.是默认程序的默认文件访问位置,其他app访问不了。

3.卸载app时,系统会删除这个app所有文件

Internal storage 可以确保用户和其他app无法访问你的文件。很好的私密性。

外部存储External storage的特点:

1.并非一直可用。可以插在卡槽,但是卸载掉,这时候系统就看不到了,或者用户把sd卡当U盘使。

2.文件存储不安全。sd卡拿出来,里面的信息就泄露了。

3.卸载app时,只有你在路径getExternalFilesDir()保存文件的时候,系统才可以删除这个app的文件。

如果不在这个路径的话,那SD卡上就会有残留文件了。

如果文件没有访问限制,或者你想让文件为其他app所用,或者希望通过电脑查看,外部存储不失为一种好方法。

TIPS:可以设置manifest文件里的android:installLocation属性来让app装在外部存储。

Obtain Permissions for External Storage

要向外部存储写文件,必须在manifest文件里声明WRITE_EXTERNAL_STORAGE权限。

manifest ...

uses-permission

//写入外部存储文件的权限

android:name="android.permission.WRITE_EXTERNAL_STORAGE"

/

...

/manifest

注意:目前,所有的app都可以读取外部存储上的文件,不需要特殊的权限。但是以后这个肯定要改的,读取外部存储的文件也是需要权限的。所以也要在manifest文件里声明READ_EXTERNAL_STORAGE权限。

manifest ...

uses-permission

//读取外部存储文件的权限

android:name="android.permission.READ_EXTERNAL_STORAGE"

/

...

/manifest

往内部存储写文件是不需要权限的,从内部存储读文件也是不需要权限的。

所以内外存储文件还有权限上的区别:外部的要权限,内部的不需要。

Save a File on Internal Storage

保存一个文件到内部存储的时候,需要获得一个存储路径,方法有二:

1.getFilesDir()--------返回文件File路径

2.getCacheDir()--------返回一个缓存文件路径

临时缓存文件里存放着temporary cache files,确保不用这些文件的时候删除,并有size上的控制,系统在低存储空间的时候,会直接删除这个临时文件夹内容。

在存储路径上创建文件时候,使用File()构造器,参数为路径,和文件名称。

//使用File()构造器,参数1:文件路径 参数2:文件名称

File file = new File(context.getFilesDir(), filename);

或者,可以调用openFileOutput()方法来获取FileOutputStream,来向内部存储路径写文件。

String filename = "myfile";

String string = "Hello world!";

FileOutputStream outputStream;

try {

//调用方法创建流,参数1:文件名参数2:文件类型为私有

putStream = openFileOutput(filename, Context.MODE_PRIVATE);

//调用流的write方法

outputStream.write(string.getBytes());

//关闭流

outputStream.close();

}

catch (Exception e) {

e.printStackTrace();

}

如果要创建一个缓存文件,就要用createTempFile()方法。

以下代码从url提取文件name,然后用那个name在缓存文件夹创建一个文件。

public File getTempFile(Context context, String url) {

File file;

try {

String fileName = Uri.parse(url).getLastPathSegment();

file = File.createTempFile(fileName, null, context.getCacheDir());

catch (IOException e) {

// Error while creating file

}

return file;

}

注意:app的内部存储路径是由你的app的包的名称指定的,在android文件系统的特定位置。技术上看,如果你把文件mode设置为可读,其他app是可以读取你的app的数据的。但是其他app要想读取,必须要知道你的包的名称和文件的名称。除非你明确设定file mode为readable或者writable,否则其他app肯定没法读和写你的internal file。 所以,只要你把文件mode设置为Context.MODE_PRIVATE,其他app是无论如何也没法访问到这个文件的。

Save a File on External Storage

因为外部存储有可能不可用,所以用之前要查询一下外部存储的状态,使用之前肯定要查一下外部存储的可用空间。调用getExternalStorageState()方法,如果返回的状态是MEDIA_MOUNTED的话,外部存储就是可用的,包括读和写。

//检查外部存储是否可以读和写

public boolean isExternalStorageWritable() {

String state = Environment.getExternalStorageState();

if (Environment.MEDIA_MOUNTED.equals(state)) {

return true;

}

return false;

}

//查看外部存储是否至少可读

public boolean isExternalStorageReadable() {

String state = Environment.getExternalStorageState();

if (Environment.MEDIA_MOUNTED.equals(state) ||

Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {

return true;

}

return false;

}

有两个文件夹来存放文件:

1.公共文件夹(Public files)

其他用户和app都可以访问,app卸载以后,文件仍然存在,其他app和用户可以继续使用。

比如:app拍的照片

2.私有文件夹(Private files)

文件私有,其他用户和app无权访问。app卸载以后,文件即被删除。尽管文件存储在外部存储上,其他用户

和app是可以访问的,但是实际上,这些文件是不会向app以外的其他用户提供数据的。、

比如:app下载的内容和临时文件

存储public文件到外部存储:调用getExternalStoragePublicDirectory()方法。这个方法有个参数,来指定你要存储文件的类型,这样,其他公共文件夹就可以将其包括进去。比如 DIRECTORY_MUSIC和 DIRECTORY_PICTURES。

public File getAlbumStorageDir(String albumName) {

// 获取用户公共图片文件夹路径

File file = new File(Environment.getExternalStoragePublicDirectory(

Environment.DIRECTORY_PICTURES), albumName);

if (!file.mkdirs()) {

Log.e(LOG_TAG, "Directory not created");

}

return file;

}

存储public文件到外部存储:调用getExternalStoragePublicDirectory()方法。这个方法有个参数,来指定你要存储文件的类型,这样,其他公共文件夹就可以将其包括进去。比如 DIRECTORY_MUSIC和 DIRECTORY_PICTURES。

public File getAlbumStorageDir(String albumName) {

// 获取用户公共图片文件夹路径

// 参数1:Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)

// 参数2:albumName

File file = new File(Environment.getExternalStoragePublicDirectory(

Environment.DIRECTORY_PICTURES), albumName);

if (!file.mkdirs()) {

Log.e(LOG_TAG, "Directory not created");

}

return file;

}

存储private文件到外部存储:调用getExternalFilesDir()方法,也要传入一个指定文件类型的参数。以下是创建一个私人相册的文件的代码:

public File getAlbumStorageDir(Context context, String albumName) {

// 获取应用的私人相册文件路径

//参数1:context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)

//参数2:albumName

File file = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), albumName);

if (!file.mkdirs()) {

Log.e(LOG_TAG, "Directory not created");

}

return file;

}

也可以调用 getExternalFilesDir()方法,传如null参数,这样就会返回外部存储的根目录。

记住:

1. getExternalFilesDir()方法创建的文件路径,会在用户卸载这个app的时候被删除。

2. 如果想让你的文件路径在app被卸载以后仍然存在,那么getExternalStoragePublicDirectory() 是一个更好的选择。

3.无论是建立可以共享的文件路径,还是私有文件路径,使用API 常量来指定文件目录类型是很重要的。比如,DIRECTORY_PICTURES,这可以确保系统正确的识别目录里的数据。

Query Free Space

如果你事先知道要存储的数据量的大小,你就可以先查询一下可用空间有多少, 这样就可以避免IOException,可用的方法是:getFreeSpace()和getTotalSpace()。

getFreeSpace()---返回剩余空间

getTotalSpace()---返回总空间。

但是返回的可用空间大小,并不说明,你就可以存入这么多的数据。如果空间比你要存入的数据大几M,或者空间被占用率小于90%,都还可以,反之,就未必能存入。

并不需要每次存文件之前都来这么个判断,加个异常捕捉就OK。而且,你也未必知道你要存入的数据有多大,你想判断,也没法判断的,所以能catch这个IOException就行。

Delete a File

删除文件最简单的方法是调用文件本身的方法:delete()

myFile.delete();

如果文件存储在内部存储介质上,可以利用上下文的方法:deleteFile()

myContext.deleteFile(fileName);

注意:当用户卸载app时候,系统会删除以下文件:

1.所有存储在内部介质上的数据

2.使用getExternalFilesDir()创建路径的外部介质上的数据

但是,所有缓存文件夹是需要手动删除的


当前文章:android常量,Android常量切换
标题来源:http://chengdu.cdxwcx.cn/article/hogdoc.html