Intel Power Gadget是Intel官方出的一款软件,可供用户查看、记录CPU和GPU的信息,比如温度、耗电、频率、使用率等。
下载地址:https://software.intel.com/en-us/articles/intel-power-gadget
Intel Power Gadget支持macOS、Windows和Linux,但是最新版的已经不支持Windows 7系统,可以下载3.0.7版本。
Intel Power Gadget是Intel官方出的一款软件,可供用户查看、记录CPU和GPU的信息,比如温度、耗电、频率、使用率等。
下载地址:https://software.intel.com/en-us/articles/intel-power-gadget
Intel Power Gadget支持macOS、Windows和Linux,但是最新版的已经不支持Windows 7系统,可以下载3.0.7版本。
最近遇到一个应用崩溃问题,这个问题是由于在 Activity 的 onSaveInstanceState 中进行了数据的保存,然后在 onRestoreInstanceState 进行解析的时候出现崩溃。
实际测试的时候,发现当内存充足的时候,非常难稳定的诱发 Activity 的 onSaveInstanceState 事件。
早期的版本,可以通过 ActivityManagerNative.getDefault().setAlwaysFinish 来强制系统在 Activity 切换到后台之后,立即触发 onSaveInstanceState 。
参考代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
// Updates the system Always Finish setting private void writeFinishOptions() { try { // Due to restrictions related to hidden APIs, need to emulate the line below // using reflection: // ActivityManagerNative.getDefault().setAlwaysFinish(mAlwaysFinish); final Class classActivityManagerNative = Class.forName("android.app.ActivityManagerNative"); final Method methodGetDefault = classActivityManagerNative.getMethod("getDefault"); final Method methodSetAlwaysFinish = classActivityManagerNative.getMethod("setAlwaysFinish", new Class[] {boolean.class}); final Object objectInstance = methodGetDefault.invoke(null); methodSetAlwaysFinish.invoke(objectInstance, new Object[]{mAlwaysFinish}); } catch (Exception ex) { showAlert("Could not set always finish:\n\n" + ex, "Error"); } } // Gets the latest AlwaysFinish value from the system and // updates the checkbox private void updateFinishOptions() { mAlwaysFinish = Settings.System.getInt(getContentResolver(), Settings.System.ALWAYS_FINISH_ACTIVITIES, 0) != 0; mAlwaysFinishCB.setChecked(mAlwaysFinish); } |
但是遗憾的是,新系统比如 Android 8 等系统上,在真机环境中已经没办法通过上述的方法进行诱发了。系统会直接抛出异常,或者设置无效。
真机环境,可以尝试在 开发人员选项 中设置开启 “不保留活动” 按钮,如下图所示:
最近 Android 11 系统兼容性测试的时候,发现界面适配异常(标题栏沉浸式部分),已经无法通过网上流行的,通过反射方法获取状态栏的高度了。
于是翻了一下以前公共库里的代码,发现是使用如下代码获取状态栏高度的:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/** * 获取状态栏高度 * */ int statusBarH = 0; try { Class<?> clazz = Class.forName("com.android.internal.R$dimen"); Object object = clazz.newInstance(); int height = Integer.parseInt(clazz.getField("status_bar_height").get(object).toString()); statusBarH = getResources().getDimensionPixelSize(height); } catch (Exception e) { e.printStackTrace(); } return statusBarH; |
其实从 Android 9 开始,就已经对通过反射调用非公开 API 的方式进行警告了。
Android 11以前的系统,只是给出警告, Android 11直接抛出了调用异常。
于是搜索一下,发现网上已经更改成如下方法了:
1 2 3 4 5 6 7 8 |
int statusBarH = 0; //获取status_bar_height资源的ID int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { //根据资源ID获取响应的尺寸值 statusBarH = getResources().getDimensionPixelSize(resourceId); } return statusBarH; |
仔细观察两个方法,会发现,其实两者都是获取了系统里的状态栏使用的某个资源的高度信息,然后作为状态栏的高度信息。
另外,网上流传的另一段代码
1 2 3 |
Rect frame = new Rect(); getWindow().getDecorView().getWindowVisibleDisplayFrame(frame); int statusBarHeight = frame.top; |
不能解决小屏模式下的显示问题,在小屏模式下得到的偏移并不是正确的状态栏高度。
这样就引发一个问题,那就是如果非官方的系统UI,比如小米,华为等自定义的UI,不使用这个资源文件,或者根本就没有这个资源文件,那么获取到的高度信息不就是不正确的了吗?