Há»?Ä‘iá»u hành Archives - Cao Äẳng FPT M?ng c¨¢ c??c b¨®ng ?¨¢ xét tuyển //westview-heights.com/tag/he-dieu-hanh Cao Äẳng FPT M?ng c¨¢ c??c b¨®ng ?¨¢ tuyển sinh theo hình thức xét tuyển há»?sÆ¡. Tiêu chí đào tạo: Thá»±c há»c â€?Thá»±c nghiệp! Fri, 07 Oct 2022 10:25:22 +0000 vi hourly 1 //wordpress.org/?v=6.4.1 //westview-heights.com/wp-content/uploads/cropped-logo-fpt-32x32.png Há»?Ä‘iá»u hành Archives - Cao Äẳng FPT M?ng c¨¢ c??c b¨®ng ?¨¢ xét tuyển //westview-heights.com/tag/he-dieu-hanh 32 32 Há»?Ä‘iá»u hành Archives - Cao Äẳng FPT M?ng c¨¢ c??c b¨®ng ?¨¢ xét tuyển //westview-heights.com/tin-tuc-poly/tong-quan-ve-service-trong-he-dieu-hanh-android.html //westview-heights.com/tin-tuc-poly/tong-quan-ve-service-trong-he-dieu-hanh-android.html#respond Fri, 07 Oct 2022 10:25:22 +0000 //westview-heights.com/?p=196607 Service được coi là má»™t trong bốn thành phần lá»›n của Android, đóng vai trò nhÆ° má»™t thành phần hết sức quan trá»ng. Äối vá»›i bất cá»?ai nếu muốn trá»?thành má»™t Android Developer thá»±c thá»?thì bắt buá»™c ...

The post Tổng quan vá»?Service trong há»?Ä‘iá»u hành Android appeared first on Cao Äẳng FPT M?ng c¨¢ c??c b¨®ng ?¨¢ xét tuyển.

]]>
Service được coi là má»™t trong bốn thành phần lá»›n của Android, đóng vai trò nhÆ° má»™t thành phần hết sức quan trá»ng. Äối vá»›i bất cá»?ai nếu muốn trá»?thành má»™t Android Developer thá»±c thá»?thì bắt buá»™c phải nắm rõ và hiểu biết sâu vá»?“Service”.

TrÆ°á»›c hết, biểu tượng của Service trong há»?Ä‘iá»u hành là má»™t robot chiến binh Android vá»›i thanh kiếm tượng trÆ°ng cho Activity, trong đó có hai chiếc ăng ten được xem là Broadcast Receiver, Intent là cánh tay còn View là đôi chân. Ngoài ra, Content Provider lại giống nhÆ° má»™t nÆ¡i cung cấp nhiên liệu cho robot, cùng vá»›i đó là má»™t thành phần nằm trong thân robot tuy nhiên không thá»?nhìn thấy là Service, sá»?hữu má»™t chiếc quạt gió chạy liên tục, khi robot chiến đấu hay ká»?cáº?khi ngá»?nghá»?thì chiếc quạt vẫn liên tục hoạt Ä‘á»™ng. 

1. Service là 

Má»™t Service là thành phần (component) có thá»?thá»±c hiện các hoạt Ä‘á»™ng lâu dài trong background và nó không cung cấp má»™t giao diện ngÆ°á»i dùng nào. Dù vậy, má»™t thành phần khác của ứng dụng này có thá»?khởi Ä‘á»™ng và nó sáº?tiếp tục chạy trong background ngay cáº?khi ngÆ°á»i dùng chuyển sang ứng dụng khác. Ngoài ra, má»™t thành phần có thá»?liên kết tùy ý (bind) vá»›i má»™t Service Ä‘á»?tÆ°Æ¡ng tác vá»›i Service đó, thậm chí là thá»±c hiện truyá»n thông liên tiến trình IPC (interprocess communication – IPC có thá»?được hiểu nhÆ° má»™t hoạt Ä‘á»™ng chia sáº?dá»?liệu qua nhiá»u tiến trình, thông thÆ°á»ng sá»?dụng giao thức truyá»n thông và phải có Client và Server). Lấy ví dá»?vá»?trÆ°á»ng hợp Ä‘iển hình, má»™t Service có thá»?thá»±c hiện các giao dịch mạng, chÆ¡i nhạc, ra vào file I/O hoặc tÆ°Æ¡ng tác vá»›i má»™t content provider, tất cáº?Ä‘á»u xuất phát tá»?background.

2. Phân loại Service 

2.1. Foreground Service

á»?trong trÆ°á»ng hợp này, má»™t Foreground Service có thá»?thá»±c hiện má»™t sá»?thao tác mà ngÆ°á»i dùng dá»?dàng sá»?dụng. Ví dá»? má»™t ứng dụng nghe nhạc có thá»?chÆ¡i má»™t bản nhạc và Ä‘iá»u khiển nó bằng Foreground Service. Tuy vậy, má»™t Ä‘iá»u bắt buá»™c là Foreground Service cần phải được cấp quyá»n hiển thá»?thông báo và sáº?tiếp tục chạy ngay cáº?khi ngÆ°á»i dùng không tÆ°Æ¡ng tác vá»›i ứng dụng.

2.1.1 Xây dựng ứng dụng nghe nhạc

Bước 1: Xây dựng giao diện

BÆ°á»›c 2: Ãnh xáº?các view sang file MainActivity.java

Bước 3: Xây dựng layout chơi nhạc

Bước 4: Tạo thông báo và tạo ra 1 class với tên tùy ý

BÆ°á»›c 5: Äăng ký lá»›p vừa tạo bên trong file AndroidManifest.xml

android:name=”.MyNotificationChangnel”

BÆ°á»›c 6: Chuẩn bá»?tài nguyên ảnh pause và play trong thÆ° mục drawable. Äồng thá»i, tạo ra thÆ° mục raw Ä‘á»?chứa file nhạc mp3

Bước 7: Tạo ra class MySong.java

public class MySong implements Serializable {
private String name;
private String title;
private int img;
private int resouce;

public MySong(String name, String title, int img, int resouce) {
this.name = name;
this.title = title;
this.img = img;
this.resouce = resouce;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public int getImg() {
return img;
}

public void setImg(int img) {
this.img = img;
}

public int getResouce() {
return resouce;
}

public void setResouce(int resouce) {
this.resouce = resouce;
}
}

Bước 8: Tạo ra 2 phương thức trong file MainActivity.java

  • Background Service

Cá»?thá»? má»™t Background Service sáº?thá»±c hiện các hoạt Ä‘á»™ng dù không được ngÆ°á»i dùng chú ý trá»±c tiếp. Ví dá»? ứng dụng sá»?dụng má»™t service Ä‘á»?thu gom bá»?nhá»?tá»?ngÆ°á»i chÆ¡i thì service đó là má»™t Background Service, hoạt Ä‘á»™ng mà ngÆ°á»i dùng không nhất thiết phải Ä‘á»?ý.

Bởi những lí do nhÆ° vậy, Service sáº?được coi là Background Service nếu không nằm 1 trong 3 trÆ°á»ng hợp sau:

  • Ứng dụng của ngÆ°á»i dùng hiện có Activity hiển thá»?/span>
  • Ứng dụng của ngÆ°á»i dùng có Foreground Service Ä‘ang chạy
  • Ứng dụng của ngÆ°á»i dùng được kết nối vá»›i má»™t ứng dụng Foreground khác, á»?đây là phÆ°Æ¡ng thức ràng buá»™c Service bằng cách sá»?dụng các Content Providers của chúng

2.3. Demo ứng dụng chạy nhạc mà không hiển th�giao diện

Bước 1: Tạo thư mục raw trong res, đưa file nhạc vào thư mục raw

Bước 2: Tạo class MyBackgroundService.java

 

Bước 3: Cài đặt trong file activity_main.xml

Bước 4: Cài đặt trong file MainActivity.java

Bước 5: Khai báo Service trong file AndroidManifest.xml

Ví dá»?: <service android:name=”.MyBackgroundService”/>

Lưu ý: Background Service s�chạy ổn định trên android O tr�lên

2.4. Bound Service

Má»™t service được gá»i là Bound khi má»™t thành phần của ứng dụng ràng buá»™c vá»›i nó bởi lá»i gá»i bindService(). Nó cung cấp má»™t giao diện Client – Server cho phép các thành phần tÆ°Æ¡ng tác vá»›i nó, bao gồm: gá»­i yêu cầu, nhận kết quáº?và thậm chí là IPC. Nhìn chung, Bound Service chá»?chạy miá»…n là có má»™t thành phần ràng buá»™c vá»›i nó. Mặc dù có thá»?có nhiá»u thành phần ràng buá»™c vá»›i Bound Service cùng lúc, nhÆ°ng khi tất cáº?tháo bá»?ràng buá»™c (unbound) thì nó sáº?hủy bá»? Bên cạnh đó, Service còn được phân chia là Started Service và Bound Service.

Một Started Service hay là Unbound Service là service được khởi động bằng phương thức startService() t�thành phần khác. Thậm chí, nó s�tiếp tục chạy trong background k�c�khi thành phần khởi tạo nó b�phá hủy và đây cũng được xem là một Background Service theo cách chia trên.

2.4.1. S�dụng Bound Service đ�chơi nhạc

Bước 1: Tạo file layout activity_main.xml

Bước 2: Tạo ra lớp MusicBoundService.java

Bước 4: Tạo thư mục raw và copy file nhạc vào

Bước 5: Khai báo Service trong file AndroidManifest.xm

3. Äá»?Æ°u tiên các loại Service

Xét riêng vá»?há»?Ä‘iá»u hành này, Android bắt buá»™c phải dừng má»™t service khi bá»?nhá»?ít và phải khôi phục tài nguyên há»?thống cho Activity Ä‘ang được sá»?dụng. Nếu Service được ràng buá»™c vá»›i má»™t Activity Ä‘ang sá»?dụng thì rất ít kháº?năng bá»?tiêu hủy. Tuy nhiên, nếu Service được khai báo và chạy á»?cháº?Ä‘á»?Foreground thì nó cÅ©ng khó Ä‘á»?xóa bá»›t.

Vá»?trÆ°á»ng hợp Service là Started và chạy lâu dài, há»?thống sáº?làm giảm vá»?trí Æ°u tiên của nó, bởi vì phá»?thuá»™c vào process thì các loại service sáº?được xếp theo Ä‘á»?Æ°u tiên sau: Bound Service khó bá»?tiêu hủy nhất, tiếp theo là Foreground Service và Background Service.

Dựa vào những lí do trên, Background Service được coi là Service d�b�tiêu hủy nhất nên cần phải x�lý một cách thích hợp, tùy thuộc vào giá tr�tr�v�trong onStartCommand() mà Service có th�được khởi động lại. 

4. Các giá tr�tr�v�trong onStartCommand().

Khi Service bá»?há»?thống tiêu hủy do thiếu bá»?nhá»?thì dÆ°á»›i đây là 5 giá trá»?tráº?vá»?thÆ°á»ng dùng trong onStartCommand() Ä‘á»?thông báo vá»›i há»?thống.

4.1. START_NOT_STICKY

Nếu há»?thống tiêu hủy service khi giá trá»?này được tráº?vá»?thì service này sáº?không được khởi Ä‘á»™ng lại trá»?khi có má»™t Intent Ä‘ang được chá»?á»?onStartCommand(). Vì vậy, đây là lá»±a chá»n an toàn nhất Ä‘á»?tránh chạy Service khi không cần thiết và ứng dụng cÅ©ng có thá»?khởi Ä‘á»™ng lại má»™t cách Ä‘Æ¡n giản các công việc chÆ°a hoàn thành.

4.2. START_STICKY

Giá tr�này được tr�v�trong onStartCommand khi service b�h�thống tiêu hủy. Nếu onStartCommand không có một Intent nào ch�nữa thì Service s�được h�thống khởi động lại với một Intent null.

4.3. START_REDELEVER_INTENT

Nếu Service bá»?tiêu hủy thì nó sáº?được khởi Ä‘á»™ng lại vá»›i má»™t Intent là Intent cuối cùng mà Service được nhận. Äiá»u này thích hợp vá»›i các service Ä‘ang thá»±c hiện công việc muốn tiếp tục ngay tức thì nhÆ° download file. 

4.4. START_STICKY_COMPATIBILITY

Giá tr�này cũng giống như START_STICKY nhưng không chắc chắn trong việc đảm bảo khởi động lại service.

4.5. DEFAULT

Là má»™t sá»?lá»±a chá»n tiá»m năng giữa START_STICKY_COMPATIBILITY hoặc START_STICKY

public @StartResult int onStartCommand(Intent intent, @StartArgFlags int flags, int startId) {

                    onStart(intent, startId);

                    return mStartCompatibility ? START_STICKY_COMPATIBILITY : START_STICKY;

 }

5. Các phÆ°Æ¡ng thức quan trá»ng trong vòng Ä‘á»i Service

Khi tạo má»™t service, chúng ta buá»™c phải káº?thừa lá»›p Service do Android cung cấp. Tuy nhiên, nếu muốn thá»±c thi thì Ä‘iá»u tiên quyết nữa là phải override má»™t vài phÆ°Æ¡ng thức quan trá»ng tá»?việc xá»?lý vòng Ä‘á»i của Service và cung cấp má»™t cÆ¡ cháº?cho phép các thành phần liên kết vá»›i Service nếu thích hợp.

5.1. onStartCommand()

Há»?thống gá»i phÆ°Æ¡ng thức này khi má»™t thành phần khác nhÆ° Activity gá»i đến Service bằng câu lệnh startService(). Khi phÆ°Æ¡ng thức này được thá»±c hiện, dịch vá»?sáº?được khởi Ä‘á»™ng và có thá»?chạy trong background vô thá»i hạn. Äến má»™t lúc nào đó công việc hoàn thành, chúng ta nên dừng lại bằng cách gá»i stopService() tá»?má»™t thành phần khác, hoặc cho chính Service gá»i stopSelf(). Trong trÆ°á»ng hợp nếu chá»?muốn ràng buá»™c buá»™c vá»›i Service thì không nên sá»?dụng onStartCommand().

5.2. onBind()

Há»?thống sáº?gá»i phÆ°Æ¡ng thức này khi má»™t thành phần khác gá»i đến Service bằng câu lệnh bindService(). Khi triển khai phÆ°Æ¡ng thức này, yêu cầu bắt buá»™c là phải cung cấp má»™t giao diện Ä‘á»?client có thá»?giao tiếp vá»›i Service thông qua má»™t đối tượng IBinder do Service tráº?vá»? Dù khi káº?thừa tá»?lá»›p Service của Android phải luôn luôn override phÆ°Æ¡ng thức này, nhÆ°ng nếu không muốn ràng buá»™c (bind) thì chúng ta hoàn toàn có thá»?return null.

5.3. onCreate()

Nói má»™t cách khái quát, há»?thống gá»i phÆ°Æ¡ng thức này khi Service được khởi tạo và nó chá»?chạy má»™t lần trÆ°á»›c khi onStartCommand() hoặc onBind() được gá»i. Nếu Service đã chạy thì phÆ°Æ¡ng thức này sáº?không được gá»i lại lần nào nữa.

5.4. onDestroy()

Há»?thống gá»i phÆ°Æ¡ng thức trên khi Service không được sá»?dụng nữa và Ä‘ang bá»?hủy (destroy). Lúc này, chúng ta cÅ©ng nên giải phóng tài nguyên nhÆ° các Threads, Listeners hay Receivers á»?

6. Khi Started và Bound Service chạy đồng thá»i

NhÆ° chúng ta đã biết, StartedService được start bằng lá»i gá»i startService() tá»?má»™t thành phần nào đó và nó sáº?chá»?dừng lại khi thành công gá»i stopSelf() hoặc má»™t thành phần gá»i stopService(). Vá»?phần Bound Service, nó sáº?được khởi chạy khi má»™t thành phần gá»i bindService() và dừng lại khi tất các các thành phần ràng buá»™c (bind) vá»›i nó hủy liên kết (unbind). Ngược lại, nếu Started Service gá»i stopSelf() hoặc được gá»i stopService() mà service vẫn chÆ°a vào onDestroy thì cần má»™t Ä‘iá»u kiện nữa Ä‘á»?nó bá»?hủy trong tình huống các thành phần ràng buá»™c vá»›i BoundService chÆ°a hủy hết liên kết. Bên cạnh đó, nếu tất cáº?các thành phần ràng buá»™c vá»›i Bound Service unbind thì Service cÅ©ng chÆ°a được hủy cho đến khi Started Service tá»?gá»i stopSelf() hoặc được gá»i stopService(). Lúc này, Ä‘iá»u kiện cần là cáº?hai loại service Ä‘á»u được hủy thì Service má»›i được hủy.

Vòng Ä‘á»i của Bound Service khi chạy cùng vá»›i má»™t Started Service

NhÆ° vậy, thông qua những kiến thức trên đã giải thích khá chi tiết vá»?Service trong há»?Ä‘iá»u hành Android, đồng thá»i cÅ©ng là ná»n tảng vô cùng quan trá»ng đối vá»›i Android Developer. 

B�môn CNTT

Cao đẳng FPT M?ng c¨¢ c??c b¨®ng ?¨¢ Hà Ná»™i

The post Tổng quan vá»?Service trong há»?Ä‘iá»u hành Android appeared first on Cao Äẳng FPT M?ng c¨¢ c??c b¨®ng ?¨¢ xét tuyển.

]]>
//westview-heights.com/tin-tuc-poly/tong-quan-ve-service-trong-he-dieu-hanh-android.html/feed 0
Há»?Ä‘iá»u hành Archives - Cao Äẳng FPT M?ng c¨¢ c??c b¨®ng ?¨¢ xét tuyển //westview-heights.com/tin-tuc-poly/blog/huong-dan-lap-trinh-android-co-ban-phan-1.html //westview-heights.com/tin-tuc-poly/blog/huong-dan-lap-trinh-android-co-ban-phan-1.html#respond Wed, 30 Jun 2021 10:38:54 +0000 //westview-heights.com/?p=145923 Các bạn sinh viên theo há»c khối ngành Công nghá»?thông tin tại Cao đẳng FPT M?ng c¨¢ c??c b¨®ng ?¨¢ không còn quá xa láº?vá»›i há»?Ä‘iá»u hành Android. Vậy há»?Ä‘iá»u hành Android là gì, nguồn gốc ra sao? Android là ...

The post HÆ°á»›ng dẫn lập trình Android cÆ¡ bản (Phần 1) appeared first on Cao Äẳng FPT M?ng c¨¢ c??c b¨®ng ?¨¢ xét tuyển.

]]>
Các bạn sinh viên theo há»c khối ngành Công nghá»?thông tin tại Cao đẳng FPT M?ng c¨¢ c??c b¨®ng ?¨¢ không còn quá xa láº?vá»›i há»?Ä‘iá»u hành Android. Vậy há»?Ä‘iá»u hành Android là gì, nguồn gốc ra sao?

Android là gì?

Android theo cách hiểu Ä‘Æ¡n giản là “há»?Ä‘iá»u hành mã nguồn mởâ€?dá»±a trên ná»n tảng Linux được phát triển bởi công ty Android vá»›i sá»?há»?trá»?tài chính của Google và được chính Google mua lại năm 2005.

Ban đầu Android được xây dựng đ�s�dụng trên điện thoại di động, sau này nó tiếp tục được phát triển đ�có th�s�dụng trên máy tính bảng, đầu phát HD, TV, thiết b�đeo tay�/p>

Tại sao há»c Android?

  • Android sá»?dụng ngôn ngá»?lập trình Java.
  • Các ứng dụng Android Ä‘a phần được viết bằng ngôn ngá»?lập trình Java nên có tính tÆ°Æ¡ng thích thá»±c thi cao trên há»?Ä‘iá»u hành Android. HÆ¡n tháº? nó có thá»?dá»?dàng cài sang các há»?Ä‘iá»u hành khác nhÆ° Blackberry, Symbian, Ubuntu hay giá»?đây có thêm Chrome OS.
  • Má»™t lý do nghe có váº?khá hoành tráng đó là ứng dụng Android các bạn viết có thá»?đăng lên Google Play Ä‘á»?Ä‘em vá»?cho mình má»™t khoản thu nhập kha khá và chá»?mất 25$ đăng ký các bạn có thá»?đăng thoải mái (vá»›i IOS là 99$ cho má»—i năm).
  • Cuối cùng và quan trá»ng nhất là chÆ°Æ¡ng trình giảng dạy chúng ta theo há»c có dạy vá»?Android thì chúng ta há»c Android thôi.

