gpt4 book ai didi

android - Settings.Global.putInt() 不会立即生效

转载 作者:行者123 更新时间:2023-12-05 07:46:11 29 4
gpt4 key购买 nike

我开发了一个应用程序并将其转换为系统应用程序。在这个应用程序中,我想更改三个全局变量:ANIMATOR_DURATION_SCALEWINDOW_ANIMATION_SCALETRANSITION_ANIMATION_SCALE。但是在我通过我的应用程序修改值后,我必须再次进入设置(这是由谷歌开发的系统应用程序)应用程序才能让修改生效,否则修改将不起作用。这是我的代码:

  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.SET_ANIMATION_SCALE" />

<!--system app-->
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />

我在选中 Switch 时修改 MainActivity 中的值

 public void changeAnimationSettings(boolean isChecked) {

int result1 = isChecked ? 0 : 1;
Settings.Global.putInt(getContentResolver(), Settings.Global.ANIMATOR_DURATION_SCALE, result1);
Settings.Global.putInt(getContentResolver(), Settings.Global.WINDOW_ANIMATION_SCALE, result1);
Settings.Global.putInt(getContentResolver(), Settings.Global.TRANSITION_ANIMATION_SCALE, result1);

Log.i(TAG, "---->>ANIMATOR_DURATION_SCALE: " + Settings.Global.getString(getContentResolver(), Settings.Global.ANIMATOR_DURATION_SCALE));
Log.i(TAG, "---->>WINDOW_ANIMATION_SCALE: " + Settings.Global.getString(getContentResolver(), Settings.Global.WINDOW_ANIMATION_SCALE));
Log.i(TAG, "---->>TRANSITION_ANIMATION_SCALE " + Settings.Global.getString(getContentResolver(), Settings.Global.TRANSITION_ANIMATION_SCALE));
}

并且日志显示代码修改值成功。

最佳答案

使用这个“设置应用魔法”(original taken from AOSP source)立即看到变化:

SystemPropPoker().execute()

同时添加这个类

class SystemPropPoker extends AsyncTask<Void, Void, Void> {

private static final String TAG = SystemPropPoker.class.getName();

@SuppressWarnings("unchecked")
@Override
protected Void doInBackground(@NonNull Void... params) {
String[] services;
try {
Class serviceManagerClass = Class.forName("android.os.ServiceManager");
Method listServicesMethod = serviceManagerClass.getMethod("listServices");
services = (String[]) listServicesMethod.invoke(null);
for (String service : services) {
Method checkServiceMethod = serviceManagerClass.getMethod("checkService", String.class);
IBinder obj = (IBinder) checkServiceMethod.invoke(null, service);
if (obj != null) {
Parcel data = Parcel.obtain();
final int SYSPROPS_TRANSACTION = ('_'<<24)|('S'<<16)|('P'<<8)|'R'; //copy from source code in android.os.IBinder.java
try {
obj.transact(SYSPROPS_TRANSACTION, data, null, 0);
} catch (Exception e) {
Log.i(TAG, "Someone wrote a bad service '" + service
+ "' that doesn't like to be poked: " + e);
}
data.recycle();
}
}
} catch (ClassNotFoundException | NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
e.printStackTrace();
}
return null;
}

引用:How to easily "Show Layout bounds" for Android debugging?

关于android - Settings.Global.putInt() 不会立即生效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41093981/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com