Sử dụng BroadcastReceiver lắng nghe kết quả từ Service

1. Giới thiệu Service

Có những lúc bạn sẽ thực hiện một số hoạt động tốn thời gian dài. Giống như việc xử lý một số dữ liệu lớn, tải xuống một tập tin từ Internet hoặc có thể chỉ phát một số bài nhạc trên thiết bị. Trong các trường hợp này chúng ta sẽ sử dụng Service.

2. BroadcastReceiver lắng nghe kết quả từ Service

Trong bài viết này chúng ta sẽ đi đến một ví dụ khác với các service cơ bản là chỉ chạy nền, chúng ta sẽ kết hợp service với BroadcastReceiver lắng nghe dữ liệu từ service trả về.
Xem thêm về service tại đây.

Bài toán cơ bản:

  • Ở Main Activity tôi có môt TextView tôi muốn dữ liệu sẽ được hiện thị khi service xử lý một cái gì đó và trả về kết quả.

3. Các bước thực hiện

  • Tạo MyService.java

Tác dụng của service này là sau 2s nó sẽ push data qua  Broadcast bằng hàm sendBroadcast() kèm theo IntentFilter. Cụ thể là mình sẽ push 1 cái String đơn giản qua.

Lưu ý nhỏ ở đây mình sử dụng loại sticky :START_REDELIVER_INTENT vì sao mình dùng nó mà không dùng loại khác thì các bạn xem comment code hoặc xem tại đây.

public class MyService extends Service {
    private String LOG_TAG = "MyService";
    private String myString;
    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(LOG_TAG, "onCreate MyService");
        myString= "WWW.ANDROIDCOBAN.COM";
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(LOG_TAG, "onStartCommand MyService");
        //Tạo một Thread sau 2 giây gửi data đến Broadcast cùng với intent tương ứng.
        new Thread(new Runnable() {
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Intent broadcastIntent = new Intent();
                broadcastIntent.setAction(MainActivity.mBroadcastAction);
                broadcastIntent.putExtra("Data", myString);
                sendBroadcast(broadcastIntent);
            }
        }).start();
        //flag này có tác dụng khi android bị kill hoặc bộ nhớ thấp, hệ thống sẽ start lại và gửi kết quả lần nữa.
        return START_REDELIVER_INTENT;
    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.i(LOG_TAG, "In onBind");
        return null;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i(LOG_TAG, "In onDestroy");
    }
}

Khai báo service trong Androidmanifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.lynkmieu.serviceandbroadcastreceiver">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name=".MyService"/>
    </application>

</manifest>

 

  • MainActivity.java các bạn tạo một BroadcastReceiver để lắng nghe service và update UI như sau.

Cụ thể ở OnReceive khi service sendBroadcast() với action tương ứng thì sẽ được hứng tại đây.

 private BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
          if (intent.getAction().equals(mBroadcastAction)) {
                mTextView.setText(mTextView.getText()
                        + intent.getStringExtra("Data").toString()
                        + "\n\n");
                Intent stopIntent = new Intent(MainActivity.this,
                        MyService.class);
                stopService(stopIntent);
            }
        }
    };

Đầy đủ code ở MainActivity.java của chúng ta sẽ như sau:

public class MainActivity extends AppCompatActivity {
    public static final String mBroadcastAction = "STRING_BROADCAST_ACTION";
    private TextView mTextView;
    private IntentFilter mIntentFilter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = (TextView) findViewById(R.id.textview1);

        //Start MyService cùng với IntentFilter
        mIntentFilter = new IntentFilter();
        mIntentFilter.addAction(mBroadcastAction);
        Intent serviceIntent = new Intent(this, MyService.class);
        startService(serviceIntent);
    }

    @Override
    public void onResume() {
        super.onResume();
        registerReceiver(mReceiver, mIntentFilter);
    }

    @Override
    protected void onPause() {
        unregisterReceiver(mReceiver);
        super.onPause();
    }

    //Tạo một BroadcastReceiver lắng nghe service
    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
          if (intent.getAction().equals(mBroadcastAction)) {
                mTextView.setText(mTextView.getText()
                        + intent.getStringExtra("Data").toString()
                        + "\n\n");
                Intent stopIntent = new Intent(MainActivity.this,
                        MyService.class);
                stopService(stopIntent);
            }
        }
    };


}

Tiến hành chạy và kiểm tra kết quả.
Source Github.

Nguyễn Linh

Chia sẻ để cùng tiến bộ...