如何检测通过广播接收器更改的自动同步状态

时间:2013-01-22 11:11:21

标签: android android-intent android-broadcast

目前我正在处理具有多个切换功能的小部件,其中一个是自动同步切换。 我设法使用流动代码实现自动同步的启用和禁用。

public class AutoSyncUtility {

    private static final String TAG = "Toggler_AutoSyncUtility";

    public static void setEnabled(Context context, boolean isEnabled) {
        Log.d(TAG, "Called setEnabled");

        try {
            ContentResolver.setMasterSyncAutomatically(isEnabled);
        } catch (Exception exception) {
            Log.e(TAG, Log.getStackTraceString(exception));
        }
    }

    public static boolean isEnabled(Context context) {
        Log.d(TAG, "Called isEnabled");
        boolean isEnabled = false;
        try {
                isEnabled = ContentResolver.getMasterSyncAutomatically();
        } catch (Exception exception) {
            Log.e(TAG, Log.getStackTraceString(exception));
        }

        return isEnabled;
    }

}

除此之外,我需要注册广播接收器,它将检测从其他应用程序(从设置或通过其他小部件)更改的自动同步状态。 是否可以将某些操作添加到清单中的意图过滤器?

可能解决方案的其他解决方案是implement SyncStatusObserver interface并使用

public void onStatusChanged(int which);

Object handleObject = ContentResolver.addStatusChangeListener(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS, 
    new SyncStatusObserver() {
        @Override
        public void onStatusChanged(int which) {}
    );
}

但是这个解决方案的问题是,每次我启动其他应用程序或关闭/打开监听器都会自行取消注册,并且处理对象变为空。

有没有解决方法?

** ======最新更新(解决方法) ====== **

public class AutoRotateContentObserver extends ContentObserver {


    public static interface AutoRotateStateChangedListener {
        void autoRotateStateChanged();
    }

    private AutoRotateStateChangedListener mListener;

    public AutoRotateContentObserver(Handler handler,
            AutoRotateStateChangedListener listener) {
        super(handler);
        mListener = listener;
    }

    @Override
    public void onChange(boolean selfChange) {
        mListener.autoRotateStateChanged();
        super.onChange(selfChange);

    }
}


public class MyService extends Service implements
        AutoRotateStateChangedListener {
    private AutoRotateContentObserver mAutoRotateContentObserver;

    @Override
    public void onCreate() {
        super.onCreate();

        mAutoRotateContentObserver = new AutoRotateContentObserver(new Handler(), this);

        getContentResolver().registerContentObserver(
                Settings.System.getUriFor(Settings.System.ACCELEROMETER_ROTATION),
                false, mAutoRotateContentObserver);
    }

    @Override
    public void onDestroy() {
        getContentResolver().unregisterContentObserver(mAutoRotateContentObserver);
        super.onDestroy();
    }

    @Override
    public void autoRotateStateChanged() {         
        // doSomething();
    }
}


public class AutoRotateUtility {

    public static boolean isEnabled(Context context) {        
        try {
            return (Settings.System.getInt(context.getContentResolver(),
                    Settings.System.ACCELEROMETER_ROTATION) != 0) ? true : false;            
        } catch (SettingNotFoundException e) {
        }        
        return false;
    }

    public static void setEnabled(Context context, boolean isEnabled) {
        try {
            Settings.System.putInt(context.getContentResolver(),
                    Settings.System.ACCELEROMETER_ROTATION, isEnabled ? 1 : 0);                        
        } catch (Exception e) {    
        }        
    }
}

0 个答案:

没有答案