Android developer Blog

Group Android Hoa Sen

Nguyen Van Kien

Service in android

nó là một công việc nào đó mà chúng ta muốn thực hiện dưới backgound mà không cần đến giao diện tương tác ví dụ như: update GUI, download file, xử lý tính toán, chơi nhạc nền ..v..v

Hai điều về Service trong android.
Thứ nhất : nó không phải là một tiến trình tách rời với ứng dụng trong mobile của bạn, nó được start khi chúng ta chỉ định nó ở ngữ cảnh nào và nó cũng run trong tiến trình giống như các component khác trong ứng dụng.
Thứ hai : nó không phải là một Thread.

Vòng đời của Service

Tương tự như Intent thì Service cũng có vòng đời của nó, và Android quy định cách bạn chỉ định một service khởi chạy nó và kết thúc nó như sau :

Nhìn vào flow này thì chúng ta có thể tart một service theo hai cách.

Cách 1 :
Nó được khởi động thông qua lời gọi startService(), với lời gọi này hệ thông sẽ lấy về service mà chúng ta muốn sử dụng sau đó gọi đến phương thức onCreate() nếu cần – tất nhiên đó là do bạn có làm một số công việc trong phương thức này . Tiếp đến là onStart() service sẽ được start lại một lần nữa cho dù trước đó nó đã được tạo, sau đó Service sẽ được chuyển đến trạng thái Running, tức chạy những công việc mà bạn muốn service làm. Hủy nó thông qua override phương thức onDestroy() ở phương thức này bạn có thể thực hiện giải phóng tài nguyên cho những công việc mà bạn làm trước đó, hay stop một công việc nào đó, ví dụ như ngưng chơi nhạc. Với cách này thì nên sử dụng trong những trường hợp mà các thành phần trong ứng dụng truy cập tới service một cách localy tức là các thành phần trong ứng dụng khác không chỉ định service đó.

Cách 2 :

Service được start thông qua bindService(), tương tự chúng ta có thể hiểu flow này, và có một số khác biệt như sau , có ba phương thức onBind(), onUnBind() và reBind(). Đây là ba phương thức mà bạn có thể kiểm soát cũng như đáp ứng những tương tác từ client. Khi bạn một lớp được extend từ service thì phương thức đầu tiên mà bạn cần override đó là onBind, đối số truyền vào của nó là một Intent, intent này chính là intent hiện tại mà từ đó bạn yêu cầu service hoạt động. Client có thể nhưng service thông qua onUnBind(), và quay trở lại thông qua reBind().

Một số lưu ý khi ngắt service

Có nhiều lời gọi start nó tuy nhiên chỉ cần gọi một lần gọi stopSelf() cho service hay nói cách khác dù bạn có start service bao nhiêu lần thì chỉ cần một lời gọi stopSelf là đủ để đảm bảo service được tắt.

Liên quan tới AndroidManifest.xml

cũng giống như intent khi bạn muốn sử dụng service trong ứng dụng của mình thì không quan khai báo nó trong file AndroidManifest.xml ít nhất là một thẻ service với một thuộc tính là android:name=”.ten__file_extend_tu_service”.

Quan Trọng

Chúng ta sẽ hay gặp hai loại Service trong android đó là Local Service và Remote Service
Local Service tức là service chỉ được truy cập trong nội bộ ứng dụng đó mà thôi, còn đối với Remote Service thì có thể cho ứng dụng khác, có thể trển các devide tương tác với nó.

Tìm hiểu Service qua ví dụ

public class serviceBaby extends Service {

    MediaPlayer player;
	
	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
		Toast.makeText(getApplicationContext(), "start service", 											Toast.LENGTH_LONG).show();
		player = MediaPlayer.create(getApplicationContext(), 												R.drawable.braincandy);
		player.start();
	}

	/*Phương thức này được gọi khi server được hủy*/
	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		player.stop();
		Toast.makeText(getApplicationContext(), "Destroy service", 										Toast.LENGTH_LONG).show();
	}

	/*Đây là phương thức đầu tiên mà chúng ta nhìn thấy khi làm việc với service trong android*/
	@Override
	public IBinder onBind(Intent arg0) {
		// TODO Auto-generated method stub
		return null;
	}

}

Chúng ta có một lớp kế thừa từ Service và chúng ta override ba phương thức, ở onCreate chúng ta sẽ chơi một file nhạc mp3 từ Resource. Khi service được tạo thì onCreate sẽ được gọi và chạy file mp3, và Override onDestroy() để hủy service khi nhạc được chơi xong. Ở đây chúng ta không bận tâm tới phương thức onBind bởi chúng ta không làm việc với IPC . Giải thích về phương thức này như sau, onBind(Intent clientsendto), đây là một phương thức trả về kênh thông tin từ service, nghĩa là sao, nó trả một Interface là Ibinder, Interface này được Android cung cấp để điều khiển hay tương tác với client theo cách các Remote Object làm việc. Nếu như bạn trả về về ở phương thức này là một thể hiện của IBinder thì Client có thể dùng nó để start lại service. Nếu như trả về null thì service có thể được gọi một lần như trong ví dụ này.

Tiếp đó chúng ta có một Activity để tạo một Intent và Intent này sẽ chỉ định Service mà chúng ta vừa tạo.

public class program extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Intent intent = new Intent(program.this, 							                             group.developer.android.serviceBaby.class);
        startService(intent);
    }
}

Với lời gọi startService(intent); thì Service được tạo sẽ hoạt động.

Những chú ý khi làm việc với Local Service.
chúng cùng tìm hiểu một đoạn code nhỏ được cung tấp từ android developer

 public class LocalBinder extends Binder {
        LocalService getService() {
            return LocalService.this;
        }
    }

 @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
    // This is the object that receives interactions from clients.  See
    // RemoteService for a more complete example.
    private final IBinder mBinder = new LocalBinder();

Như đã nói về phương thức onBind ở trên thì ở đây chúng ta trả về một đối tượng là thể hiện của IBinder tuy nhiên do Android khuyên chúng ta không nên inplement trực tiếp từ interface này nên chúng ta cần extends từ Binder trước. Đơn giản đoạn code này nhằm giúp client có thể call back tới service.

Về Service tham khảo thêm :

http://developer.android.com/reference/android/app/Service.html
và code demo ở API mà android cung cấp.

Share this:

Like this:

Like

Loading…