Môi trÆ°á»ng phát triển!!!

Là má»™t môi trÆ°á»ng mà á»?đó Nhà Phát triển Phần má»m có được những công cá»?cần thiết nhất Ä‘á»?viết ra má»™t ứng dụng hoàn chỉnh yêu cầu:

  • Há»?Ä‘iá»u hành: Microsoft Windows, Linux và Mac.
  • Bá»?công cá»?phát triển: Java Development Kit (JDK), Android Software Development Kit (SDK), Android Studio.

Tiến hành cài đặt:

  • Cài đặt JDK: Truy cập website này, chá»n tải xuống và thá»±c hiện các bÆ°á»›c tiếp theo.
  • Cài đặt Android Studio: Truy cập website, sau đó chá»n “download android studioâ€?
    • Tích chá»n “I have read and agree with the above terms and conditionsâ€?â‡?“Download Android Studio for Windowsâ€?
    • Má»?file chá»n “Runâ€?â‡?“Nextâ€?â‡?“Installâ€?â‡?“Finishâ€?
      Sau đó ứng dụng được m�thì c�tích “blue�mà select thôi.
  • Cài đặt máy ảo:

Cài đặt máy ảo đ�giúp cho việc lập trình Android d�dàng và hiệu qu�hơn. Dưới đây là một s�bài viết hướng dẫn v�việc cài đặt các máy ảo gồm:

Máy ảo Genymotion

Máy ảo Nox

Máy ảo ADVManager

Các thành phần trong Android Studio?

– AndroidManifest: Äây là file manifest mô táº?các đặc Ä‘iểm cÆ¡ bản của ứng dụng và xác định từng thành phần của nó.
– Java: ThÆ° mục này chứa các file nguồn java cho dá»?án (project) của bạn. Theo mặc định nó gồm 1 tập tin MainActivity.java â€?1 lá»›p hoạt Ä‘á»™ng (activity) chạy khi ứng dụng của bạn được chạy.
– res/drawable: thÆ° mục chứa ảnh mặc định cho ứng dụng.
– res/layout: thÆ° mục chứa giao diện của ứng dụng.
– res/menu: thÆ° mục chứa các file xml tổng hợp chức năng mục của ứng dụng.
– res/mipmap: chứa icon của ứng dụng.
– res/value: thÆ° mục chứa các định nghÄ©a vá»?“tên chức năngâ€? “màu sắcâ€? “kiểu hiển thịâ€?của ứng dụng.
– Gradle/build.gradle: chứa các thÆ° viện (library) sá»?dụng trong quá trình viết project.

Các layout trong Android Studio?

Layout là thành phần tạo nên giao diện cho ứng dụng, chi tiết v�layout s�có trong các bài viết tiếp theo. Các loại Layout:

– Linear Layout
– Relative Layout
– Grid Layout
– TableLayout
– Frame Layout
– Constraint Layout

Tạo và chạy d�án android đầu tiên như th�nào?

BÆ°á»›c 1: Má»?“Android Studio” sau đó chá»n “Create New Project”.

BÆ°á»›c 2: Chá»n “Empty Activity”, sau đó chá»n “Next”.

BÆ°á»›c 3: Tại mục “Name”, tiến hành đặt tên cho dá»?án và sau khi hoàn thành chá»n “Finish”.

Bước 4: Khởi chạy máy ảo.

Bước 5: Chạy chương trình.

Bước 6: Kết qu�

Qua má»™t bá»?phận lý thuyết cÆ¡ bản nêu trên, các bạn có thá»?hiểu được phần nào vá»?há»?Ä‘iá»u hành Android, cách xây dá»±ng 1 ứng dụng Android, cách cài đặt công cá»?“Android Studio” và máy ảo Ä‘á»?có thá»?thiết káº?ứng dụng Ä‘Æ¡n giản theo phong cách riêng của cá nhân.

Trong bài viết sau, Cao đẳng FPT M?ng c¨¢ c??c b¨®ng ?¨¢ sáº?giá»›i thiệu vá»?“Intent và Manifest”, cách má»™t “Activity” hoạt Ä‘á»™ng ra sao và vòng Ä‘á»i của 1 “Activity”.

 

The post HÆ°á»›ng dẫn lập trình Android cÆ¡ bản (Phần 1) appeared first on Cao Äẳng FPT M?ng c¨¢ c??c b¨®ng ?¨¢ xét tuyển.

]]>
//westview-heights.com/tin-tuc-poly/blog/huong-dan-lap-trinh-android-co-ban-phan-1.html/feed 0