当前位置:首页 » 安卓系统 » androidapilevel获取

androidapilevel获取

发布时间: 2025-10-10 03:52:49

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

一、前言

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

本篇文章就对 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 了,比较已经被标记为废弃了。

B. 如何调用Android系统程序详细信息界面

调用Android系统“应用程序信息(Application Info)”界面“Android系统设置->应用程序->管理应用程序”列表下,列出了系统已安装的应用程序。选择其中一个程序,则进入“应用程序信息(Application Info)”界面。这个界面显示了程序名称、版本、存储、权限等信息,并有卸载、停止、清除缓存等按钮,可谓功能不少。如果在编写相关程序时(比如任务管理器)可以调用这个面板,自然提供了很大的方便。那么如何实现呢?

在最新的Android SDK 2.3(API Level 9)中,提供了这样的接口。在文档路径

docs/reference/android/provider/Settings.html#ACTION_APPLICATION_DETAILS_SETTINGS

下,有这样的描述:

public static final String ACTION_APPLICATION_DETAILS_SETTINGS Since: API Level 9

Activity Action: Show screen of details about a particular application.
In some cases, a matching Activity may not exist, so ensure you safeguard against this.
Input: The Intent's data URI specifies the application package name to be shown, with the "package" scheme. That is "package:com.my.app".
Output: Nothing.
Constant Value: "android.settings.APPLICATION_DETAILS_SETTINGS"

就是说,我们只要以android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS作为Action;“package:应用程序的包名”作为URI,就可以用startActivity启动应用程序信息界面了。代码如下:

view plain
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts(SCHEME, packageName, null);
intent.setData(uri);
startActivity(intent);

但是,在Android 2.3之前的版本,并没有公开相关的接口。
通过查看系统设置platform/packages/apps/Settings.git程序的源码,可以发现应用程序信息界面为InstalledAppDetails。
在这里(2.1)还有这里(2.2),我们可以分别看到Android2.1和Android2.2的应用管理程序(ManageApplications.java)是如何启动InstalledAppDetails的。
view plain
// utility method used to start sub activity
private void () {
// Create intent to start new activity
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setClass(this, InstalledAppDetails.class);
intent.putExtra(APP_PKG_NAME, mCurrentPkgName);
// start new activity to display extended information
startActivityForResult(intent, INSTALLED_APP_DETAILS);
}

但是常量APP_PKG_NAME的定义并不相同。
2.2中定义为"pkg",2.1中定义为"com.android.settings.ApplicationPkgName"
那么,对于2.1及以下版本,我们可以这样调用InstalledAppDetails:
view plain
Intent i = new Intent(Intent.ACTION_VIEW);
i.setClassName("com.android.settings","com.android.settings.InstalledAppDetails");
i.putExtra("com.android.settings.ApplicationPkgName", packageName);
startActivity(i);

对于2.2,只需替换上面putExtra的第一个参数为"pkg"

综上,通用的调用“应用程序信息”的代码如下:
view plain
private static final String SCHEME = "package";
/**
* 调用系统InstalledAppDetails界面所需的Extra名称(用于Android 2.1及之前版本)
*/
private static final String APP_PKG_NAME_21 = "com.android.settings.ApplicationPkgName";
/**
* 调用系统InstalledAppDetails界面所需的Extra名称(用于Android 2.2)
*/
private static final String APP_PKG_NAME_22 = "pkg";
/**
* InstalledAppDetails所在包名
*/
private static final String APP_DETAILS_PACKAGE_NAME = "com.android.settings";
/**
* InstalledAppDetails类名
*/
private static final String APP_DETAILS_CLASS_NAME = "com.android.settings.InstalledAppDetails";
/**
* 调用系统InstalledAppDetails界面显示已安装应用程序的详细信息。 对于Android 2.3(Api Level
* 9)以上,使用SDK提供的接口; 2.3以下,使用非公开的接口(查看InstalledAppDetails源码)。
*
* @param context
*
* @param packageName
* 应用程序的包名
*/
public static void showInstalledAppDetails(Context context, String packageName) {
Intent intent = new Intent();
final int apiLevel = Build.VERSION.SDK_INT;
if (apiLevel >= 9) { // 2.3(ApiLevel 9)以上,使用SDK提供的接口
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts(SCHEME, packageName, null);
intent.setData(uri);
} else { // 2.3以下,使用非公开的接口(查看InstalledAppDetails源码)
// 2.2和2.1中,InstalledAppDetails使用的APP_PKG_NAME不同。
final String appPkgName = (apiLevel == 8 ? APP_PKG_NAME_22
: APP_PKG_NAME_21);
intent.setAction(Intent.ACTION_VIEW);
intent.setClassName(APP_DETAILS_PACKAGE_NAME,
APP_DETAILS_CLASS_NAME);
intent.putExtra(appPkgName, packageName);
}
context.startActivity(intent);
}

热点内容
服务器换地址防攻击 发布:2025-10-10 17:14:18 浏览:413
安卓系统用什么麦唱歌 发布:2025-10-10 17:04:40 浏览:183
加密盾 发布:2025-10-10 16:42:35 浏览:223
无线网密码忘记了怎么办手机 发布:2025-10-10 16:41:17 浏览:5
行号和密码是什么 发布:2025-10-10 16:22:45 浏览:273
灵风三头脚本 发布:2025-10-10 16:19:03 浏览:413
sql辛研 发布:2025-10-10 16:04:39 浏览:214
怎么提高网站访问量 发布:2025-10-10 15:56:45 浏览:656
我的世界服务器维基 发布:2025-10-10 15:56:42 浏览:491
安卓手机网页无法打开是什么原因 发布:2025-10-10 15:38:59 浏览:846