Java 从另一个实例检测SharedReference更改

Java 从另一个实例检测SharedReference更改,java,android,Java,Android,我正在制作一个非常简单的应用程序,它可以简单地读取和更新其SharedReference: public class MyPreferencesActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener { @Override public void onResume() { super.onResume(); g

我正在制作一个非常简单的应用程序,它可以简单地读取和更新其SharedReference:

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();
        }
}