首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android螢幕自動旋轉開關變更監聽:使用ContentObserver而非廣播

     編輯:程式設計綜合問答

誤區澄清

系統不會發送廣播通知自動旋轉開關狀態變更。正確做法是監聽Settings.System.ACCELEROMETER_ROTATION系統設置變化。

核心API

  • 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),而非廣播。廣播用於系統級事件(開機、網絡變化、電量等),設置變更頻率高、數據量小,觀察者更高效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved