Câu hỏi AlarmManager không hoạt động trong một số thiết bị


Ứng dụng của tôi sử dụng AlarmManager và nó đã hoạt động từ 4 năm trước. Nhưng tôi nhận thấy nó bắt đầu thất bại trong một số thiết bị.

Tôi khá chắc chắn mã là đúng (tôi đang sử dụng WakefulBroadcastReceiver, và setExactAndAllowWhileIdle cho các thiết bị với Doze) bởi vì nó hoạt động hoàn hảo trên các thiết bị Nexus, nhưng nó không thành công trong các thiết bị của một số nhà sản xuất (Huawei, Xiaomi ...).

Ví dụ, các thiết bị Huawei có một loại trình quản lý pin để tiêu diệt ứng dụng và khi ứng dụng bị giết, báo thức được lên lịch sẽ bị hủy. Vì vậy, việc đặt ứng dụng là "được bảo vệ" trong trình quản lý pin của Huawei sẽ khắc phục được sự cố.

Nhưng gần đây tôi nhận thấy nó không hoạt động với nhiều thiết bị hơn: Xiaomi, Samsung (có lẽ nó liên quan đến "Smart Manager" mới?) ... Có vẻ như hành vi này đang trở thành một tiêu chuẩn: để giết các ứng dụng nền.

Bất cứ ai biết bất cứ điều gì về nó? Bất kỳ cách nào để đảm bảo báo động được kích hoạt?


76
2018-01-11 19:56


gốc


Các nhà sản xuất đổ lỗi cho các ứng dụng tiêu thụ điện năng, và họ tiếp tục tiếp thị các lõi Octa-lõi, nó ăn nhiều pin hơn so với CPU có lõi ít ​​hơn. Họ nghĩ rằng chỉ cần thêm một lõi sẽ tăng tốc độ điện thoại của họ? - FrozenFire
@AviLevinshtein Có lẽ tôi hiểu lầm câu hỏi của bạn. Tôi đang tạo báo thức trong hoạt động của mình. Sau đó, khi báo thức tắt, một bộ thu phát sóng được thực thi, và cuối cùng, một WakefulIntentService (lớp từ @commonsware) được thực thi. - Sergio Viudes
@ JFValdes Tôi vẫn đang tìm kiếm giải pháp. AlarmManager hoạt động hoàn hảo trên các thiết bị với Vanilla Android. Vấn đề là các nhà sản xuất đang cố gắng "nâng cao" các tính năng của Android, và họ đã phá vỡ AlarmManager ... Các nhà sản xuất không nên thực hiện "bộ tiết kiệm pin" của riêng mình, nếu họ sử dụng chế độ Doze chuẩn, thì AlarmManager sẽ hoạt động hoàn hảo ... cho một giải pháp ... - Sergio Viudes
Có giải pháp nào chưa? Các ứng dụng khác như lời nhắc hoặc điều gì đó làm như thế? Phải có một tùy chọn khác hơn là setAlarm, đây là tùy chọn cho báo thức, không dành cho lời nhắc - kv1dr
@SergioViudes tôi cũng phải đối mặt với cùng một vấn đề với các thiết bị Xiomi để theo dõi. và nếu tôi giữ ứng dụng của mình khỏi hạn chế tiết kiệm pin hơn là hoạt động chính xác ở 3 trong số 4 thiết bị bằng cách thực hiện các cài đặt sau-- -> Đi tới pin -> Nguồn -> Trình tiết kiệm pin của ứng dụng -> ứng dụng của bạn Bây giờ chọn Không có giới hạn (đối với cài đặt nền), sau đó cho phép tùy chọn cho vị trí nền - Imran Khan Saifi


Các câu trả lời:


