Java 从另一个实例检测SharedReference更改
我正在制作一个非常简单的应用程序,它可以简单地读取和更新其SharedReference:Java 从另一个实例检测SharedReference更改,java,android,Java,Android,我正在制作一个非常简单的应用程序,它可以简单地读取和更新其SharedReference: public class MyPreferencesActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener { @Override public void onResume() { super.onResume(); g
public class MyPreferencesActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener
{
@Override
public void onResume() {
super.onResume();
getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener( this );
}
@Override
public void onPause() {
getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener( this );
super.onPause();
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
Log.d( "xcc", "onSharedPreferenceChanged" );
reloadOpenGLES();
}
public void saveSomeData()
{
SharedPreferences.Editor editor = getPreferenceManager().getSharedPreferences().edit();
editor.putString("MyKey", "MyValue" );
editor.commit();
}
}
当我调用“saveSomeData()”方法时,一切都很正常,onSharedPreferenceChanged会被触发,但问题是——如果我打开应用程序的多个实例,“onSharedPreferenceChanged”只会在活动应用程序中触发,而不会在后台运行的应用程序中触发。如何从另一个实例检测更改
我为什么要这样做:
我正在构建一个LWP,它使用GLSURFACHEVIEW。用户更改设置后,OpenGL需要知道它必须更新场景,因为设置已更改,所以我在触发“onSharedPreferenceChanged”时调用reloadOpenGLES()
奇怪的是,如果我将我的LWP设置为当前活动的LWP,然后转到“墙纸设置”并再次选择,更改其设置并“设置为墙纸”,则LWP的第一个实例(设置为我的手机LWP)不会更新设置,意思是“onSharedPreferenceChanged”仅在当前活动实例中触发,而不是在同一应用程序的所有实例中触发。导致用户要更改现有LWP的一些设置,并且在更新设置后,什么也不会发生,他仍然会得到相同的旧设置,除非他切换到不同的墙纸,然后返回到此墙纸
换句话说,当android更改LWP时,如果之前设置的LWP与新设置的LWP是同一个应用程序,它似乎不会重新启动LWP应用程序,而是可能触发某种事件。我认为这次活动是“onSharedPreferenceChanged”,但似乎我走错了方向
也许有更好的方法解决这个问题?谢谢
编辑:
我已按照adelphus的建议更新了我的清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.soft.test" android:sharedUserId="com.soft">
<uses-feature
android:name="com.soft.test"
android:required="true" >
</uses-feature>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
<application
android:label="@string/app_name">
<service android:name=".LWPService" android:label="@string/app_name" >
<intent-filter>
<action android:name="android.service.wallpaper.WallpaperService" />
</intent-filter>
<meta-data android:name="android.service.wallpaper" android:resource="@xml/livewallpaper" />
</service>
<activity
android:name=".MyPreferencesActivity"
android:exported="true"
android:launchMode="singleInstance"
android:label="@string/app_name"
android:theme="@android:style/Theme.Light.WallpaperSettings" >
</activity>
</application>
</manifest>
仍然希望了解如何通过另一个实例的onSharedPreferenceChange事件执行此操作。您可以尝试为配置“启动模式”-将其设置为singleInstance以强制执行一项任务。不完全确定它是否有效,但这可能是一个简单的解决办法。@adelphus谢谢你的提示!不幸的是,它在我的情况下不起作用。我也尝试了单任务,同样的结果。我在更新的问题中包含了清单,可能是我弄错了。可能是广播了一条信息,然后收听。
public abstract class GLES2WallpaperService extends GLWallpaperService
{
@Override
public void onVisibilityChanged(boolean visible)
{
reloadOpenGLES();
}
}