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

Android BroadcastReceiver 動態註冊:IntentFilter action 字符串填寫規範與示例

     編輯:程式設計綜合問答

系統廣播:固定 Action 字符串

必須使用 Android 定義的標準常量,區分大小寫:

// 網絡狀態變化
filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
// 或使用常量 (需 API 21+)
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);

// 電量變化
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
// filter.addAction("android.intent.action.BATTERY_CHANGED");

// 開機完成
filter.addAction(Intent.ACTION_BOOT_COMPLETED);
// filter.addAction("android.intent.action.BOOT_COMPLETED");

// 設置變化
filter.addAction(Settings.ACTION_SETTINGS_CHANGED);

自定義廣播:自定義 Action 字符串

// 定義常量類
public class CustomActions {
    public static final String USER_LOGIN = "com.myapp.action.USER_LOGIN";
    public static final String DATA_REFRESH = "com.myapp.action.DATA_REFRESH";
    public static final String FILE_DOWNLOAD_COMPLETE = "com.myapp.action.FILE_DOWNLOAD_COMPLETE";
}

// 發送廣播
Intent intent = new Intent(CustomActions.USER_LOGIN);
intent.putExtra("userId", 123);
sendBroadcast(intent);

// 註冊接收
IntentFilter filter = new IntentFilter();
filter.addAction(CustomActions.USER_LOGIN);
filter.addAction(CustomActions.DATA_REFRESH);
registerReceiver(myReceiver, filter);

完整動態註冊代碼模板

public class MainActivity extends AppCompatActivity {
    private MyReceiver receiver;
    private IntentFilter filter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setupReceiver();
    }

    private void setupReceiver() {
        receiver = new MyReceiver();
        filter = new IntentFilter();
        
        // 系統廣播
        filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        filter.addAction(Intent.ACTION_BATTERY_LOW);
        
        // 自定義廣播
        filter.addAction("com.myapp.action.USER_LOGIN");
        filter.addAction("com.myapp.action.DATA_SYNC");
        
        registerReceiver(receiver, filter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (receiver != null) {
            unregisterReceiver(receiver);  // 必須註銷,否則內存洩漏
        }
    }

    class MyReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            switch (action) {
                case ConnectivityManager.CONNECTIVITY_ACTION:
                    // 處理網絡變化
                    break;
                case "com.myapp.action.USER_LOGIN":
                    int userId = intent.getIntExtra("userId", -1);
                    // 處理登錄
                    break;
            }
        }
    }
}

Android 8.0+ (API 26) 限制注意

  • 大多數隱式廣播無法在清單中靜態註冊
  • 動態註冊不受影響,但需在 Activity/Service 生命周期內
  • 豁免廣播:ACTION_BOOT_COMPLETED、ACTION_LOCALE_CHANGED 等仍可靜態註冊
  • 替代方案:JobScheduler、WorkManager、Foreground Service

最佳實踐清單

  1. Action 字符串使用反向域名前綴避免衝突
  2. 定義常量類集中管理,避免拼寫錯誤
  3. onResume 註冊,onPause/onDestroy 註銷
  4. 接收器內避免耗時操作,耗時任務啟動 Service
  5. 導出屬性:android:exported="false" (動態註冊無需配置)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved