目前我正在处理具有多个切换功能的小部件,其中一个是自动同步切换。 我设法使用流动代码实现自动同步的启用和禁用。
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) {
}
}
}