Bạn đang xem: cách sử dụng android control program

1- Các loại dịch vụ trong Android

Dịch vụ là gì?

Một dịch vụ (Service) là một thành phần chạy ngầm trên hệ điều hành để thực hiện các hoạt động lâu dài mà không cần phải tương tác với người tiêu dùng và nó hoạt động ngay cả khi ứng dụng bị phá hủy. Một dịch vụ cơ bản có thể có hai loại.

Trạng thái
Mô tả

Started

(Được khởi động)
Một dịch vụ được gọi là started (được khởi động) khi một thành phần ứng dụng, ví dụ như Activity khởi động nó bằng cách gọi startService(). Một khi được gọi, dịch vụ này có thể chạy ở chính sách nền vô thời hạn, thậm chí cả khi thành phần đã khởi động nó bị phá hủy.

Dịch vụ này còn được gọi là dịch vụ không bị giàng buộc (Un Bounded Service).

Bound

(Giàng buộc)
Một dịch vụ được giàng buộc (bound) khi một thành phần ứng dụng giàng buộc nó bằng cách gọi bindService().
Một dịch vụ ràng buộc phân phối một giao diện client-server cho phép các thành phần tương tác với dịch vụ, gửi các yêu cầu, nhận kết quả, và thậm chí làm như vậy xuyên qua nhiều tiến trình với Interprocess communication (IPC) (Truyền thông nhiều tiến trình).

Trong khoa học PC, inter-process communication (IPC) là hoạt động chia sẻ dữ liệu qua nhiều tiến trình chuyên dụng thông thường sử dụng giao thức truyền thông.  Rõ ràng ứng dụng sử dụng IPC được phân ra như clients và servers, khi các clients yêu cầu dữ liệu, và server thỏa mãn yêu cầu của client.

Một dịch vụ có phương thức gọi lại chu kỳ vòng đời của nó (life cycle callback methods) mà bạn có thực hiện (implement) để theo dõi những 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 ở thời kỳ thích hợp. Sơ đồ dưới đây về bên trái cho thấy vòng đời khi dịch vụ được tạo ra với startService(), sơ đồ bên phải cho thấy vòng đời của dịch vụ được tạo ra bởi bindService().

Để tạo ra một dịch vụ, bạn tạo một lớp Java mở rộng lớp Service hoặc một trong các lớp con của nó. Lớp Service khái niệm các phương thức callback khác nhau và trọng yếu nhất được mang ra dưới đây. Bạn không cần phải thực hiện (implements) toàn bộ các phương thức callbacks. Tuy nhiên, điều trọng yếu là bạn hiểu mỗi phương thức thực hiện những điều gì, đảm bảo ứng dụng của các bạn xử sự theo cách người dùng mong đợi.

Ngoài 2 loại dịch vụ trên, có một dịch vụ khác gọi là IntentService. Intent Service được sử dụng để thực hiện các nhiệm vụ một lần duy nhất, nghĩa là khi nhiệm vụ hoàn thiện dịch vụ tự hủy.

So sánh các loại dịch vụ:

Unbound Service
(Không giàng buộc)
Bound Service
(Giàng buộc)
Intent 
Service

Unbounded Service được sử dụng để thực hiện nhiệm vụ lâu dài và lặp đi lặp lại.
Bounded Service được sử dụng để thực hiện nhiệm vụ ở nền (background) và giàng buộc với thành phần giao diện.

Intent Service được sử dụng để thực hiện các nhiệm vụ một lần duy nhất, nghĩa là khi nhiệm vụ hoàn thiện dịch vụ tự hủy.

Unbound Service được khởi động bởi gọi startService().

Bounded Service được khởi động bởi gọi bindService().
Intent Service được khởi động bởi gọi startService().

Unbound Service bị dừng lại hoặc bị hủy bởi gọi một cách tường minh phương thức stopService().
Bounded Service bị gỡ giàng buộc hoặc bị hủy bởi gọi unbindService().
IntentService gọi một cách không tường minh phương thức stopself() để hủy

Unbound Service độc lập với thành phần đã khởi động nó.

Bound Service phụ thuộc vào thành phần giao diện đã khởi động nó.

Intent Service độc lập với thành phần đã khởi động nó.

Các phương thức callback và mô tả:

Callback
Description

onStartCommand()
Hệ thống gọi phương thức này khi một thành phần khác, ví dụ như một Activity, yêu cầu khởi động dịch vụ, bằng cách gọi startService(). Nếu bạn thực thi phương pháp này, trách nhiệm của các bạn là ngừng dịch vụ khi nó hoàn thiện công việc, bằng cách gọi phương thức stopSelf() hoặc stopService().

onBind()
Hệ thống gọi phương thức này khi thành phần khác muốn link với các dịch vụ bằng cách gọi bindService(). Nếu bạn thi hành phương pháp này, bạn phải phân phối một giao diện (Giao diện ứng dụng) mà khách hàng sử dụng để giao tiếp với các dịch vụ, bằng cách trả lại một đối tượng IBinder. Bạn phải luôn luôn thi hành phương thức này, nhưng nếu bạn không muốn cho phép ràng buộc, bạn có thể trả về null.

onUnbind()
Hệ thống gọi phương thức này khi toàn bộ các clients đã bị ngắt kết nối từ một giao diện rõ ràng được thông báo bởi các dịch vụ.

onRebind()
Hệ thống gọi phương thức này khi khách hàng mới đã kết nối với dịch vụ, sau thời điểm trước đó đã được thông báo rằng toàn bộ đã bị ngắt kết nối trong onUnbind(Intent).

onCreate()
Hệ thống gọi phương thức này khi dịch vụ được tạo ra sử dụng trước nhất onStartCommand() hoặc onBind(). Gọi một lần tại thời điểm thiết lập.

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ị hủy (destroy). Dịch vụ của các bạn nên thi hành điều này để thu dọn các dữ liệu rác…
 

2- Dịch vụ không bị giàng buộc (Un bounded Service)

Unbound Service (hoặc thường hay gọi là Started Service): Trong trường hợp này, một thành phần ứng dụng khởi động dịch vụ bằng cách gọi startService(), và dịch vụ sẽ tiếp tục chạy trong nền (background), ngay cả khi các thành phần khởi tạo nó bị phá hủy. Ví dụ, khi được khởi đầu, một dịch vụ sẽ tiếp tục chơi nhạc trong nền vô thời hạn.

Xem Thêm  ETX - etx

Phương thức onStartCommand() trả về kiểu integer, và là một trong các giá trị sau:

  • START_STICKY
  • START_NOT_STICKY
  • TART_REDELIVER_INTENT

START_STICKY & START_NOT_STICKY

  • Cả hai giá trị này chỉ thích hợp khi smartphone hết bộ nhớ lưu trữ và giết các dịch vụ trước khi nó kết thúc thực hiện.
  • START_STICKY nói với các hệ điều hành để tạo lại các dịch vụ sau thời điểm đã có đủ bộ nhớ lưu trữ và gọi onStartCommand() một lần nữa với một Intent null.
  • START_NOT_STICKY nói với các hệ điều hành để không bận tâm tái tạo các dịch vụ một lần nữa.

Ngoài ra còn tồn tại một START_REDELIVER_INTENT giá trị thứ ba mà nói với các hệ điều hành để tạo lại các dịch vụ và truyền một Intent tương tự cho onStartCommand().

Ví dụ dịch vụ chơi nhạc (Chạy ngầm)

Tạo mới một “Empty Activity” project với tên PlaySongService

  • Name: PlaySongService
  • Package name: org.o7planning.playsongservice

Project đã được tạo ra.

Chuẩn bị file nhạc mp3:

Nhấn phải chuột vào thư mục res chọn:

  • New > Folder > Raw Resources Folder

Sao chép và Paste một file nhạc mp3 vào thư mục ‘raw‘ bạn vừa tạo ra.

Giao diện thiết kế của ứng dụng:

activity_main.xml

 
& lt;? xml version = "1.0" encoding = "utf-8"? & gt;
& lt; androidx.constraintlayout.widget.ConstraintLayout
    xmlns: android = "http://schemas.android.com/apk/res/android"
    xmlns: app = "http://schemas.android.com/apk/res-auto"
    xmlns: tools = "http://schemas.android.com/tools"
    android: layout_width = "match_parent"
    android: layout_height = "match_parent"
    dụng cụ: context = ". MainActivity" & gt;

    & lt; Nút
        android: id = "@ + id / button_play"
        android: layout_width = "wrap_content"
        android: layout_height = "wrap_content"
        android: layout_marginTop = "28dp"
        android: text = "Chơi"
        app: layout_constraintEnd_toEndOf = "cha"
        app: layout_constraintStart_toStartOf = "cha"
        app: layout_constraintTop_toTopOf = "cha" / & gt;

    & lt; Nút
        android: id = "@ + id / button_stop"
        android: layout_width = "wrap_content"
        android: layout_height = "wrap_content"
        android: layout_marginTop = "37dp"
        android: text = "Dừng lại"
        app: layout_constraintEnd_toEndOf = "cha"
        app: layout_constraintStart_toStartOf = "cha"
        app: layout_constraintTop_toBottomOf = "@ + id / button_play" / & gt;
& lt; /androidx.constraintlayout.widget.ConstraintLayoutvàgt;
 

Tạo dịch vụ lớp

Click chuột vào một gói java, chọn:

  • Mới & gt; Dịch vụ & gt; Dịch vụ

Import vào lớp tên:

  • PlaySongService


You can see PlaySongService đã được khai báo với AndroidManifest.xml :

** AndroidManifest.xml **

 
& lt;? xml version = "1.0" encoding = "utf-8"? & gt;
& lt; thống kê xmlns: android = "http://schemas.android.com/apk/res/android"
    package = "org.o7planning.playsongservice" & gt;

    & lt; ứng dụng ... & gt;

        & lt; dịch vụ
            android: name = ". PlaySongService"
            android: enable = "true"
            android: export = "true" & gt; & lt; / service & gt;

            ....

    & lt; / ứng dụng & gt;

& lt; / thống kê & gt;
 

PlaySongService.java

 
gói org.o7planning.playsongservice;

nhập android.app.Service;
nhập android.content.Intent;
nhập android.os.IBinder;
nhập android.media.MediaPlayer;

lớp công khai PlaySongService mở rộng Dịch vụ {

    MediaPlayer riêng mediaPlayer;

    công khai PlaySongService () {
    }

    // Trả lại kênh liên lạc cho dịch vụ.
    @Ghi đè
    công khai IBinder onBind (Ý định có chủ đích) {
        // Dịch vụ này không bị ràng buộc
        // Vì vậy, phương thức này không khi nào được gọi.
        trả về null;
    }


    @Ghi đè
    public void onCreate () {
        super.onCreate ();
        // Tạo đối tượng MediaPlayer để phát bài hát của các bạn.
        mediaPlayer = MediaPlayer.create (getApplicationContext (), Ŕ.raw.mysong);
    }

    @Ghi đè
    public int onStartCommand (Intent Ý định, int flags, int startId) {
        // Chơi nhạc.
        mediaPlayer.start ();

        trả lại START_STICKY;
    }

    // Tàn phá
    @Ghi đè
    public void onDestroy () {
        // Giải phóng tài nguyên
        mediaPlayer.release ();
        super.onDestroy ();
    }
}
 

MainActivity.java


gói org.o7planning.playsongservice;

nhập androidx.appcompat.app.AppCompatActivity;

nhập android.os.Bundle;
nhập android.content.Intent;
nhập android.view.View;
nhập android.widget.Button;

public class MainActivity mở rộng AppCompatActivity {

    nút bấm nút Play riêng tư;
    nút riêng tư Nút Dừng;

    @Ghi đè
    void bảo vệ onCreate (Gói đã lưuInstanceState) {
        super.onCreate (saveInstanceState);
        setContentView (Ŕ.layout.activity_main);

        this.buttonPlay = (Nút) this.findViewById (Ŕ.id.button_play);
        this.buttonStop = (Nút) this.findViewById (Ŕ.id.button_stop);

        this.buttonPlay.setOnClickListener (View.OnClickListener mới () {
            @Ghi đè
            public void onClick (View 𝒱) {
                chơi nhạc();
            }
        });

        this.buttonStop.setOnClickListener (View.OnClickListener mới () {
            @Ghi đè
            public void onClick (View 𝒱) {
                stopSong ();
            }
        });
    }

    // Phương thức này được gọi khi người dùng nhấp vào nút Play.
    public void playSong () {
        // Tạo đối tượng Intent cho PlaySongService.
        Intent myIntent = Intent mới (MainActivity.this, PlaySongService.class);

        // Gọi startService với tham số Intent.
        this.startService (myIntent);
    }

    // Phương thức này được gọi khi người dùng nhấp vào nút Dừng.
    public void stopSong () {
        
        // Tạo đối tượng Intent
        Intent myIntent = Intent mới (MainActivity.this, PlaySongService.class);
        this.stopService (myIntent);
    }

}
 

OK hiện thời bạn có thể chạy ứng dụng của mình và thưởng thức bài hát.

