Saturday, November 23, 2019

Android tutorial | Tìm hiểu Services trong Android

Services trong Android là một thành phần chạy trong nền để thực hiện các hoạt động dài mà không cần phải tương tác với người dùng và nó hoạt động ngay cả khi ứng dụng bị phá hủy. Một services về cơ bản có thể có hai trạng thái.
Started
Một dịch vụ được bắt đầu khi một thành phần ứng dụng, chẳng hạn như một hoạt động, khởi động nó bằng cách gọi startService (). Sau khi bắt đầu, một dịch vụ có thể chạy trong nền vô thời hạn, ngay cả khi thành phần khởi động nó bị phá hủy.
Bound
Một Services bị ràng buộc khi một thành phần ứng dụng liên kết với nó bằng cách gọi bindService (). Một dịch vụ ràng buộc cung cấp giao diện máy khách-máy chủ cho phép các thành phần tương tác với dịch vụ, gửi yêu cầu, nhận kết quả và thậm chí thực hiện trên các quy trình với giao tiếp giữa các quá trình (IPC).
Service android có các phương thức gọi lại vòng đời mà bạn có thể thực hiện để theo dõi các thay đổi trong trạng thái của dịch vụ và bạn có thể thực hiện công việc ở giai đoạn thích hợp. Sơ đồ sau bên trái hiển thị vòng đời khi dịch vụ được tạo bằng startService () và sơ đồ bên phải hiển thị vòng đời khi dịch vụ được tạo bằng bindService ()
vòng đời hoạt động service android
Để create service in android, bạn tạo một lớp Java mở rộng lớp cơ sở service hoặc một trong các lớp con hiện có của nó. Lớp cơ sở service định nghĩa các phương thức gọi lại khác nhau và quan trọng nhất được đưa ra dưới đây. Bạn không cần phải thực hiện tất cả các phương thức gọi lại. Tuy nhiên, điều quan trọng là bạn phải hiểu từng người và thực hiện những điều đảm bảo ứng dụng của bạn hoạt động theo cách người dùng mong đợi.
onStartCommand ()
Hệ thống 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 bắt đầu, bằng cách gọi startService (). Nếu bạn thực hiện phương thức này, bạn có trách nhiệm dừng dịch vụ khi công việc của nó được thực hiện, bằng cách gọi các phương thức stopSelf () hoặc stopService ().
onBind ()
Hệ thống 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 (). Nếu bạn thực hiện phương pháp này, bạn phải cung cấp giao diện mà khách hàng sử dụng để liên lạc với dịch vụ, bằng cách trả về một đối tượng IBinder. Bạn phải luôn thực hiện phương pháp này, nhưng nếu bạn không muốn cho phép ràng buộc, thì bạn nên trả về null.
onUnbind ()
Hệ thống gọi phương thức này khi tất cả các máy khách đã ngắt kết nối khỏi một giao diện cụ thể được dịch vụ xuất bản.
onRebind ()
Hệ thống gọi phương thức này khi các máy khách mới đã kết nối với dịch vụ, sau khi được thông báo trước đó rằng tất cả đã bị ngắt kết nối trong onUnbind của nó.
Hệ thống gọi phương thức này khi dịch vụ được tạo lần đầu tiên bằng cách sử dụng onStartCommand () hoặc onBind (). Cuộc gọi này là bắt buộc để thực hiện thiết lập một lần.
onDestroy ()
Hệ thống 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. Dịch vụ của bạn nên thực hiện điều này để dọn sạch mọi tài nguyên như chủ đề, người nghe đã đăng ký, người nhận, v.v.
public class HelloService extends Service {
 
   /** indicates how to behave if the service is killed */
   int mStartMode;
 
   /** interface for clients that bind */
   IBinder mBinder;   
 
   /** indicates whether onRebind should be used */
   boolean mAllowRebind;
   /** Called when the service is being created. */
   @Override
   public void onCreate() {
   
   }
   /** The service is starting, due to a call to startService() */
   @Override
   public int onStartCommand(Intent intent, int flags, int startId) {
      return mStartMode;
   }
   /** A client is binding to the service with bindService() */
   @Override
   public IBinder onBind(Intent intent) {
      return mBinder;
   }
   /** Called when all clients have unbound with unbindService() */
   @Override
   public boolean onUnbind(Intent intent) {
      return mAllowRebind;
   }
   /** Called when a client is binding to the service with bindService()*/
   @Override
   public void onRebind(Intent intent) {
   }
   /** Called when The service is no longer used and is being destroyed */
   @Override
   public void onDestroy() {
   }
}
Thí dụ
Ví dụ này sẽ đưa bạn qua các bước đơn giản để hiển thị cách tạo Dịch vụ Android của riêng bạn. Thực hiện theo các bước sau để sửa đổi ứng dụng Android mà chúng tôi đã tạo trong chương Ví dụ Hello World
Sau đây là nội dung của tệp hoạt động chính được sửa đổi MainActivity.java. Tập tin này có thể bao gồm từng phương pháp vòng đời cơ bản. Chúng tôi đã thêm các phương thức startService () và stopService () để bắt đầu và dừng dịch vụ.
public class MainActivity extends Activity {
   String msg = "Android : ";
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      Log.d(msg, "The onCreate() event");
   }
   public void startService(View view) {
      startService(new Intent(getBaseContext(), MyService.class));
   }
   // Method to stop the service
   public void stopService(View view) {
      stopService(new Intent(getBaseContext(), MyService.class));
   }
}
Sau đây là nội dung của MyService.java. Tệp này có thể thực hiện một hoặc nhiều phương thức được liên kết với Dịch vụ dựa trên các yêu cầu. Hiện tại, chúng tôi sẽ chỉ triển khai hai phương thức onStartCommand () và onDestroy ()
public class MyService extends Service {
   @Nullable
   @Override
   public IBinder onBind(Intent intent) {
      return null;
   }
   @Override
   public int onStartCommand(Intent intent, int flags, int startId) {
      // Let it continue running until it is stopped.
      Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
      return START_STICKY;
   }
   @Override
   public void onDestroy() {
      super.onDestroy();
      Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
   }
}
Sau đây sẽ sửa đổi nội dung của tệp AndroidManifest.xml. Ở đây chúng tôi đã thêm thẻ <service ... /> để bao gồm dịch vụ của chúng tôi.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.tutorialspoint7.myapplication">
   <application
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      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>
Sau đây sẽ là nội dung của tệp res / layout / Activity_main.xml để bao gồm hai nút.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
   android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
 
   <TextView
      android:id="@+id/textView1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Example of services"
      android:layout_alignParentTop="true"
      android:layout_centerHorizontal="true"
      android:textSize="30dp" />
   
   <TextView
      android:id="@+id/textView2"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Tutorials point "
      android:textColor="#ff87ff09"
      android:textSize="30dp"
      android:layout_above="@+id/imageButton"
      android:layout_centerHorizontal="true"
      android:layout_marginBottom="40dp" />
   <ImageButton
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/imageButton"
      android:src="@drawable/abc"
      android:layout_centerVertical="true"
      android:layout_centerHorizontal="true" />
   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/button2"
      android:text="Start Services"
      android:onClick="startService"
      android:layout_below="@+id/imageButton"
      android:layout_centerHorizontal="true" />
   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Stop Services"
      android:id="@+id/button"
      android:onClick="stopService"
      android:layout_below="@+id/button2"
      android:layout_alignLeft="@+id/button2"
      android:layout_alignStart="@+id/button2"
      android:layout_alignRight="@+id/button2"
      android:layout_alignEnd="@+id/button2" />
</RelativeLayout>

No comments:

Post a Comment