Trang 1/2 12 CuốiCuối
Hiện kết quả từ 1 tới 10 của 20
Like Tree7Likes

Chủ đề: Lập trình Android cơ bản: Bài 5 Android Service


  1. #1
    Moderator Avatar của androidviet
    Tham gia
    Sep 2010
    Bài gửi
    2.076

    Lập trình Android cơ bản: Bài 5 Android Service

    Service là 1 trong 4 thành phần chính trong 1 ứng dụng Android ( Activity, Service, BroadcastReceiver, ContentProvider) thành phần này chạy trong hậu trường và làm những công việc không cần tới giao diện như chơi nhạc, download, xử lí tính toán…

    Một Service có thể được sử dụng theo 2 cách:

    - Nó có thể được bắt đầu và được cho phép hoạt động cho đến khi một người nào đó dừng nó lại hoặc nó tự ngắt. Ở chế độ này, nó được bắt đầu bằng cách gọi Context.startService() và dừng bằng lệnh Context.stopService(). Nó có thể tự ngắt bằng lệnh Service.stopSelf() hoặc Service.stopSelfResult(). Chỉ cần một lệnh stopService() để ngừng Service lại cho dù lệnh startService() được gọi ra bao nhiêu lần

    - Service có thể được vận hành theo như đã được lập trình việc sử dụng một Interface mà nó định nghĩa. Các người dùng thiết lập một đường truyền tới đối tượng Service và sử dụng đường kết nói đó để thâm nhập vào Service. Kết nối này được thiết lập bằng cách gọi lệnh Context.bindService() và được đóng lại bằng cách gọi lệnh Context.unbindService(). Nhiều người dùng có thể kết nối tới cùng một thiết bị. Nếu Service vẫn chưa được khởi chạy, lệnh bindService() có thể tùy ý khởi chạy nó. Hai chế độ này thì không tách biệt toàn bộ. Bạn có thể kết nối với một Service mà nó đã được bắt đầu với lệnh startService(). Ví dụ, một Service nghe nhạc ở chế độ nền có thể được bắt đầu bằng cách gọi lệnh startService() cùng với một đối tượng Intent mà định dạng được âm nhạc để chơi. Chỉ sau đó, có thể là khi người sử dụng muốn kiểm soát trình chơi nhạc hoặc biết thêm thông tin về bài hát hiện tại đang chơi, thì sẽ có một Activity tạo lập một đường truyền tới Service bằng cách gọi bindService(). Trong trường hợp như thế này, stopService() sẽ không thực sự ngừng Service cho đến khi liên kết cuối cùng được đóng lại.

    Giống như một Activity, một Service cũng có các phương thức chu kỳ thời gian mà bạn có thể cài đặt để kiểm soát những sự thay đổi trong trạng thái của nó. Những những phương thức của Service thì ít hơn là của Activity – chỉ có 3- và chúng thì được sử dụng rộng rãi, không được bảo vệ.
    void onCreate()
    void onStart(Intent intent)
    void onDestroy()

    Bằng việc thực hiện những phương thức này, bạn có thể giám sát 2 vòng lặp của chu kỳ thời gian của mỗi Service
    Entire lifetime của một Service diễn ra giữa thời gian onCreate() được gọi ra và thời gian mà onDestroy() trả lại. Giống như một Activity, một Service lại tiết hành cài đặt ban đầu ở onCreate(), và giải phóng tát cả các tài nguyên còn lại ở onDestroy() Ví dụ, một Service phát lại nhạc có thể tạo ra một luồng và bắt đầu chơi nhạc onCreate(),và sau đó luồng chơi nhạc sẽ dừng lại ở onCreate(),
    Active lifetime của một Service bắt đầu bằng một lệnh tới onStart(). Đâylà phương thức được chuyển giao đối tượng Intent mà đã được thông qua để tới startService() Service âm nhạc sẽ mở đối tượng Intent để quyết định xem sẽ chơi loại nhạc nào và bắt đầu phát nhạc.
    Không có callback tương đương nào cho thời điểm Service ngừng lại – không có phương thức onStop()
    Các phương thức onCreate() và onDestroy() được gọi cho tất cả các Service dù chúng có được bắt đầu bằng Context.startService() hoặc Context.bindService() hay không. Tuy nhiên thì, onStart() chỉ được gọi ra đối với các Service bắt đầu bằng startService().
    Nếu một Service cho phép những Service khác kết nối với nó thì sẽ có thêm các phương thức callback dành cho Service đó để thực hiên

    IBinder onBind(Intent intent)
    boolean onUnbind(Intent intent)
    void onRebind(Intent intent)

    Hàm callback onBind() thông qua đối tượng Intent đã đựoc truyền đến bindService và onUnbind() được chuyển giao đối tượng mà đã được chuyển đến. Nếu Service đang được chỉ định (binding), onBind() quay trở lại kênh thông tin mà người dùng sử dụng để tương tác với Service. Phương thức onUnbind() có thể yêu cầu onRebind() được gọi nếu một người dùng kết nối với Service

    Biểu đồ dưới đây minh họa cho các phương thức callback giành cho một Service. Mặc dù, nó phân tách các Service được tạo ra thông qua startService với các Service mà được tạo ra bằng bindService(). Hãy nhớ rằng bất kì Service nào, cho dù nó được khởi tạo như thế nào thì nó vẫn có thể cho phép các người dùng kết nối tới nó một cách hiệu quả nhất, cho nên bất kì Service nào cũng có thể được chỉ định thông qua các các phương thức onBind()và onUnbind()


    Service LifeCycle

    Nguồn : vietandroid



    Lần sửa cuối bởi androidviet; 05-09-10 lúc 11:33 AM
    fantasia89 and gbn11 like this.

  2. #2
    Moderator Avatar của androidviet
    Tham gia
    Sep 2010
    Bài gửi
    2.076
    Các bạn đã đọc và hiểu về Service trong Part 1. Tiếp theo mình sẽ làm 1 demo nhỏ để các bạn hiểu rõ hơn về Service. Demo tạo 1 service chơi nhạc và người sử dụng có thể điều khiển service này.


    Giao diện chương trình :




    Đầu tiên là tạo 1 giao diện điều khiển service chơi nhạc bằng layout đơn giản :

    Mã:
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:padding="4dip"
    android:gravity="center_horizontal"
    android:layout_width="fill_parent" android:layout_height="fill_parent">

    <TextView
    android:layout_width="fill_parent" android:layout_height="wrap_content"
    android:layout_weight="0"
    android:paddingBottom="4dip"
    android:text="@string/local_service_binding"/>
    <Button android:id="@+id/bind"
    android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:text="@string/bind_service">
    <requestFocus />
    </Button>
    <Button android:id="@+id/unbind"
    android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:text="@string/unbind_service">
    </Button>
    <Button android:id="@+id/play"
    android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:text="@string/Play">
    </Button>
    </LinearLayout>
    Tạo 1 class LocalService.java extend từ Service và một lớp con LocalBinder thừa kế từ lớp Binder ( dùng để điều khiển service )

    Mã:
    public class LocalService extends Service {

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

    .....
    }
    Từ đó nạp chồng phương thức onBind bằng cách trả lại giá trị mBinder

    Mã:
    private final IBinder mBinder = new LocalBinder();
    @Override
    public IBinder onBind(Intent intent) {
    return mBinder;
    }
    Tạo một đối tượng MediaPlayer chơi nhạc đơn giản ( sử dụng để chơi file abc.mp3 đặt trong folder res/raw ):

    Mã:
    MediaPlayer mMediaPlayer;
    public void startMp3Player() {
    mMediaPlayer = MediaPlayer.create(getApplicationContext(),
    R.raw.abc);
    mMediaPlayer.start();
    }

    public void mp3Stop() {
    mMediaPlayer.stop();
    mMediaPlayer.release();
    }
    Ở lớp LocalServiceBinding.java extend từ lớp Activity chúng ta chỉ cần để ý đến đối tượng mConnection có nhiệm vụ giám sát kết nối của service chơi nhạc.
    Mã:
    private ServiceConnection mConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder service) {
    mBoundService = ((LocalService.LocalBinder)service).getService();
    Toast.makeText(LocalServiceBinding.this, R.string.local_service_connected,
    Toast.LENGTH_SHORT).show();
    }

    public void onServiceDisconnected(ComponentName className) {
    mBoundService = null;
    Toast.makeText(LocalServiceBinding.this, R.string.local_service_disconnected,
    Toast.LENGTH_SHORT).show();
    }
    };
    Và xử lý sự kiện 3 button ( Bind, Unbin, Play/Stop )
    Mã:
    private OnClickListener mBindListener = new OnClickListener() {
    public void onClick(View v) {
    bindService(new Intent(LocalServiceBinding.this,
    LocalService.class), mConnection, Context.BIND_AUTO_CREATE);
    mIsBound = true;
    mPlayButton.setEnabled(true);

    }
    };

    private OnClickListener mPlayListener = new OnClickListener() {
    public void onClick(View v) {
    if(mPlayButton.getText() == "Play")
    {
    mBoundService.startMp3Player();
    mPlayButton.setText("Stop");
    }
    else
    {
    mBoundService.mp3Stop();
    mPlayButton.setText("Play");
    }
    }
    };

    private OnClickListener mUnbindListener = new OnClickListener() {
    public void onClick(View v) {
    if (mIsBound) {
    unbindService(mConnection);
    mIsBound = false;
    mPlayButton.setEnabled(false);
    }
    }
    };
    SourceCode : http://www.mediafire.com/?ymyyiynizlz
    P/S: Nhớ đeo headphone khi chạy chương trình


    fantasia89, gbn11 and phamtrung92 like this.

  3. #3
    habeotron
    Guest Avatar của habeotron
    hi hi, mình làm theo được đúng đến đoạn tạo giao diện lúc đầu. Bắt đầu đến bước tạo class thì phải nhìn sourceCode mà làm theo. T_T. Cám ơn bài viết của bạn nhé


    gbn11 and YUGI like this.

  4. #4
    north3102
    Guest Avatar của north3102
    Vừa tham gia dùng Android nên còn gà, mong các ĐC thông cảm nhé.
    xin có câu hỏi muốn nhờ ae giúp với. Mình cài thêm các PM vào máy, nhưng ta ko thể kích đúp vào file đó để mở đc (giống như trên máy tính vậy). ví dụ khi ta cài kindle để đọc sách nhưng lại ko thể kick đúp vào file sách đó để mở ra đc, mà lại phải mở Kindle ... rồi mới vào đc.
    Vậy nhờ ae lập trình xem có cách nào làm như trên máy tính đc ko, tức là muốn mở file nào thì kick đúp vào file đó. như vậy mình thấy tiện dụng hơn giống như những trình mặc định trên android có thể làm đc đấy.
    mong ae lập trình viên xem xét



  5. #5
    Thành Viên Mới Avatar của Bach
    Tham gia
    Nov 2011
    Bài gửi
    3
    Bạn androidviet ơi, làm ơn cho mình hỏi vài điều với:
    1. Tại sao unbindService(mConnection) khi gửi chỉ gửi mConnection mà ko gửi thêm Intent như cái Bind.

    2. public class LocalService extends Service {

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


    Mình chưa hỉu tác dụng của những dòng này và dòng khai báo biến mBinder cho lắm. Mình có thể thay bằng Contructor ko ? Tại sao fải có nó, và trong Class LocalServiceBinding mình thấy bạn có sử dụng hàm getService()....Nói chung là cú pháp và cách viết lạ quá, nếu bạn có thể giải thích rõ ràng giúp mình, thì mình chân thanh cám ơn nhìu.....THANKS !! (Còn lại thì mình hiu hết rồi, chỉ thắc mắc phần đó thôi ah` @@)



  6. #6
    Thành Viên Mới Avatar của borntolead
    Tham gia
    Jun 2012
    Bài gửi
    2
    hì hay quá @@ cố gắng phát huy



  7. #7
    Thành Viên Mới Avatar của euwieljogu
    Tham gia
    Jun 2012
    Bài gửi
    2
    Bài viết hay, up phụ tớ với nhé



  8. #8
    Thành Viên Mới Avatar của dinhthaobkhn
    Tham gia
    Jul 2012
    Bài gửi
    3
    Các bạn cho mình hỏi chút. Mình cho chạy service này thì bị lỗi như thế này " sorry! The application MyService (process my.service) has stopped unexpectedly, Please try again!!", không biết tại sao? mong các pro chỉ giúp!!!


    Lần sửa cuối bởi dinhthaobkhn; 05-07-12 lúc 07:06 AM

  9. #9
    Thành Viên Mới Avatar của dinhthaobkhn
    Tham gia
    Jul 2012
    Bài gửi
    3
    Các bạn cho mình hỏi chút. Mình cho chạy service này thì bị lỗi như thế này " The application MyService (process my.service) has stopped unexpectedly, Please try agian!!", không biết tại sao? mong các pro chỉ giúp!!!



  10. #10
    Super Moderator Avatar của sieuload
    Tham gia
    Aug 2010
    Bài gửi
    11.830
    Quote Nguyên văn bởi dinhthaobkhn Xem bài viết
    Các bạn cho mình hỏi chút. Mình cho chạy service này thì bị lỗi như thế này " The application MyService (process my.service) has stopped unexpectedly, Please try agian!!", không biết tại sao? mong các pro chỉ giúp!!!
    Đây là lỗi chung chung, xem lại code thôi.




Trang 1/2 12 CuốiCuối

Đánh dấu

Quyền viết bài

  • Bạn không thể gửi chủ đề mới
  • Bạn không thể gửi trả lời
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •