Tuesday, March 9, 2021

Tìm hiểu Service trong Android

Trong lập trình Android, Service Android là một thành phần giữ cho ứng dụng chạy trong nền để thực hiện các hoạt động lâu dài dựa trên yêu cầu của chúng tôi. Đối với Dịch vụ , chúng tôi không có bất kỳ giao diện người dùng nào và nó sẽ chạy các ứng dụng trong nền như phát nhạc trong nền hoặc xử lý các hoạt động mạng khi người dùng trong một ứng dụng khác.

Vòng đời hoạt động service trong Android

Trong android, vòng đời của service android sẽ đi theo hai con đường khác nhau Started hoặc Bound.

Started trong Service

Một Started service khi một thành phần ứng dụng, chẳng hạn như một hoạt động gọi phương thức startService(). Sau khi khởi động, nó sẽ chạy vô thời hạn trong nền ngay cả khi thành phần khởi động bị phá hủy.

Chúng tôi có thể dừng dịch vụ Đã bắt đầu bằng phương thức stopService() sử dụng hoặc dịch vụ có thể tự dừng bằng phương thức stopSelf() được goi . Trong android, thành phần service Started sẽ thực hiện một thao tác duy nhất và nó sẽ không trả về bất kỳ kết quả nào cho ứng dụng gọi nó. 

Bound trong Service

Một Service bị ràng buộc khi một thành phần ứng dụng khác gọi phương thức bindService(). Dịch vụ liên kết chạy miễn là một thành phần ứng dụng khác được liên kết với nó.

Chúng tôi có thể hủy liên kết dịch vụ bằng phương thức unbindService() gọi dựa trên yêu cầu của chúng tôi. Trong android, chúng ta có thể liên kết nhiều thành phần với một dịch vụ cùng một lúc, nhưng dịch vụ sẽ bị hủy trong trường hợp tất cả các thành phần được hủy liên kết.

Sơ đồ vòng đời các dịch vụ Android

Biểu đồ sau show vòng đời của Started service, khi dịch vụ được tạo ra với startService()và vòng đời của bound service, khi dịch vụ được tạo ra với bindService().

Tìm hiểu Service trong Android

Để tạo một dịch vụ, chúng ta cần tạo một lớp mở rộng một lớp cơ sở Dịch vụ hoặc một trong các lớp con hiện có của nó. Trong quá trình triển khai dịch vụ, chúng tôi phải ghi đè một số phương thức gọi lại xử lý các khía cạnh chính của vòng đời dịch vụ và cung cấp chức năng cho phép các thành phần của chúng tôi liên kết với dịch vụ.

Tạo một service trong android

Nói chung, trong lâp trình android cơ bản để tạo một dịch vụ, chúng ta phải tạo một lớp con của Dịch vụ hoặc sử dụng một trong các lớp con hiện có. Trong android, thành phần ứng dụng chẳng hạn như một hoạt động có thể bắt đầu dịch vụ bằng cách gọi startService()dẫn đến việc gọi onStartCommand()phương thức của dịch vụ .
public class SampleService extends Service {

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //TODO write your own code

       return Service.START_NOT_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        //TODO for communication return IBinder implementation
        return null;
    }
}

Đăng ký một service trong Manifest

Khi chúng tôi tạo một dịch vụ, chúng tôi cần đăng ký dịch vụ đó trong tệp kê khai android bằng phần tử <service> như hình dưới đây.
<manifest ... >

   ...
  <application ... >
     <service android:name=".SampleService" />
  </application>

  ...
</manifest>

Start một service trong Android

Trong android, thành phần như một hoạt động , dịch vụ hoặc bộ thu có thể bắt đầu dịch vụ bằng startService()phương thức. Sau đây là đoạn mã mẫu về việc bắt đầu một dịch vụ bằng  phương thức startService .
Intent intent = new Intent(this, MyService.class);
startService(intent);

Callback service trong Android

Trong quá trình triển khai dịch vụ, sau đây là các phương thức gọi lại mà chúng tôi cần ghi đè trong ứng dụng Android.
onStartCommand ()
Hệ thống sẽ gọi phương thức này khi một thành phần khác, chẳng hạn như một hoạt động yêu cầu dịch vụ được khởi động bằng cách gọi startService () . Khi phương thức này được thực thi, dịch vụ sẽ bắt đầu và chạy vô thời hạn trong nền. Nếu chúng tôi triển khai điều này trong mã của mình, chúng tôi có trách nhiệm dừng dịch vụ sau khi thực thi mã được thực hiện bằng cách gọi stopSelf()hoặc stopService()các phương thức. Trong trường hợp, nếu chúng ta chỉ muốn cung cấp ràng buộc, thì chúng ta không cần thực hiện phương pháp này.

Trong android, onStartCommand()phương thức phải trả về một số nguyên và số nguyên là một giá trị mô tả cách hệ thống sẽ tiếp tục dịch vụ trong trường hợp hệ thống loại bỏ nó.

Các onStartCommand()phương pháp sẽ trả về một giá trị từ một trong những hằng số sau.

START_STICKY
Nó sẽ khởi động lại dịch vụ trong trường hợp nếu nó bị chấm dứt và dữ liệu Intent được chuyển đến  phương thức onStartCommand () là NULL. Điều này phù hợp với dịch vụ không thực hiện lệnh nhưng chạy độc lập và chờ công việc.
START_NOT_STICKY
Nó sẽ không khởi động lại dịch vụ và nó hữu ích cho các dịch vụ sẽ chạy định kỳ. Dịch vụ sẽ chỉ khởi động lại khi có lệnh gọi startService () đang chờ xử lý . Đó là lựa chọn tốt nhất để tránh chạy một dịch vụ trong trường hợp không cần thiết.
START_REDELIVER_INTENT
Nó giống như STAR_STICY và nó tạo lại dịch vụ, gọi onStartCommand()với mục đích cuối cùng đã được gửi đến dịch vụ.
onBind ()
Hệ thống sẽ gọi phương thức này khi một thành phần khác muốn liên kết với dịch vụ bằng cách gọi bindService(). Trong quá trình thực hiện phương pháp này, chúng ta phải cung cấp một giao diện cho các máy khách để giao tiếp với dịch vụ bằng cách trả về một đối tượng IBinder . Trong android, chúng ta phải thực hiện phương thức này, trong trường hợp nếu chúng ta không cần cho phép ràng buộc, thì chúng ta nên trả về NULL.
onCreate ()
Hệ thống sẽ gọi phương thức này khi dịch vụ được tạo ban đầu bằng cách sử dụng onStartCommand()hoặc onBind()các phương thức để thực hiện các thủ tục thiết lập một lần. Trong trường hợp, nếu dịch vụ đã chạy, thì phương thức này sẽ không gọi.
onDestroy ()
Hệ thống sẽ gọi phương thức này khi dịch vụ không còn được sử dụng và đang bị phá hủy. Đây là lệnh gọi cuối cùng mà dịch vụ sẽ nhận được và chúng tôi cần triển khai phương thức này trong dịch vụ của mình để dọn dẹp mọi tài nguyên không sử dụng như luồng, bộ thu hoặc bộ nghe. 

Nói chung, trong android nếu chúng ta bắt đầu một dịch vụ bằng startService()phương thức gọi , dịch vụ sẽ chạy liên tục ngay cả khi thành phần bắt đầu dịch vụ bị phá hủy cho đến khi chúng ta dừng nó bằng cách sử dụng stopService()hoặc nó tự dừng với stopSelf().
Tương tự như vậy, nếu chúng ta tạo một dịch vụ bằng bindService()phương thức gọi , dịch vụ sẽ chạy miễn là thành phần được liên kết với nó. Sau khi dịch vụ không bị ràng buộc khỏi tất cả các máy khách của nó, hệ thống sẽ hủy nó.
Trong android, vòng đời dịch vụ có một tập hợp các phương thức gọi lại cần được triển khai để theo dõi trạng thái dịch vụ và thực thi những thứ được yêu cầu trong thời gian thích hợp
Sau đây là dịch vụ khung mô tả về từng phương pháp vòng đời.
public class SampleService extends Service {
    int mStartMode;       // It indicates how to behave if the service is killed
    IBindermBinder;      // interface for clients that bind
    boolean mAllowRebind; // It indicates whether onRebind should be used

    @Override
    public void onCreate() {
        // The service is being created
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // The service is starting, due to a call to startService()
        return mStartMode;
    }
    @Override
    public IBinder onBind(Intent intent) {
        // A client is binding to the service with bindService()
        return mBinder;
    }
    @Override
    public boolean onUnbind(Intent intent) {
        // All clients have unbound with unbindService()
        return mAllowRebind;
    }
    @Override
    public void onRebind(Intent intent) {
        // A client is binding to the service with bindService(),

      // after onUnbind() has already been called
    }
    @Override
    public void onDestroy() {
        // The service is no longer used and is being destroyed

}
}

Ví dụ Service trong Android

Dưới đây là ví dụ về việc bắt đầu phát nhạc trong nền khi chúng tôi khởi động một dịch vụ và nhạc đó sẽ phát liên tục cho đến khi chúng tôi dừng dịch vụ trong ứng dụng Android.
 MyService.java
 public class MyService extends Service {
    private MediaPlayer player;
    @Override
    public IBinder onBind(Intent intent) {
        return  null;
    }
    @Override
    public void onCreate() {
        Toast.makeText(this, "Service was Created", Toast.LENGTH_LONG).show();
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        player = MediaPlayer.create(this, Settings.System.DEFAULT_RINGTONE_URI);
        // This will play the ringtone continuously until we stop the service.
        player.setLooping(true);
        // It will start the player
        player.start();
        Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
        return START_STICKY;
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        // Stopping the player when service is destroyed
        player.stop();
        Toast.makeText(this, "Service Stopped", Toast.LENGTH_LONG).show();
    }
}
Bây giờ, hãy mở tệp activity_main.xml từ đường dẫn \ src \ main \ res \ layout và viết mã sau.
Activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/btnStart"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="startService"
        android:layout_marginLeft="130dp"
        android:layout_marginTop="150dp"
        android:text="Start Service"/>
    <Button
        android:id="@+id/btnstop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="stopService"
        android:layout_marginLeft="130dp"
        android:layout_marginTop="20dp"
        android:text="Stop Service"/>
</LinearLayout>
Bây giờ, hãy mở tệp MainActivity.java từ đường dẫn \ java \ com.tutlane.services và viết phần sau để triển khai các ý định phát sóng tùy chỉnh .
MainActivity.java
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    // Start the service
    public void startService(View view) {
        startService(new Intent(this, MyService.class));
    }
    // Stop the service
    public void stopService(View view) {
        stopService(new Intent(this, MyService.class));
    }
}

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

    <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>
Kêt quả:

No comments:

Post a Comment