3- Dịch vụ bị ràng buộc (Dịch vụ bị trả lại)

Ở đây, tôi mô phỏng một dịch vụ phân phối thông tin thời tiết cho ngày hiện tại, với đầu vào là vị trí (Hanoi, Chicago, …), kết quả trả về là mưa, nắng, …

Tạo một dự án có tên WeatherService .

  • Tên : WeatherService
  • Tên gói : org.o7planning.weatherservice

Giao diện thiết kế cho ứng dụng:


activity_main.xml


& lt;? xml version = "1.0" encoding = "utf-8"? & gt;
& lt; androidx.constraintlayout.widget.ConstraintLayout
    xmlns: android = "http://schemas.android.com/apk/res/android"
    xmlns: app = "http://schemas.android.com/apk/res-auto"
    xmlns: tools = "http://schemas.android.com/tools"
    android: layout_width = "match_parent"
    android: layout_height = "match_parent"
    dụng cụ: context = ". MainActivity" & gt;

    & lt; TextView
        android: id = "@ + id / textView"
        android: layout_width = "0dp"
        android: layout_height = "38dp"
        android: layout_marginStart = "16dp"
        android: layout_marginLeft = "16dp"
        android: layout_marginTop = "17dp"
        android: layout_marginEnd = "16dp"
        android: layout_marginRight = "16dp"
        android: text = "Vị trí:"
        app: layout_constraintEnd_toEndOf = "cha"
        app: layout_constraintStart_toStartOf = "cha"
        app: layout_constraintTop_toTopOf = "cha" / & gt;

    & lt; EditText
        android: id = "@ + id / editText_location"
        android: layout_width = "0dp"
        android: layout_height = "47dp"
        android: layout_marginStart = "16dp"
        android: layout_marginLeft = "16dp"
        android: layout_marginTop = "23dp"
        android: layout_marginEnd = "16dp"
        android: layout_marginRight = "16dp"
        android: ems = "10"
        android: inputType = "textPersonName"
        app: layout_constraintEnd_toEndOf = "cha"
        app: layout_constraintStart_toStartOf = "cha"
        app: layout_constraintTop_toBottomOf = "@ + id / textView" / & gt;

    & lt; TextView
        android: id = "@ + id / textView_weather"
        android: layout_width = "0dp"
        android: layout_height = "45dp"
        android: layout_marginStart = "16dp"
        android: layout_marginLeft = "16dp"
        android: layout_marginTop = "59dp"
        android: layout_marginEnd = "16dp"
        android: layout_marginRight = "16dp"
        app: layout_constraintEnd_toEndOf = "cha"
        app: layout_constraintStart_toStartOf = "cha"
        app: layout_constraintTop_toBottomOf = "@ + id / editText_location" / & gt;

    & lt; Nút
        android: id = "@ + id / button_weather"
        android: layout_width = "wrap_content"
        android: layout_height = "wrap_content"
        android: layout_marginTop = "35dp"
        android: text = "Hiển thị thời tiết"
        app: layout_constraintEnd_toEndOf = "cha"
        app: layout_constraintStart_toStartOf = "cha"
        app: layout_constraintTop_toBottomOf = "@ + id / textView_weather" / & gt;
& lt; /androidx.constraintlayout.widget.ConstraintLayoutvàgt;
 

Tạo Dịch vụ:

Xem Thêm  Nhật ký sự lại MBBG Truyện Thiên địa - hen mot mua xuan che linh

Click chuột vào một gói java lựa chọn:

  • Mới & gt; Dịch vụ & gt; Dịch vụ

Import into:

  • Tên lớp: WeatherService

Lớp WeatherService đã được tạo ra, đây là lớp mở rộng từ lớp android.app.Service .

You can see WeatherService đã được khai báo với AndroidManifest.xml :

** AndroidManifest.xml **

 
& lt;? xml version = "1.0" encoding = "utf-8"? & gt;
& lt; thống kê xmlns: android = "http://schemas.android.com/apk/res/android"
    package = "org.o7planning.weatherservice" & gt;

    & lt; ứng dụng ... & gt;
        & lt; dịch vụ
            android: name = ". WeatherService"
            android: enable = "true"
            android: export = "true" & gt; & lt; / service & gt;

        ...

    & lt; / ứng dụng & gt;

& lt; / thống kê & gt;
 

WeatherService.java


gói org.o7planning.weatherservice;

nhập android.app.Service;
nhập android.content.Intent;
nhập android.os.IBinder;
nhập android.os.Binder;
nhập android.util.Log;
nhập java.text.DateFormat;
nhập java.text.SimpleDateFormat;
nhập java.util.Date;
nhập java.util.HashMap;
nhập java.util.Map;
nhập java.util.Random;


lớp công khai WeatherService mở rộng Dịch vụ {

    private static String LOG_TAG = "WeatherService";

    // Lưu trữ dữ liệu thời tiết.
    Bản đồ cuối cùng tĩnh riêng tư & lt; String, String & gt; weatherData = new HashMap & lt; String, String & gt; ();

    private end IBinder binder = new LocalWeatherBinder ();

    public class LocalWeatherBinder mở rộng Binder {

        public WeatherService getService () {
            trả về WeatherService.this;
        }
    }

    public WeatherService () {
    }

    @Ghi đè
    công khai IBinder onBind (Ý định có chủ đích) {
        Log.ι (LOG_TAG, "onBind");
        trả lại this.binder;
    }

    @Ghi đè
    public void onRebind (Ý định có chủ đích) {
        Log.ι (LOG_TAG, "onRebind");
        super.onRebind (ý định);
    }

    @Ghi đè
    boolean công khai onUnbind (Ý định có chủ đích) {
        Log.ι (LOG_TAG, "onUnbind");
        trả về true;
    }

    @Ghi đè
    public void onDestroy () {
        super.onDestroy ();
        Log.ι (LOG_TAG, "onDestroy");
    }

    // Trả về thông tin thời tiết tương ứng với vị trí của ngày hiện tại.
    public String getWeatherToday (Vị trí chuỗi) {
        Ngày hiện thời = new Date ();
        DateFormat df = new SimpleDateFormat ("dd-MM-yyyy");

        Chuỗi dayString = df.format (hiện thời);
        Chuỗi keyLocAndDay = location + "$" + dayString;

        Chuỗi thời tiết = weatherData.get (keyLocAndDay);
        //
        if (thời tiết! = null) {
            thời tiết trở lại;
        }

        //
        String [] weathers = new String [] {"Có mưa", "Nóng", "Mát", "Ấm", "Có tuyết"};

        // Giá trị ngẫu nhiên từ 0 đến 4
        int ι = new Random (). nextInt (5);

        thời tiết = weathers [i];
        weatherData.put (keyLocAndDay, thời tiết);
        //
        thời tiết trở lại;
    }

}
 

MainActivity.java

 
gói org.o7planning.weatherservice;

nhập androidx.appcompat.app.AppCompatActivity;

nhập android.os.Bundle;
nhập android.content.ComponentName;
nhập android.content.Context;
nhập android.content.Intent;
nhập android.content.ServiceConnection;
nhập android.os.IBinder;
nhập android.view.View;
nhập android.widget.Button;
nhập android.widget.EditText;
nhập android.widget.TextView;

public class MainActivity mở rộng AppCompatActivity {

    private boolean binded = false;
    private WeatherService weatherService;

    TextView textViewWeather riêng tư;
    riêng EditText editTextLocation;
    nút riêng Nút thời tiết;

    ServiceConnection weatherServiceConnection = new ServiceConnection () {

        @Ghi đè
        public void onServiceConnected (tên ComponentName, dịch vụ IBinder) {
            Dịch vụ kết nối WeatherService.LocalWeatherBinder = (WeatherService.LocalWeatherBinder);
            weatherService = binder.getService ();
            ràng buộc = true;
        }

        @Ghi đè
        public void onServiceDisconnected (tên ComponentName) {
            ràng buộc = sai;
        }
    };

    // Khi Activity tạo giao diện của nó.
    @Ghi đè
    void bảo vệ onCreate (Gói đã lưuInstanceState) {
        super.onCreate (saveInstanceState);
        setContentView (Ŕ.layout.activity_main);


        this.textViewWeather = (TextView) this.findViewById (Ŕ.id.textView_weather);
        this.editTextLocation = (EditText) this.findViewById (Ŕ.id.editText_location);
        this.buttonWeather = (Nút) this.findViewById (Ŕ.id.button_weather);

        this.buttonWeather.setOnClickListener (View.OnClickListener mới () {
            @Ghi đè
            public void onClick (View 𝒱) {
                 showWeather ();
            }
        });
    }

    // Khi Hoạt động khởi đầu.
    @Ghi đè
    void onStart được bảo vệ () {
        super.onStart ();

        // Tạo đối tượng Intent cho WeatherService.
        Ý định ý định = Ý định mới (cái này, WeatherService.class);

        // Gọi phương thức bindService (..) để ràng buộc dịch vụ với UI.
        this.bindService (ý định, weatherServiceConnection, Context.BIND_AUTO_CREATE);
    }

    // Dừng hoạt động
    @Ghi đè
    void onStop () {được bảo vệ
        super.onStop ();
        nếu (bị ràng buộc) {
            // Dịch vụ hủy link
            this.unbindService (weatherServiceConnection);
            ràng buộc = sai;
        }
    }

    // Khi người dùng nhấp vào nút 'Hiển thị thời tiết'.
    public void showWeather () {
        String location = this.editTextLocation.getText (). ToString ();

        String weather = this.weatherService.getWeatherToday (vị trí);

        this.textViewWeather.setText (thời tiết);
    }

}
 

OK, giờ bạn có thể chạy ứng dụng.

4- Dịch vụ IntentService

Ví dụ IntentService:

Hình ảnh dưới đây minh họa cách giao tiếp giữa Client (Activity)IntentService, Client khởi động dịch vụ, nó gửi yêu cầu của nó thông qua một đối tượng Intent, dịch vụ chạy và làm các công việc của nó, đồng thời nó có thể gửi thông tin liên quan tới tình trạng công việc của nó, ví dụ làm được bao nhiêu phần trăm. Tại client có thể sử dụng ProgressBar để hiển thị phần trăm công việc đã làm được.

Các IntentService được thiết kế để tự động stop một cách tự nhiên khi công việc hoàn thiện, và chỉ sử dụng một lần, vì vậy chúng ta nên sử dụng nó trong các tình huống như vậy. Phương thức <contextvàgt;.stopService(intentService) sẽ không hoạt động với IntentService. Hơn nữa, rất khó để bạn sử dụng UI của ứng dụng để tương tác với IntentService.

Tạo mới một project SimpleIntentService.

  • Name: SimpleIntentService
  • Package name: org.o7planning.simpleintentservice

Thiết kế giao diện:


activity_main.xml


<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="0dp"
        android:layout_height="25dp"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="28dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textView_percent"
        android:layout_width="0dp"
        android:layout_height="22dp"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="28dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:gravity="center"
        android:text="(Percent)"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/progressBar" />

    <Button
        android:id="@+id/button_start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="27dp"
        android:text="Start"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView_percent" />

    <Button
        android:id="@+id/button_stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="26dp"
        android:text="Stop"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button_start" />
</androidx.constraintlayout.widget.ConstraintLayoutvàgt;

Tạo một IntentService bằng cách nháy phải chuột vào một package, chọn:

  • New > Service > Service (IntentService)



You can see SimpleIntentService đã được khai báo với AndroidManifest.xml :

** AndroidManifest.xml **

 
& lt;? xml version = "1.0" encoding = "utf-8"? & gt;
& lt; thống kê xmlns: android = "http://schemas.android.com/apk/res/android"
    package = "org.o7planning.simpleintentservice" & gt;

    & lt; ứng dụng ... & gt;
        & lt; dịch vụ
            android: name = ". SimpleIntentService"
            android: export = "false" & gt; & lt; / service & gt;

        ...
    & lt; / ứng dụng & gt;

& lt; / thống kê & gt;
 

Lớp SimpleIntentService đã được tạo ra, nó cũng từng được đăng ký với AndroidManifest.xml , mã được tạo ra là một gợi ý cho bạn viết một IntentService , bạn có thể xóa hết các mã được tạo ra.

SimpleIntentService.java

 
gói org.o7planning.simpleintentservice;

nhập android.app.IntentService;
nhập android.content.Intent;
nhập android.os.SystemClock;

public class SimpleIntentService mở rộng IntentService {

    public static static boolean shouldStop = false;

    public static final String ACTION_1 = "MY_ACTION_1";

    public static final String PARAM_PERCENT = "phần trăm";

    public SimpleIntentService () {
        super ("SimpleIntentService");
    }

    @Ghi đè
    được bảo vệ void onHandleIntent (Ý định có chủ đích) {

        // Tạo đối tượng Intent (để tuyên truyền).
        Intent broadcastIntent = new Intent ();

        // Đặt tên Hành động cho Ý định này.
        // Một Intent có thể thực hiện nhiều hành động khác nhau.
        broadcastIntent.setAction (SimpleIntentService.ACTION_1);

        // Vòng lặp 100 lần tuyên truyền Intent.
        for (int ι = 0; ι & lt; = 100; ι ++) {

            // Đặt dữ liệu
            // (Phần trăm công việc)
            broadcastIntent.putExtra (PARAM_PERCENT, ι);

            // Gửi chương trình phát sóng
            sendBroadcast (broadcastIntent);

            // Ngủ 100 mili giây.
            SystemClock.sleep (100);

            if (shouldStop) {
                stopSelf ();
                trở về;
            }
        }

    }
}
 

MainActivity.java


gói org.o7planning.simpleintentservice;

nhập androidx.appcompat.app.AppCompatActivity;

nhập android.os.Bundle;
nhập android.content.BroadcastReceiver;
nhập android.content.Context;
nhập android.content.Intent;
nhập android.content.IntentFilter;
nhập android.os.AsyncTask;
nhập android.view.View;
nhập android.widget.Button;
nhập android.widget.ProgressBar;
nhập android.widget.TextView;

public class MainActivity mở rộng AppCompatActivity {

    nút riêng tư Nút Khởi đầu;
    nút riêng tư Nút Dừng;
    TextView textViewPercent riêng tư;

    ProgressBar riêng ProgressBar;

    dịch vụ Intent privateIntent;

    riêng bộ thu ResponseReceiver = new ResponseReceiver ();


    // Thành phần tuyên truyền
    public class ResponseReceiver mở rộng BroadcastReceiver {

        // Trên chương trình phát sóng đã nhận
        @Ghi đè
        public void onReceive (Cục diện ngữ cảnh, Mục đích ý định) {

            // Xác minh tên hành động.
            if (Ý định.getAction (). bằng (SimpleIntentService.ACTION_1)) {
                int value = Ý định.getIntExtra (SimpleIntentService.PARAM_PERCENT, 0);

                new ShowProgressBarTask (). thi hành (giá trị);
            }
        }
    }

    // Hiển thị giá trị cho ProgressBar.
    lớp ShowProgressBarTask mở rộng AsyncTask & lt; Integer, Integer, Integer & gt; {

        @Ghi đè
        Integer doInBackground được bảo vệ (Số nguyên ... args) {

            return args [0];
        }

        @Ghi đè
        void bảo vệ onPostExecute (Kết quả số nguyên) {
            super.onPostExecute (kết quả);

            processBar.setProgress (kết quả);

            textViewPercent.setText (kết quả + "% đã tải");

            if (kết quả == 100) {
                textViewPercent.setText ("Đã hoàn thành");
                buttonStart.setEnabled (true);
            }

        }
    }

    @Ghi đè
    void bảo vệ onCreate (Gói đã lưuInstanceState) {
        super.onCreate (saveInstanceState);
        setContentView (Ŕ.layout.activity_main);

        this.textViewPercent = (TextView) this.findViewById (Ŕ.id.textView_percent);
        this.progressBar = (ProgressBar) this.findViewById (Ŕ.id.progressBar);
        this.buttonStart = (Nút) this.findViewById (Ŕ.id.button_start);
        this.buttonStop = (Nút) this.findViewById (Ŕ.id.button_stop);

        this.buttonStart.setOnClickListener (View.OnClickListener mới () {
            @Ghi đè
            public void onClick (View 𝒱) {
                buttonStartClicked ();
            }
        });

        this.buttonStop.setOnClickListener (View.OnClickListener mới () {
            @Ghi đè
            public void onClick (View 𝒱) {
                buttonStopClicked ();
            }
        });
    }


    // Trên Resume của MainActivity
    @Ghi đè
    void onResume được bảo vệ () {
        super.onResume ();

        // Đăng ký người nhận với Activity.
        registerReceiver (bộ thu, IntentFilter mới (
                SimpleIntentService.ACTION_1));
    }

    // Đang dừng MainActivity
    @Ghi đè
    void onStop () {được bảo vệ
        super.onStop ();

        // Hủy đăng ký người nhận với Activity.
        unregisterReceiver (người nhận);
    }

    // Phương thức được gọi khi người dùng nhấp vào nút Khởi đầu.
    public void buttonStartClicked () {
        this.buttonStart.setEnabled (false);

        this.serviceIntent = new Intent (this, SimpleIntentService.class);

        startService (this.serviceIntent);
    }


    public void buttonStopClicked () {
        if (this.serviceIntent! = null) {
            // stopService (this.serviceIntent) không hoạt động với (các) IntentService.

            // Không nên dừng bắt buộc IntentService.
            SimpleIntentService.shouldStop = true;
        }
    }

}
 

Run application:

Xem Thêm  Top 15 kết quả tìm kiếm freeze panes excel 2010 mới nhất 2022

Và bạn có thể xem hoạt động phép tắc của ví dụ trên hình minh họa dưới đây:


Xem thêm những thông tin liên quan đến đề tài cách sử dụng android control program

Sử dụng Android cơ bản : kết nối android với PC qua Wifi sử dụng Airdroid

alt

  • Tác giả: lamntn.com – làm như vậy nào
  • Ngày đăng: 2014-05-24
  • Nhận xét: 4 ⭐ ( 5197 lượt nhận xét )
  • Khớp với kết quả tìm kiếm: Hướng dẫn các thao tác đơn giản để kết nối smartphone Android với pc sử dụng ứng dụng Airdroid
    Xem cụ thể tại : http://www.lamntn.com
    Cảm ơn bạn đã theo dõi lamntn
    hãy LIKE, SHARE & SUBSCRIBE để ủng hộ lamntn.com nhé.
    ₲+ : https://plus.google.com/+Lamntncom
    Fb : https://www.fb.com/lamntn.fanpage
    Twitter : https://twitter.com/lamntncom

Setup và sử dụng Android Studio

  • Tác giả: uybt.wordpress.com
  • Nhận xét: 5 ⭐ ( 8700 lượt nhận xét )
  • Khớp với kết quả tìm kiếm: Xem cụ thể phương thức thiết lập và thiết lập Adroid Stuido tiên tiến nhất tại đây. Chúc bạn thành công!

Cài Windows Subsystem for Android để chơi game Android trên Windows 11

  • Tác giả: anonyviet.com
  • Nhận xét: 4 ⭐ ( 9090 lượt nhận xét )
  • Khớp với kết quả tìm kiếm: Windows Subsystem for Android️ cho phép thiết bị Windows 11 chạy các ứng dụng Android có sẵn trong Amazon Appstore. Giờ đây bạn có thể chơi game hoặc chạy các app APK của Android trên Windows 11 một cách đơn giản. Trong bài này mình sẽ hướng dẫn các bạn cài Windows Subsystem for Android trên Windows.

  • Tác giả: xaiandroid.com
  • Nhận xét: 3 ⭐ ( 5559 lượt nhận xét )
  • Khớp với kết quả tìm kiếm:

Cách Sử Dụng Android Control Program, Cứu Dữ Liệu Khi Smartphone Android Bị Vỡ Màn Hình

  • Tác giả: nguyenminhchau.com
  • Nhận xét: 5 ⭐ ( 1223 lượt nhận xét )
  • Khớp với kết quả tìm kiếm: Nếu chẳng may làm rơi smartphone và màn hình bị vỡ hay cảm ứng bị liệt, bạn sẽ không thể mở khóa được thiết bị, Tuy nhiên, các bạn có thể ứng dụng 2 mẹo nhỏ sau để cứu dữ liệu

Hướng dẫn sử dụng ứng dụng Android TV Remote Control

  • Tác giả: www.dienmayxanh.com
  • Nhận xét: 4 ⭐ ( 6589 lượt nhận xét )
  • Khớp với kết quả tìm kiếm: Ứng dụng Android TV Remote Control cho phép bạn điều khiển tivi bằng smartphone đơn giản. Sau đây Điện máy XANH sẽ hướng dẫn các bước để thiết lập sử dụng ứng dụng này cho Android tivi của các bạn, mời các bạn xem qua.

Cách Sử Dụng Android Control Program, Cứu Dữ Liệu Khi Smartphone Android Bị Vỡ Màn Hình

  • Tác giả: caodangykhoatphcm.edu.vn
  • Nhận xét: 3 ⭐ ( 5521 lượt nhận xét )
  • Khớp với kết quả tìm kiếm: Nhận xét SoftonicĐặt hệ điều hành Android của các bạn trên Windows Vysor cho phép bạn sử dụng hệ điều hành Android từ smartphone thông minh của các bạn vào hệ điều hành Windows của các bạn, Vysor có thể được sử dụng với Chrome hoặc với hệ điều hành Windows

Xem thêm các nội dung khác thuộc thể loại: Thủ thuật máy tính

By ads_php