Tôi đang cố giải quyết nó vài tuần rồi. Tôi không tìm thấy gì cả. Huawei chỉ giết tất cả các báo động sau một thời gian. Nếu tôi đặt ứng dụng vào ứng dụng được bảo vệ trong trình tiết kiệm pin, điều đó sẽ không giúp ích gì. Nhưng nếu tôi thay đổi tên gói ứng dụng của mình để chứa các từ như báo thức, đồng hồ hoặc lịch, nó hoạt động hoàn toàn bình thường như trên bất kỳ thiết bị nào khác. Tôi không hiểu cách Google có thể cấp chứng nhận cho crap này. Tôi nghĩ rằng OEM không nên sửa đổi nền tảng cốt lõi theo cách như vậy. Tôi hiểu rằng họ có trình tiết kiệm bột riêng để giết ứng dụng sau một thời gian, khi người dùng không sử dụng nó. Nhưng báo động giết chết này cũng của các ứng dụng được bảo vệ.

Ngoài ra setAlarmClock () cho báo động thời gian chính xác sẽ giúp. Nhưng nó không thể sử dụng điều này cho những suy nghĩ như cập nhật widget.


9
2018-02-05 11:34



Giống như tôi, tôi cũng thử nó nhưng không có cách nào để giải quyết vấn đề này trên một số thương hiệu Xiaomi, Oppo, Huawei. Họ đôi khi giết quá trình nền và báo thức để tiết kiệm pin. - Andi Susilo
Tôi có điện thoại huawei, thay đổi tên gói thành báo thức / lịch không có gì. Chỉ có cách để bỏ qua điều này thêm ứng dụng của bạn trong danh sách ứng dụng được bảo vệ từ trình quản lý điện thoại - Ashish Pardhiye
không quan trọng nếu có báo động hoặc đồng hồ hoặc lịch hoặc donald trump - shikhar bansal


Vấn đề là Smart Manager. Samsung có một người quản lý pin mà đôi khi vô hiệu hóa một số ứng dụng chạy trên nền. Nó đã cố gắng "tiếp tục" khi quay trở lại ứng dụng nhưng hoàn toàn vô hiệu hóa ứng dụng hoặc có thể tiếp tục sau mỗi 5 phút hoặc lâu hơn (tùy thuộc vào cách Samsung có nó).

Điều này sẽ làm việc trên các phiên bản cổ phiếu của Android vì không có Samsung Manager. Bạn cũng có thể cài đặt phiên bản tùy chỉnh của Android có một số tính năng để kích hoạt SM (tùy thuộc vào rom).


8
2018-01-20 02:02



Tôi phát điên vì tôi không có thiết bị Samsung để kiểm tra nó. Tôi chỉ biết những gì người dùng ứng dụng của tôi đang nói với tôi. Bạn có biết nếu vấn đề là AlarmManager không hoạt động vì ứng dụng bị giết? Hay vấn đề là thiết bị không thể thức dậy khi báo động tắt vì người quản lý đó? - Sergio Viudes
@SergioViudes Gần đây, rất nhiều công ty đã và đang thực hiện riêng của họ. Chẳng hạn như LG có một trong những công trình tương tự như samsung, có lẽ điện thoại của bạn có một? Vấn đề không phải là báo động, ứng dụng báo thức được đẩy đến trạng thái không hoạt động hoàn toàn. Trình quản lý thông minh cho rằng đó chỉ là một ứng dụng ngẫu nhiên mà bạn không cần. Tôi nhận thấy một số ứng dụng nhất định có thể vượt qua nó, có thể một số ứng dụng được người quản lý thông minh chấp nhận. - S A
@SergioViudes Tôi có một samsung để kiểm tra và tôi có thể nói với bạn rằng không có nhiều bạn có thể nhận được từ nó. Khi người quản lý thông minh tối ưu hóa ứng dụng của bạn, không có lỗi hoặc bất cứ điều gì, nó chỉ chết, tương tự như lực dừng. Nó vẫn nằm trong danh sách các ứng dụng gần đây - Tim Castelijns
Cảm ơn Tim. Sẽ tuyệt vời để giải quyết vấn đề này mà không phải loại trừ ứng dụng khỏi Trình quản lý "thông minh". - Sergio Viudes
Các thiết bị như xiaomi (miui), vivo và htc đặt toàn bộ quyền hạn là false theo mặc định, trừ khi nó là ứng dụng trong danh sách ứng dụng "đáng tin cậy" mà dường như chúng tự xác định (whatsapp, truecaller, v.v.) được tin cậy theo mặc định ). Điều này đang trở thành một cơn ác mộng lập trình - desidigitalnomad


