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.