系統不會發送廣播通知自動旋轉開關狀態變更。正確做法是監聽Settings.System.ACCELEROMETER_ROTATION系統設置變化。
Settings.System.getInt(resolver, Settings.System.ACCELEROMETER_ROTATION):讀取當前狀態(0關閉,1開啟)Settings.System.putInt(resolver, Settings.System.ACCELEROMETER_ROTATION, value):修改狀態ContentResolver.registerContentObserver(uri, notifyForDescendants, observer):註冊觀察者public class RotationObserver extends ContentObserver {
private ContentResolver resolver;
private Handler handler;
public RotationObserver(Handler handler, ContentResolver resolver) {
super(handler);
this.handler = handler;
this.resolver = resolver;
}
@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange, uri);
if (Settings.System.ACCELEROMETER_ROTATION.equals(uri.getLastPathSegment())) {
int status = Settings.System.getInt(resolver, Settings.System.ACCELEROMETER_ROTATION, 0);
// 通知UI更新、發送EventBus、回調接口等
EventBus.getDefault().post(new RotationChangedEvent(status == 1));
}
}
}
// 在Activity/Service中註冊
@Override
protected void onResume() {
super.onResume();
Uri uri = Settings.System.getUriFor(Settings.System.ACCELEROMETER_ROTATION);
getContentResolver().registerContentObserver(uri, false, rotationObserver);
}
@Override
protected void onDestroy() {
super.onDestroy();
getContentResolver().unregisterContentObserver(rotationObserver);
}
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<!-- Android 6.0+ 需引導用戶授權 -->
if (!Settings.System.canWrite(this)) {
startActivity(new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS, Uri.parse("package:" + getPackageName())));
}
系統設置變更屬於內容提供者數據變更,設計模式為觀察者模式(ContentObserver),而非廣播。廣播用於系統級事件(開機、網絡變化、電量等),設置變更頻率高、數據量小,觀察者更高效。