Sử dụng AlarmManager cho <5,0 thiết bị và JobScheduler cho hơn 5.0 thiết bị. Tôi không thể nói chắc chắn rằng JobScheduler sẽ không bị ảnh hưởng bởi các nhà sản xuất, nhưng dường như nó ít có khả năng xảy ra với tôi hơn, vì Android đang cố gắng di chuyển mọi người ra khỏi AlarmManager và lên JobScheduler.

EDIT: Google đã đưa ra giải pháp của bên thứ nhất cho vấn đề này được gọi là WorkManager. Nó tóm tắt nhiều khung lập lịch biểu và sử dụng khung phù hợp nhất cho thiết bị.


2
2018-06-01 21:10



Thật không may, không giống như lớp AlarmManager, thời gian không chính xác khi sử dụng JobScheduler. Trong ứng dụng của tôi, thời gian phải chính xác :( - Sergio Viudes
Tôi đã thử nó và một số người tối ưu hóa (ít nhất là Samsung) giết tất cả các nhiệm vụ đang chờ xử lý trong JobScheduler khi màn hình tắt. Vì vậy, nó cũng bị hỏng. Điều này xảy ra trên 5.0. Sau khi cập nhật lên 6.0 nó hoạt động tốt, tôi đoán họ đã sửa lỗi đó. Tôi chưa thể thử nghiệm nó với các nhà sản xuất khác. - Sloy
Đối với thời gian chính xác, bạn không thể sử dụng dịch vụ nền hoặc dịch vụ được lên lịch. Bạn có thể thử một dịch vụ nền trước, nhưng điều này sẽ tạo ra một thông báo liên tục cho người dùng (có thể là không mong muốn) và một số điện thoại có nhiệm vụ giết người được xây dựng trong đó sẽ tự động phá hủy dịch vụ tiền cảnh. WorkManager là giải pháp tốt nhất nhưng tiếc là sẽ không cung cấp cho bạn thời gian chính xác. - Tom


tôi đã ngừng sử dụng AlarmManager một thời gian trước ... một lựa chọn tốt hơn và ổn định hơn

  1. tạo một dịch vụ
  2. đăng ký BroadcastReceiver cho BOOT_COMPLETED
  3. bắn dịch vụ của bạn từ người nhận
  4. bắt đầu một Trình xử lý mới bên trong dịch vụ của bạn tự lặp lại mỗi X phút (Android - chạy một phương thức định kỳ bằng cách sử dụng cuộc gọi postDelayed ())
  5. kiểm tra xem thời gian thực hiện tác vụ đã đến chưa: giờ - thời gian thực hiện> 0 (Làm thế nào để tìm thấy thời gian của sự khác biệt giữa hai ngày trong java?)
  6. nếu vậy .. thực hiện nhiệm vụ và dừng trình xử lý

vâng .. đó là một nỗi đau .. nhưng công việc được thực hiện NO MATTER GÌ


1
2018-01-19 21:23



Cảm ơn đề xuất của bạn, nhưng tôi muốn tránh phương pháp đó, bởi vì việc sử dụng AlarmManager sẽ không tiêu tốn RAM hoặc bất kỳ tài nguyên nào. Và, nếu ứng dụng của bạn bị giết, dịch vụ sẽ dừng lại, phải không? - Sergio Viudes
tôi đã không nói rằng phương pháp này là BOOLETPROOF, nhưng ít nhất nó bao gồm các phiên bản api khác nhau :) - ymz
Để làm việc đáng tin cậy, giải pháp này có lẽ cũng sẽ cần sử dụng khóa đánh thức và có thể ăn nhiều pin. - Paweł Nadolski
tôi đoán rằng bạn là đúng về điều này .. câu hỏi duy nhất là: điều gì sẽ là tồi tệ nhất - mã không đáng tin cậy hoặc hiệu suất xấu? dù sao đi nữa, cá nhân tôi nghĩ rằng có cách thay thế cho khóa có thể phù hợp trong một số trường hợp (ví dụ: stackoverflow.com/questions/5346694/…) - ymz


Bạn có đang nghe BOOT_COMPLETED không? Bạn cần đặt lại báo thức khi thiết bị được khởi động lại.


1
2018-01-20 01:57



Vâng. Như tôi đã nói, báo động đã hoạt động từ năm 2012, cho đến bây giờ. Khi thiết bị được khởi động lại, tôi sẽ lên lịch lại báo thức trong bộ thu phát sóng BOOT_COMPLETED. - Sergio Viudes
Yêu cầu khởi động lại để ứng dụng của bạn hoạt động trở lại thậm chí không phải là một nửa giải pháp - Tim Castelijns
@TimCastelijns đó không phải là tất cả những gì tôi đang nói. Nếu thiết bị được khởi động lại, tất cả các báo thức được cài đặt với trình quản lý cảnh báo phải được đặt lại. - Tyler Pfaff
@TylerPfaff có nhưng khởi động lại thiết bị không liên quan đến vấn đề trong câu hỏi này - Tim Castelijns


Tôi cũng có một ứng dụng đặt báo thức. Giải pháp là sử dụng AlarmManager.setAlarmClock () trên api> = 21. Điều này không bị ảnh hưởng bởi doze afaik và có thêm tiền thưởng khi đặt một biểu tượng đồng hồ báo thức vào khay hệ thống.


1
2018-01-28 08:00



Cảm ơn câu trả lời của bạn. Có cách nào để xóa biểu tượng đồng hồ báo thức không? - Sergio Viudes
Tôi không nghĩ vậy :( - Tyler Pfaff


Hầu hết các thiết bị Android hiện đại đều có ứng dụng hoặc cơ chế, tính năng này tự động tìm cách tiết kiệm pin và kết quả là có thể giết một số ứng dụng của bên thứ ba nhất định. Điều này có thể dẫn đến việc xóa các tác vụ và công việc đã lên lịch, (ví dụ: báo thức không bị tắt, thông báo đẩy không hoạt động, v.v.). Trong nhiều trường hợp, điều này xảy ra hoàn toàn độc lập với cơ chế tiết kiệm pin của Android, trong trường hợp của tôi, tôi không thể tối ưu hóa pin hơn khi phát hiện một số kiểu thiết bị, tôi chuyển hướng người dùng đến trình quản lý khởi động để đưa vào danh sách trắng ứng dụng của tôi

Bạn tìm thấy trong liên kết này cho mọi mô hình ý định mà bạn nên gọi https://android-arsenal.com/details/1/6771 


1
2017-08-01 11:19





hầu hết các điện thoại mới hiện nay đều đi kèm với một số loại pin / quản lý tiết kiệm năng lượng mà làm điều tương tự như bạn mô tả. không tính duboosters và thạc sĩ sạch sẽ.

Tôi nghĩ bạn cần đặt tuyên bố từ chối trách nhiệm hoặc faq trong danh sách cửa hàng ứng dụng / cửa hàng của mình cho biết rằng ứng dụng này cần được đưa vào ngoại lệ cho ứng dụng quản lý pin của bạn để hoạt động bình thường.


0
2018-01-13 22:21



Nên có cách khác để làm điều đó ... Người dùng sẽ không đọc tuyên bố từ chối trách nhiệm. Tôi không thể nghĩ rằng điện thoại Samsung không cho phép các ứng dụng sử dụng AlarmManager ... - Sergio Viudes
Các báo động sẽ không kích hoạt "đúng giờ", nhưng chúng sẽ gây ra sự kiện - Gavriel
Đây là (thật đáng buồn) câu trả lời hữu ích nhất, tôi muốn nói. Tôi muốn có một giải pháp tốt hơn, nhưng các nhà sản xuất phần cứng đang làm hỏng Android vanilla hoạt động hoàn hảo. - caw


Phiên bản Android nào đang chạy các thiết bị này?

Kể từ API 23, bản thân hệ điều hành sẽ chuyển sang chế độ không hoạt động ở chế độ chờ thấp khi nó không được sử dụng trong một thời gian và trong chế độ báo thức đó sẽ không được gửi. Có một cách để các ứng dụng nói rõ ràng "Tôi cần báo thức này để tắt tại thời điểm này bất kể việc sử dụng pin", tuy nhiên; các phương thức AlarmManager mới được gọi setAndAllowWhileIdle() và setExactAndAllowWhileIdle().

Từ mô tả của bạn, có vẻ như đây không phải là nguyên nhân cụ thể của các sự cố của bạn trên các thiết bị của một số OEM nhất định, nhưng đây là điều mà tất cả các nhà phát triển sử dụng Trình quản lý báo thức phải nhận thức được.

Cuối cùng, nhiều tập quán của Trình quản lý báo động được giải quyết tốt hơn bằng cách sử dụng các cơ chế của Trình lập lịch biểu công việc. Đối với khả năng tương thích ngược, Dịch vụ Play "Trình quản lý mạng GCM" thực sự rất gần với Trình lập lịch biểu công việc trong chức năng - nó sử dụng Trình lập lịch biểu công việc trong các phiên bản Android mới hơn - và không nhất thiết phải kết nối mạng, mặc dù tên của lớp.


0
2018-01-21 01:56



Các thiết bị Samsung có Trình quản lý thông minh đang chạy Lollipop. Tôi đã sử dụng setExactAndAllowWhileIdle cho các thiết bị Marshmallow. Tôi sẽ xem xét JobScheduler và GCM. Dù sao, tôi không biết nếu vấn đề là báo động sẽ không tắt, hoặc nếu thiết bị đó không được đánh thức khi báo động tắt. - Sergio Viudes


Tôi không nghĩ rằng việc giết ứng dụng sẽ ngăn người quản lý báo thức đánh thức ứng dụng của bạn.

Chỉ khi bạn "buộc dừng" hoặc vô hiệu hóa ứng dụng bạn không nhận được cuộc gọi từ người quản lý báo thức.

Nguyên nhân gốc rễ có thể là một thứ khác.

Cũng trên M ... setExactAndAllowWhileIdle không điều chỉnh ... đó là nếu u lên lịch báo thức cứ sau 2 phút nó sẽ không được kích hoạt. ..Có cần phải có 15 phút cửa sổ. .


0
2018-01-19 21:22



Cảm ơn câu trả lời của bạn. Nhưng, nếu không, tại sao ứng dụng hoạt động hoàn hảo khi "tối ưu hóa pin" bị tắt trong Trình quản lý thông minh? - Sergio Viudes
bạn có đang chạy ứng dụng trên thiết bị gốc không .. nếu có, trình quản lý ứng dụng cũng có thể tắt ứng dụng .. - rupesh jain
Không, tôi không chạy trên thiết bị gốc. - Sergio Viudes


Đối với Xiaomi, bạn có thể cần bật AutoStart cho ứng dụng của mình. Tôi đang cố gắng thực hiện một danh sách các sửa đổi của Android (thường là từ nhà sản xuất điện thoại) có thể ảnh hưởng đến quá trình nền. Nếu bạn có một cái gì đó mới xin vui lòng thêm một câu trả lời ở đây Danh sách kẻ giết người nhiệm vụ Android 


0
2017-11-27 12:46