Đây là cách Android CHẠY NỀN và đa nhiệm

Duy Luân
5/5/2020 0:8Phản hồi: 183
Đây là cách Android CHẠY NỀN và đa nhiệm
Chúng ta vẫn thường nói về việc chạy nền của các app trên Android, nhưng thật sự việc "chạy nền" này là như thế nào? Nhân dịp cần tìm hiểu về cách thức Android chạy các công việc nền của nó, mình chia sẻ lại với anh em luôn.


Tác vụ chạy nền là sao?


Mỗi ứng dụng Android có một luồng (thread) để xử lý giao diện của nó, ví dụ như đo đạc, nút này nút kia hiện ra sao, cái gì màu gì, hiệu ứng chạy như thế nào. Thread này cũng sẽ xử lý các tương tác của bạn với app. Tạm gọi đây là UI Thread.

background_main_UI_thread.jpg

Nếu UI Thread phải làm quá nhiều việc, mà mỗi việc lại kéo dài, thì có thể khiến cho app của bạn có vẻ như chạy chậm hơn, phản hồi kém hơn, tức là trải nghiệm của người dùng giảm đi. Vậy nên bất kì tác vụ nào cần thời gian dài để xử lý, chẳng hạn như giải mã một tấm ảnh, truy cập file trên bộ nhớ / thẻ nhớ, các lần gọi API để lấy thông tin từ máy chủ về hiển thị lên app, download 1 file về máy... thì Google khuyên là nên thực hiện trong "một tác vụ chạy nền".


UI_Thread.jpg

Tác vụ chạy nền này sẽ hoạt động nhờ vào một luồng xử lý riêng, gọi là Background Thread. Background Thread sau khi xử lý xong có thể trả kết quả về cho UI Thread để hiện thông báo đã download xong, hoặc hiển thị danh sách file mà app đã quét được. Có những thứ cần được xử lý trong Background Thread trong lúc người dùng vẫn đang xài app như bình thường nữa kìa.

Một số ứng dụng cũng có thể cần tới những tác vụ chạy khi bạn đang không dùng app, ví dụ như ứng dụng lịch thỉnh thoảng phải lấy dữ liệu mới về. Một số khác thì yêu cầu phải ngừng ngay khi người dùng không còn tương tác với app.

Các thách thức trong việc chạy nền


+ Liệu app có cần phải kiểm soát chính xác thời gian bắt đầu và kết thúc của tác vụ chạy ngầm hay không? Ví dụ, app chơi nhạc thì cần bất đầu phát nhạc khi bạn nhấn nút start, và sẽ liên tục chơi nhạc cho tới khi bị người dùng nhấn nút ngừng. Trong khi đó, một app khác thì thỉnh thoảng upload data lên máy chủ mỗi 1 giờ, cứ up xong là được, không cần phải biết khi nào bắt đầu và kết thúc.

+ Tác vụ chạy nền có thể bị ngắt quãng hay không? Ví dụ, nếu app upload một file rất to, và quá trình này bị ngừng đột ngột thì app phải upload lại từ đầu. Với những tác vụ dạng này, lập trình viên sẽ muốn Android không tự mình ngắt quãng app của họ mà phải đợi cho tác vụ chạy xong hết.

+ Tác vụ này có cần phải phản hồi liền không, hay nó có thể để chạy sau cũng được?

+ Tác vụ này có phải chạy khi máy đạt đủ một số điều kiện hay không? Ví dụ, hình chỉ được sao lưu khi máy cắm sạc và đang kết nối Wi-Fi.

Quảng cáo


+ Tác vụ này có cần thu thập dữ liệu nhạy cảm của người dùng, ví dụ như dữ liệu địa điểm hay không?

+ Tác vụ có cần chạy đúng vào 1 thời điểm cụ thể hay không? Ví dụ, ứng dụng lịch sẽ phải thông báo cho người dùng về cuộc họp sắp tới của họ đúng vào giờ được cài.

Foreground Services


Với những việc quan trọng cần chạy ngay và cần phải chạy cho tới khi hoàn tất, lập trình viên Android sẽ dùng foreground service. Service dạng này sẽ nói cho hệ thống biết là app đang làm việc quan trọng và không được phép kill app. Bạn có thể nhìn thấy foreground servcie thông qua một thông báo hiển thị trong khu vực notification nhưng bạn không thể xóa được thông báo này (trừ Android 11 trở đi).

Ví dụ của việc dùng foreground service: app chơi nhạc hiển thị các nút điều khiển cho bạn xài.

WorkManager, AlarmManager, DownloadManager


WorkManager là một thư viện lập trình dành cho những thứ có thể chạy sau được, không cần gấp phản hồi, và sẽ chạy ngay cả khi điện thoại Android của bạn bị khởi động lại. WorkManager có thể kích hoạt các tác vụ khi thỏa một điều kiện nào đó (ví dụ như pin phải trên 50%, về mạng phải là Wi-Fi chứ 4G thì không chơi...) mà không cần app phải bật. WorkManager có khả năng cân bằng khá tốt các tài nguyên của hệ thống, và nó cũng tốt để thiết lập các tác vụ cần lặp đi lặp lại.

Quảng cáo


AlarmManager cũng là một thư viện chạy ngầm nhưng dùng cho những tác vụ cần phải kích hoạt vào đúng một thời điểm nào đó. Ví dụ, đúng 8h sáng thì tác vụ đó phải chạy lên để thông báo, để gửi email...

DownloadManager thì - như cái tên đã gợi ý - chuyên dùng cho những tác vụ cần download file từ máy chủ về. Đây là thư viện giúp bạn vẫn có thể download được file ngay cả khi đã thoát trình duyệt và chuyển sang dùng một app khác trên điện thoại Android. Tác vụ chạy ngầm download file này chắc bạn sẽ thấy thường xuyên nè. Nó cũng hỗ trợ download lại nếu lỡ nữa chừng bị đứt hoặc máy bị khởi động lại.

Chạy nền khác với đa nhiệm nha


Nãy giờ mình giải thích với anh em là về cơ chế chạy nền của app (background task). Còn cơ chế quản lý multi task của Android thì khác. Sẵn mình nói luôn cho anh em biết nhé.

Mỗi khi bạn chạy một app, Android sẽ đưa app của bạn vào một "chồng app". Cứ thêm 1 app được chạy lên thì app này sẽ nằm lên trên cùng của chồng này (gọi là back stack). Bạn có thể thấy hình dáng của back stack bằng cách nhấn nút Recent Apps, khi đó app mới chạy gần nhất sẽ nằm trên cùng.

Có một số app sẽ khởi động nhiều tác vụ khác nhau. Ví dụ, nếu bạn dùng Gmail thì một màn hình có thể hiển thị danh sách email, và khi bạn nhấn vào nút soạn thảo thì nó ra một màn hình khác. Màn hình soạn thảo này cũng được đưa vào back stack, nên khi bạn nhấn back thì nó sẽ quay trở lại màn hình danh sách email. Nhấn back thêm lần nữa, nó sẽ thoát app Gmail và chuyển sang app trước đó bạn dùng.

Da_nhiem_android.jpg

Android tất nhiên có cơ chế để xóa các app đã lâu không còn sử dụng để giải phóng bộ nhớ. Khi đó, nó chỉ để lại hành động đầu tiên của app (trong ví dụ Gmail trên, thì màn hình danh sách email là hành động đầu tiên - root activity. Nếu bạn đã mở màn hình soạn thảo nhưng lại không xài, sau một thời gian hãy quay lại app Gmail bạn sẽ được đưa về màn hình danh sách email). Đây là tình trạng "load lại" mà anh em hay nói tới.

Android làm điều này dựa trên giả định rằng nếu bạn mở một màn hình mà rất lâu không sử dụng thì khả năng cao là bạn đã bỏ nó luôn rồi, không làm việc đó nữa. Lần sau quay lại, bạn sẽ bắt đầu lại từ đầu.

Một số app có thể thiết lập để Android luôn lưu giữ đầy đủ trạng thái của nó ngay cả sau một thời gian rất dài nằm trong back stack. Một số khác thì luôn mặc định "load lại" bất kể khi nào bạn rời app và vào lại. Cái này thì tùy thuộc vào nhà phát triển.

Qua đây hi vọng anh em đã hiểu hơn về cơ chế chạy app của Android về mặt đa nhiệm và chạy ngầm. Chúc anh em vui.
183 bình luận
Chia sẻ

Xu hướng

Dạo này Android làm ngon rồi, năm ngoái mình xài Redmi Note 7 chạy ầm ầm, không lag giật gì. Mà vẫn có mấy con Nokia mới nó cứ cà giựt, chả hiểu
@Duy Luân Nó không có thông báo của app ví dụ như zalo,fb
@duonghungmanh89 Đún. Chưa kể zalo báo láo nữa, có 3 tin mà nó hiện mấy chục tin đang đợi
daicahobao
ĐẠI BÀNG
4 năm
@droidhub Thực ra ông nào người dùng hiểu biết một tí không cài App linh tinh thì dùng có đến 3_năm vẫn mượt. Như tôi là một ví dụ.
Chưa bao giờ lo xóa app lo tối ưu.
Hiển NT
ĐẠI BÀNG
3 năm
@Chạt Phích Mua được cái xe lúc 30 tuổi mà nghĩ mình to thì thôi khỏi nói 😆
Chạy thế nên cục pin 4500 của ad còn thua cục 3900 của ip😃
@nguyenluc289 Pro max màn HD hả =)). Giỏi ghê
@Tèo Teo Tóp Anti mà kiến thức ko có nó chỉ tới đó mà thôi😃
@nguyenluc289 Phân giải như nhau cũng thua người ta mới nói.
Nếu mà nói về chạy nền, thì iPhone là trùm.
Thực tế khí sử dụng, Android và iPhone tiêu tốn năng lượng là như nhau cho cùng một tác vụ, thậm chí có nhiều tác vụ như chơi game, Android pin còn trâu hơn.
Tuy nhiên do Android quản lí các tác vụ nghỉ và chạy nền không tốt, dẫn đến pin tụt nhiều ngay cả khi không sử dụng hoặc đã tắt ứng dụng, đây là lí do chính khiến Android muốn pin trâu như iPhone thì phải tăng dung lượng lên rất nhiều. Thêm nữa do việc phân mảnh nên ứng dụng và phần cứng Android khó mà tối tư được.
@n.a.v.i.p đồng ý là Android dùng pin ko tốt như iphone, cứ phải nâng pin lên để tăng thời gian dùng, nhưng thực tế mấy ai quan tâm điều đó? Máy vẫn mỏng nhẹ, pin vẫn dư dùng cả ngày là ok rồi. Iphone dùng pin dung lượng ít hơn, nhưng máy lại ko hề mỏng hơn, chất lượng pin cũng chẳng hề xịn hơn, đâu nó cũng vào đấy. Người dùng cuối chỉ cần biết máy vẫn mỏng nhẹ cầm nắm ngon, pin dùng cả ngày là ok, thông số pin bao nhiêu cũng chỉ là con số để tham khảo mà thôi
Lolo69
TÍCH CỰC
4 năm
@n.a.v.i.p Không đúng. Việc chạy ngầm của ios rất kém, phải nói là thua xa android, rất nhiều tác vụ phải giữ màn hình không tắt hoặc không chuyển cửa sổ nó mới tiếp tục chạy.
Ios để ở chế độ chờ ít tốn pin hơn Android là nhờ cơ chế push notification khác nhau thôi, không phải vì việc chạy ngầm.
Huân Huân
ĐẠI BÀNG
4 năm
@n.a.v.i.p Iphone nó cho cái màn hd chả hốc ít pin hơn, android màn toàn 4k, 2k, hd+ các kiểu, Android nó còn có vấn đề là chạy qua máy ảo. Nhưng dần dần sẽ ngon lên thôi.
Ai xem hết video từ đầu đến cuối thì giơ tay ạ?
hdiyl84
ĐẠI BÀNG
4 năm
@nguyenquan2011 Không xem giơ tay luôn nè
luffy.zoro
ĐẠI BÀNG
4 năm
@nguyenquan2011 Chưa xem haha
nhqdat
TÍCH CỰC
4 năm
@nguyenquan2011 Chả mấy khi xem video. Đọc nhanh hơn nhiều.
Cái cơ chế này là nguyên lý chung. Cả iOS, Windows cũng như vậy. Không chỉ riêng android.
@Google [bot] Windows nào giống vầy bạn
rassen
TÍCH CỰC
4 năm
@Google [bot] phán bậy
Lã H Hải
ĐẠI BÀNG
4 năm
@Google [bot] Hẳn là os máy tính chung 🤣🤣🤣
Bên Android chạy Activity nên ko dùng một thời gian vào vẫn tiếp tục sử dụng chính màn hình đó chứ ko load lại App từ đầu giống như ViewController bên iOS
@centernc Sợ nhất là cái app fb, ko hiểu nó kiểu gì mà lúc nào cũng chạy ngầm (nghe lén người dùng?) gây tốn pin kinh. Gỡ app hẳn ra là pin xài lâu hơn thấy rõ.
Dù sao tối nào cũng phải cắm sạc.... quan trọng sạc nhanh hay chậm ...
huedhcs
TÍCH CỰC
4 năm
@Bão Sài Gòn Chính xác, pin k cần quá lớn, chỉ cần đủ đến tối và sạc nhanh
luffy.zoro
ĐẠI BÀNG
4 năm
@Bão Sài Gòn mình dùng sạc nhanh, tối không cần sạc
Sáng 6h30 dậy, cắm sạc, làm vệ sinh các kiểu, đến 7h30 rút ra,nhét túi dắt xe đi làm
pin lúc nào cũng 90% trở lên, xài 1 ngày vi vu
@luffy.zoro Trước dùng con S10+ cũng vậy, không phải bận tâm đến sạc pin và rất hiếm khi sạc tối. Thường là đầu giờ sáng cắm một tí là đủ dùng tẹt rồi
luffy.zoro
ĐẠI BÀNG
4 năm
@trieuniemvui đúng rồi, phải tận dụng công nghệ sạc nhanh hehe
Chứ có sạc nhanh mà cũng phải sạc qua đêm thì hơi phí
Wheelsman
ĐẠI BÀNG
4 năm
@Bão Sài Gòn XM note 5pro của mình cũng chẳng bận tâm hết pin nhé .pin trâu wa mà ,hết cắm sạc đi ỉa xong đủ xài cả ngày
Android ngày càng thông minh, giờ có thể tùy chỉnh khởi động, chạy ngầm, ngày xưa ăn rồi cứ root ... root
luffy.zoro
ĐẠI BÀNG
4 năm
@thaikhang91 đó là do họ nghe ý kiến phản hồi từ người dùng và tích hợp vào hệ thống
nhqdat
TÍCH CỰC
4 năm
@thaikhang91 Cái chạy ngầm không tùy chỉnh được đâu. Vẫn có nhiều ứng dụng chạy ngầm (là user apps chứ không phải system apps nhé) mặc dù mình không muốn. Cho dù nó không có kiểu "Những ứng dụng chạy ngầm kể từ Android 8 đều phải xuất hiện trên thanh thông báo" như @centernc nói thì nó vẫn chạy ngầm. Kiểu bạn centernc nói nó chỉ ngăn không cho kill apps thôi.
Mà nói cái vụ chạy ngầm này cũng bực, hình như từ android 8 trở đi android nó giới hạn thế nào đó mà mấy cái chương trình nhắc việc (task) nó không thể thông báo đúng giờ đã đặt được, nhanh thì trễ 3 phút, chậm có khi vài tiếng đồng hồ. Chỉ có chương trình Task chính chủ google mới thông báo đúng giờ đã đặt thôi.
@thaikhang91 giờ còn ai root android k nhỉ?
legend94bn
ĐẠI BÀNG
4 năm
@em đang làm gì vậy Từ 6 trở xuống còn nhiều, 7 trở đi thì các diễn đàn hỗ trợ root ngỏm gần hết rồi.
cái vụ download upload kể ios làm đc như android thì tốt, mấy cái download upload trong telegram, zalo cứ thoát ra là ngừng, kể cả đã setting cho chạy background, phát bực!
nhqdat
TÍCH CỰC
4 năm
@vqt907 Thế mà cứ thích ôm cái bực vào người là sao?
@nhqdat bên nào cũng ôm bực, ôm cái bên ít bực hơn thôi 😆
@nhqdat Thì ios ko cho chạy nền app đấy là "nhược điểm" để đổi lại thời lượng pin chờ. Nói như bác thì ko dùng android or ios thì dùng gì? Có lựa chọn khác à?
Wheelsman
ĐẠI BÀNG
4 năm
@dunggrap K lẽ mua đt về chỉ để pin chờ .pin đủ xài 1 ngày thoải mái là đủ .ăn thua nhau sạc nhanh .cứ ngủ dậy cắm pin .đi lm rút .vẫn đủ xài .là ổn áp
@Wheelsman ???? ý bạn là sao??? ko hiểu lắm, bạn hiểu mình đang nói gì ko?
khnhngo197
ĐẠI BÀNG
4 năm
pin lâu hay không chủ yếu là do chip xử lí.
androdi có nhiều dòng. chip mạnh đến bé, pin cũng vậy.
cỏn ios có mỗi loại chip
mình chỉ biết giờ androdi xài chẳng khác ios là bao .
@khnhngo197 Px3 chạy 845 về trải nghiệm độ mượt, hiệu ứng chuyển cảnh và tốc độ phản hồi còn phải gọi ip8 là cụ 😆 từ ip8 qua px3 nhận thấy luôn dc mà.
@Đạt Phít Một Công nhận là 845 chạy ko bằng iphone 8. Mình có con lg v40 và cả note 9. Ip thì đang dùng sau đời bọn này nên ko tính. Nhưng công nhận 845 chạy chậm hơn. Nhưng pải thông cảm là ip vừa tự trồng tự ăn. Còn android thì ngược lại. Nên ko thể đòi hỏi nhiều. Nhưng cũng phải công nhận android ngày càng ngon hơn xưa.
@nguyenpr089 Có ai dám nói gì đâu 😆 chứ bảo 2 cái giống nhau thì méo bao giờ có mặc dù vuốt nọ vuốt kia cũng nhanh đó nhưng vuốt 10 cái thì 2-3 cái khựng là đã thua thằng ios r. Dx cái cam thằng px này ngon 😃 đổi qua để trải nghiệm cam ấy mà. 1 cam nhưng xóa phông thì xr k ăn dc
@Đạt Phít Một PX4 thấy còn mở app nếu mh xoay ngang khi đa nhiệm chuyển k dc mượt nữa là. Oneplus8 hiện tại thì nó giam het hiêu ứng nên k thấy khó chịu lắm, nhưng vẫn delay khi so với mấy con chip đời cũ như A12..
Mình thấy mấy cái background thread vẫn tốn pin lắm. Thỉnh thoảng dùng tool xóa đi thấy thời lượng pin tốt hơn hẳn
luffy.zoro
ĐẠI BÀNG
4 năm
@novembergreen đúng rồi, chạy cái đó phải cần RAM, mà RAM chạy thì tốn pin lắm
n3_bmt
TÍCH CỰC
4 năm
@novembergreen nó tốn pin do cái background thread nó hoạt động, ví dụ như gửi GPS hay thông tin người dùng về server cứ 5p 1 lần 😁
@luffy.zoro Vớ vẩn, RAM đầy hay trống tiêu thụ năng lượng như nhau.
iKaris
CAO CẤP
4 năm
Đa nhiệm, chạy nền thì phải dùng Dex của Sam mới tận dụng hết được khả năng, màn 27inch dùng cả 4 5 apps cùng lúc phê phải biết. chứ dùng trên cái màn nhỏ của smartphone thì chả quan tâm lắm vụ đa nhiệm, chạy nền. Bình thường mở app cho nó load lại cũng chỉ mất chưa tới 0.5s mà còn đc Refresh app lại dùng ngon hơn.
@HuynhDacY Mình dùng cực nhiều đa nhiệm 2 app cùng lúc.
Chạy nền kiểu này mới phát huy công dụng của nhiều ram. Còn như iOS thì nhiều ram để làm gì?
luffy.zoro
ĐẠI BÀNG
4 năm
Tính ra android nếu kiểm soát kho ứng dụng trên CHPlay tốt thêm tý nữa, bỏ bớt app lừa đảo đi thì sẽ ngon bằng iOS luôn rồi
@luffy.zoro biết tìm kiếm thì chả bao giờ dính phải mấy app rác đâu
legend94bn
ĐẠI BÀNG
4 năm
@luffy.zoro Mấy cái app lừa đảo ấy lại chủ yếu đội lốt app tối ưu pin, ram, bộ nhớ, quét virus, ... Mà người có chút kiến thức về android thì chẳng ai cài cái đấy vì nó tích hợp sẵn gần hết rồi. Trách bên nào cho đúng bây giờ
Nếu download file quá lớn hoặc mạng quá chậm thì Safari sẽ ngắt luôn, khỏi chạy ngầm nữa. K biết đây là quy định của iPadOS hay RAM còn lại quá ít.
@from team b with love Safari có ngắt file lớn à? Mình thử mà chưa bị
thaolegend
ĐẠI BÀNG
4 năm
android nó gần với pc r
còn ip thì thua upload ảnh lên gg photo mà để ẩn app chuyển sang ứng dụng khác để dùng thì nó chả cho up nửa ... đúng là apple tối ưu tốt thật =))
Không cần quẹt tắt app nữa đâu nha android fan 😃
luffy.zoro
ĐẠI BÀNG
4 năm
@hongphuc1992 Thích thì tắt thôi haha. Như một thói quen
@hongphuc1992 ko quẹt ngứa tay lắm
@Leminh Trung May mà quẹt bằng tay chứ không phải quẹt bằng cái khác.
catbui01
TÍCH CỰC
4 năm
Mình đọc các báo thì thấy cơ chế Android và mỗi app sẽ connect 1 server riêng của app đó, trong khi trên iOS thì tất cả các app phải qua chung 1 server của iOS, nên sự kiểm soát tối ưu của iOS bá đạo hơn là phải.
Theo mình thì iOS vận hành thống nhất giống như tập đoàn lớn, còn Android thì phân mảnh giống như hộ kinh doanh cá thể nên sẽ không thể tối ưu bằng.
@catbui01 Android ứng dụng chạy bằng ngôn ngữ Java nên phải chạy qua máy ảo ART và Dalvik, không như iOS chạy Swift là ngôn ngữ Native nên nhanh hơn ít tốn pin hơn. Google ART và Dalvik mà tìm hiểm thêm, biết ít mà chém gió nhiều quá, biết thì thưa thốt ko biết thì dựa cột mà nghe
@Google [bot] À, notification thì có từ đời nào rồi haha
@Blitzwaffen Giờ dùng FCM nha haha

Xu hướng

Bài mới









  • Chịu trách nhiệm nội dung: Trần Mạnh Hiệp
  • © 2024 Công ty Cổ phần MXH Tinh Tế
  • Địa chỉ: Số 70 Bà Huyện Thanh Quan, P. Võ Thị Sáu, Quận 3, TPHCM
  • Số điện thoại: 02822460095
  • MST: 0313255119
  • Giấy phép thiết lập MXH số 11/GP-BTTTT, Ký ngày: 08/01/2019