Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách sử dụng LocalBroadcastManager trong Android

Giới thiệu

Lưu ý quan trọng: LocalBroadcastManager đã bị deprecated từ AndroidX 1.0 (2019). Google khuyến nghị thay thế bằng LiveData, Flow, RxJava, hoặc EventBus (greenrobot). Bài viết này giải thích cách cũ để bảo trì code legacy.

Cách cũ - LocalBroadcastManager (Deprecated)

1. Dependency (build.gradle)

dependencies {
    implementation "androidx.localbroadcastmanager:localbroadcastmanager:1.0.0"
}

2. Gửi Broadcast (Producer)

// Trong Activity/Fragment/Service
Intent intent = new Intent("MY_CUSTOM_ACTION");
intent.putExtra("key", "Giá trị từ LocalBroadcast");
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);

3. Nhận Broadcast (Consumer)

// Trong Activity/Fragment
private BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String value = intent.getStringExtra("key");
        // Cập nhật UI
    }
};

@Override
protected void onStart() {
    super.onStart();
    LocalBroadcastManager.getInstance(this).registerReceiver(receiver,
            new IntentFilter("MY_CUSTOM_ACTION"));
}

@Override
protected void onStop() {
    super.onStop();
    LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver);
}

4. Ví dụ hoàn chỉnh (MainActivity.java)

package com.example.myapplication;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    TextView tvResult;
    private BroadcastReceiver localReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String msg = intent.getStringExtra("name");
            tvResult.setText("Nhận local broadcast: " + msg);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tvResult = findViewById(R.id.tvResult);
        tvResult.setText("Nhấn nút để gửi broadcast");

        // Đăng ký nhận
        LocalBroadcastManager.getInstance(this).registerReceiver(localReceiver,
                new IntentFilter("custom-action-local-broadcast"));

        findViewById(R.id.btnSend).setOnClickListener(v -> {
            Intent intent = new Intent("custom-action-local-broadcast");
            intent.putExtra("name", "Tutorialspoint.com");
            LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        LocalBroadcastManager.getInstance(this).unregisterReceiver(localReceiver);
    }
}

Cách hiện đại - Thay thế LocalBroadcastManager

1. LiveData + ViewModel (Khuyên dùng cho Architecture Components)

// SharedViewModel.java
public class SharedViewModel extends ViewModel {
    private MutableLiveData<String> message = new MutableLiveData<>();

    public void send(String msg) { message.setValue(msg); }
    public LiveData<String> getMessage() { return message; }
}

// Fragment/Activity gửi
viewModel.send("Hello from Fragment A");

// Fragment/Activity nhận
viewModel.getMessage().observe(getViewLifecycleOwner(), msg -> {
    // Cập nhật UI
});

2. Kotlin Flow / StateFlow (Coroutines)

// SharedViewModel.kt
class SharedViewModel : ViewModel() {
    private val _message = MutableStateFlow<String?>(null)
    val message: StateFlow<String?> = _message

    fun send(msg: String) { _message.value = msg }
}

// Collect trong Fragment
viewLifecycleOwner.lifecycleScope.launch {
    viewModel.message.collect { msg ->
        // Cập nhật UI
    }
}

3. EventBus (greenrobot) - Đơn giản, mạnh mẽ

// Event class
public class MessageEvent { public final String msg; public MessageEvent(String m){msg=m;} }

// Gửi
EventBus.getDefault().post(new MessageEvent("Hello"));

// Nhận (trong Activity/Fragment)
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessage(MessageEvent event) { /* update UI */ }

@Override onStart() { EventBus.getDefault().register(this); }
@Override onStop() { EventBus.getDefault().unregister(this); }

So sánh

Giải phápƯu điểmNhược điểm
LocalBroadcastManagerĐơn giản, hệ thốngDeprecated, string-based, không type-safe
LiveData/ViewModelLifecycle-aware, type-safe, testableCần ViewModel, hơi verbose
Kotlin FlowReactive, coroutines, cold/hot streamCần Kotlin, học curve
EventBusDecoupled, annotation-based, sticky eventsThư viện thứ 3, global bus

Chạy ví dụ cũ

Nhấn Run → nhấn nút "Gửi" → TextView cập nhật "Nhận local broadcast: Tutorialspoint.com".

Cách sử dụng LocalBroadcastManager trong Android

Cách sử dụng LocalBroadcastManager trong Android