Làm cách nào để đặt báo thức được lên lịch vào một thời điểm chính xác sau tất cả các hạn chế mới nhất trên Android?


27

Lưu ý: Tôi đã thử các giải pháp khác nhau được viết ở đây trên StackOverflow (ví dụ ở đây ). Vui lòng không đóng cái này mà không kiểm tra xem giải pháp của bạn từ những gì bạn đã tìm thấy có hiệu quả hay không bằng cách sử dụng bài kiểm tra mà tôi đã viết dưới đây.

Lý lịch

Có một yêu cầu trên ứng dụng, đó là người dùng đặt lời nhắc được lên lịch vào một thời điểm cụ thể, vì vậy khi ứng dụng được kích hoạt vào thời điểm này, nó sẽ làm một cái gì đó rất nhỏ trong nền (chỉ một số thao tác truy vấn DB) và hiển thị thông báo đơn giản, để nói về lời nhắc nhở.

Trước đây, tôi đã sử dụng một mã đơn giản để đặt thứ gì đó được lên lịch vào một thời điểm tương đối cụ thể:

            val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
            val pendingIntent = PendingIntent.getBroadcast(context, requestId, Intent(context, AlarmReceiver::class.java), PendingIntent.FLAG_UPDATE_CURRENT)
            when {
                VERSION.SDK_INT >= VERSION_CODES.KITKAT -> alarmManager.setExact(AlarmManager.RTC_WAKEUP, timeToTrigger, pendingIntent)
                else -> alarmManager.set(AlarmManager.RTC_WAKEUP, timeToTrigger, pendingIntent)
            }
class AlarmReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        Log.d("AppLog", "AlarmReceiver onReceive")
        //do something in the real app
    }
}

Sử dụng:

            val timeToTrigger = System.currentTimeMillis() + java.util.concurrent.TimeUnit.MINUTES.toMillis(1)
            setAlarm(this, timeToTrigger, 1)

Vấn đề

Bây giờ tôi đã thử nghiệm mã này trên các trình giả lập trên các phiên bản Android mới và trên Pixel 4 với Android 10 và dường như nó không kích hoạt hoặc có thể nó sẽ kích hoạt sau một thời gian rất dài kể từ những gì tôi cung cấp. Tôi nhận thức rõ về hành vi khủng khiếp đó một số OEM đã thêm vào để xóa ứng dụng khỏi các tác vụ gần đây, nhưng ứng dụng này có trên cả trình giả lập và thiết bị Pixel 4 (chứng khoán).

Tôi đã đọc trên các tài liệu về việc đặt báo thức, rằng nó bị hạn chế cho các ứng dụng để nó không xảy ra quá thường xuyên, nhưng điều này không giải thích cách đặt báo thức vào một thời điểm cụ thể và nó không giải thích làm thế nào mà ứng dụng Đồng hồ của Google thành công khi làm điều đó.

Không chỉ vậy, nhưng theo những gì tôi hiểu, nó nói rằng các hạn chế nên được áp dụng đặc biệt đối với trạng thái năng lượng thấp của thiết bị, nhưng trong trường hợp của tôi, tôi không có trạng thái này, trên cả thiết bị và trên trình giả lập. Tôi đã đặt báo thức để được kích hoạt sau khoảng một phút kể từ bây giờ.

Thấy rằng nhiều ứng dụng đồng hồ báo thức không còn hoạt động như trước đây, tôi nghĩ rằng có một cái gì đó còn thiếu trên các tài liệu. Ví dụ về các ứng dụng như vậy là ứng dụng Timely phổ biến đã được Google mua nhưng không bao giờ có bản cập nhật mới để xử lý các hạn chế mới và bây giờ người dùng muốn có lại. . Tuy nhiên, một số ứng dụng phổ biến hoạt động tốt, chẳng hạn như ứng dụng này .

Những gì tôi đã thử

Để kiểm tra xem báo thức có thực sự hoạt động không, tôi thực hiện các thử nghiệm này khi thử kích hoạt báo thức trong một phút kể từ bây giờ, sau khi cài đặt ứng dụng lần đầu tiên, tất cả trong khi thiết bị được kết nối với PC (để xem nhật ký):

  1. Kiểm tra khi ứng dụng ở phía trước, hiển thị cho người dùng. - mất 1-2 phút.
  2. Kiểm tra khi ứng dụng được gửi đến nền (ví dụ: sử dụng nút home) - mất khoảng 1 phút
  3. Kiểm tra khi tác vụ của ứng dụng đã bị xóa khỏi các tác vụ gần đây. - Tôi đã đợi hơn 20 phút và không thấy báo thức được kích hoạt, ghi vào nhật ký.
  4. Giống như số 3, nhưng cũng tắt màn hình. Có lẽ sẽ tệ hơn ...

Tôi đã cố gắng sử dụng những thứ tiếp theo, tất cả đều không hoạt động:

  1. alarmManager.setAlarmClock(AlarmManager.AlarmClockInfo(timeToTrigger, pendingIntent), pendingIntent)

  2. alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, timeToTrigger, pendingIntent)

  3. AlarmManagerCompat.setExactAndAllowWhileIdle(alarmManager, AlarmManager.RTC_WAKEUP, timeToTrigger, pendingIntent)

  4. kết hợp của bất kỳ điều nào ở trên, với:

    if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) alarmManager.setWindow(AlarmManager.RTC_WAKEUP, 0, 60 * 1000L, pendingIntent)

  5. Đã thử sử dụng một dịch vụ thay vì BroadcastReceiver. Cũng đã thử trên một quy trình khác nhau.

  6. Đã thử làm cho ứng dụng bị bỏ qua khỏi tối ưu hóa pin (không giúp ích), nhưng vì các ứng dụng khác không cần đến nó, tôi cũng không nên sử dụng nó.

  7. Đã thử sử dụng điều này:

            if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP)
                alarmManager.setAlarmClock(AlarmManager.AlarmClockInfo(timeToTrigger, pendingIntent), pendingIntent)
            AlarmManagerCompat.setExactAndAllowWhileIdle(alarmManager, AlarmManager.RTC_WAKEUP, timeToTrigger, pendingIntent)
  1. Đã thử có một dịch vụ sẽ kích hoạt onTaskRemond , để lên lịch lại báo thức ở đó, nhưng điều này cũng không giúp được gì (mặc dù dịch vụ vẫn hoạt động tốt).

Đối với ứng dụng Đồng hồ của Google, tôi không thấy có gì đặc biệt về nó ngoại trừ việc nó hiển thị thông báo trước khi được kích hoạt và tôi cũng không thấy nó trong phần "không được tối ưu hóa" của màn hình cài đặt tối ưu hóa pin.

Thấy rằng đây có vẻ là một lỗi, tôi đã báo cáo về điều này ở đây , bao gồm một dự án mẫu và video để hiển thị vấn đề.

Tôi đã kiểm tra trên nhiều phiên bản của trình giả lập và có vẻ như hành vi này bắt đầu từ API 27 (Android 8.1 - Oreo). Nhìn vào các tài liệu , tôi không thấy Báo động viên được đề cập, nhưng thay vào đó, nó được viết về nhiều công việc nền tảng khác nhau.

Những câu hỏi

  1. Làm thế nào để chúng ta thiết lập một cái gì đó được kích hoạt tại một thời điểm tương đối chính xác ngày nay?

  2. Làm thế nào mà các giải pháp trên không hoạt động nữa? Tôi có thiếu thứ gì không? Giấy phép? Có lẽ tôi nên sử dụng một Công nhân thay thế? Nhưng điều đó có nghĩa là nó có thể không kích hoạt đúng giờ không?

  3. Làm thế nào để ứng dụng "Đồng hồ" của Google vượt qua tất cả những điều này và luôn luôn kích hoạt vào thời gian chính xác, ngay cả khi nó được kích hoạt chỉ một phút trước? Có phải chỉ vì nó là một ứng dụng hệ thống? Điều gì sẽ xảy ra nếu ứng dụng được cài đặt dưới dạng ứng dụng người dùng, trên thiết bị không tích hợp sẵn?

Nếu bạn nói rằng đó là bởi vì nó là một ứng dụng hệ thống, tôi đã tìm thấy một ứng dụng có thể kích hoạt một báo động gấp đôi trong vòng 2 phút, ở đây , mặc dù tôi nghĩ rằng nó có thể sử dụng một dịch vụ foreground đôi khi.

EDIT: tạo một kho lưu trữ Github nhỏ để thử ý tưởng tại đây .


EDIT: cuối cùng đã tìm thấy một mẫu có nguồn mở và không có vấn đề này. Đáng buồn là nó rất phức tạp và tôi vẫn cố gắng tìm ra điều gì làm cho nó khác biệt (và mã tối thiểu mà tôi nên thêm vào POC của mình) để cho phép báo thức của nó được lên lịch sau khi xóa ứng dụng khỏi các tác vụ gần đây


đã lâu tôi làm việc về dịch vụ (tôi thậm chí không phải là nhà phát triển chuyên nghiệp để đề xuất), nhưng tôi có thể đề nghị bạn tránh báo thức Trình quản lý cho các trường hợp muốn đặt báo thức dưới 5 phút, vì hạn chế của Android sau khi dịch vụ thời gian chạy trong phụ trợ nó được gọi sau mỗi 5 phút hoặc lớn hơn không dưới 5 phút. Thay vào đó, tôi đã sử dụng Handler. Và để chạy dịch vụ của tôi tiếp tục trong nền, tôi đã giới thiệu [ github.com/fabcira/neverEinatingAndroidService]
Blu

Vì vậy, những hạn chế chính xác là gì? Thời gian tối thiểu được đảm bảo rằng một bộ kích hoạt sẽ hoạt động trong một thời gian tương đối chính xác là gì?
nhà phát triển Android

Tôi không thể nhớ chính xác các hạn chế nhưng khi tôi làm việc với nó, tôi đã loay hoay trong nhiều ngày để vượt qua dịch vụ nền bị giết tự động. Và từ quan sát cá nhân tôi nhận thấy sự cố trên Samsung, Xiaomi, v.v., bạn không thể gọi alarmManger trong khoảng thời gian 5 phút, tôi có một dịch vụ tải lên dữ liệu được thực hiện bằng alarmManger được kích hoạt cứ sau 1 phút, nhưng nó đã làm khách hàng của chúng tôi phàn nàn về dịch vụ này. hoàn toàn không chạy. Đối với trình giả lập nó hoạt động tốt.
Blu

Tôi biết bạn không thể bắt đầu hoạt động từ nền trong Android Q, nhưng nó không giống như trường hợp của bạn.
marcinj

@ greeble31 Mình đã thử ngay. Giải pháp nào bạn thấy làm việc? Vì một số lý do tôi vẫn không làm cho nó hoạt động. Tôi đặt báo thức, tôi xóa ứng dụng khỏi các tác vụ gần đây và tôi không thấy báo thức được kích hoạt, mặc dù màn hình được bật và thiết bị được kết nối với bộ sạc. Nó xảy ra trên cả thiết bị thực (Pixel 4 với Android 10) và trên trình giả lập (ví dụ API 27). Nó làm việc cho bạn? Bạn có thể vui lòng chia sẻ mã đầy đủ? Có lẽ trong Github?
nhà phát triển Android

Câu trả lời:


4

Chúng tôi không có gì để làm.

Khi ứng dụng của bạn không nằm trong danh sách trắng, nó sẽ luôn bị xóa sau khi xóa khỏi các ứng dụng gần đây.

Bởi vì Nhà sản xuất thiết bị gốc (OME) liên tục vi phạm tuân thủ Android .

Vì vậy, nếu ứng dụng của bạn không được đưa vào danh sách trắng từ thiết bị Sản xuất, nó sẽ không kích hoạt bất kỳ hoạt động nền nào kể cả báo động - trong trường hợp ứng dụng của bạn bị xóa khỏi các ứng dụng gần đây.

Bạn có thể tìm thấy danh sách các thiết bị có hành vi đó ở đây CSONG bạn có thể tìm thấy giải pháp phụ, tuy nhiên, nó sẽ không hoạt động tốt.


Tôi biết rõ về vấn đề này của các OEM Trung Quốc. Nhưng như tôi đã viết, nó xảy ra ngay cả trên trình giả lập và thiết bị Pixel 4. Không phải một số OEM Trung Quốc đã làm cho nó như vậy. Vui lòng kiểm tra trên trình giả lập và / hoặc thiết bị Pixel. Vấn đề tồn tại ở đó quá. Đặt báo thức, xóa ứng dụng khỏi các tác vụ gần đây và thấy rằng báo thức không được kích hoạt. Tôi thấy đây là một lỗi và được báo cáo ở đây (nó bao gồm một video và một dự án mẫu nếu bạn muốn thử): suetracker.google.com/issues/149556385. Tôi đã cập nhật câu hỏi của mình để làm cho nó rõ ràng. Câu hỏi là làm thế nào đến một số ứng dụng đã thành công.
nhà phát triển Android

@androiddeveloper Tôi tin rằng nó nên hoạt động trên Trình giả lập .. Bạn có trình giả lập nào?
Ibrahim Ali

Tôi cũng tin, cho đến khi tôi cố gắng. Chỉ cần thử nó trên API 29, ví dụ, những gì Android Studio cung cấp. Tôi chắc chắn điều tương tự cũng sẽ xảy ra trên các phiên bản cũ hơn một chút.
nhà phát triển Android

4

Tìm thấy một cách giải quyết kỳ lạ (mẫu ở đây ) dường như hoạt động cho tất cả các phiên bản, bao gồm cả Android R:

  1. Có quyền SAW quyền được khai báo trong tệp kê khai:
      <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

Trên Android R, bạn cũng sẽ phải cấp nó. Trước đây, dường như không cần phải được cấp, chỉ cần tuyên bố. Không chắc chắn tại sao điều này thay đổi trên R, nhưng tôi có thể nói rằng SAW có thể được yêu cầu như một giải pháp khả thi để bắt đầu mọi thứ trong nền, như được viết ở đây cho Android 10.

  1. Có một dịch vụ sẽ phát hiện khi các tác vụ bị xóa và khi thực hiện, hãy mở một Hoạt động giả mà tất cả những gì nó làm là tự đóng:
class OnTaskRemovedDetectorService : Service() {
    override fun onBind(intent: Intent?) = null

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int) = START_STICKY

    override fun onTaskRemoved(rootIntent: Intent?) {
        super.onTaskRemoved(rootIntent)
        Log.e("AppLog", "onTaskRemoved")
        applicationContext.startActivity(Intent(this, FakeActivity::class.java).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK))
        stopSelf()
    }

}

FakeActivity.kt

class FakeActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d("AppLog", "FakeActivity")
        finish()
    }
}

Bạn cũng có thể làm cho Hoạt động này gần như vô hình đối với người dùng bằng chủ đề này:

    <style name="AppTheme.Translucent" parent="@style/Theme.AppCompat.NoActionBar">
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:colorBackgroundCacheHint">@null</item>
        <item name="android:windowIsTranslucent">true</item>
    </style>

Đáng buồn thay, đây là một cách giải quyết kỳ lạ. Tôi hy vọng sẽ tìm thấy một cách giải quyết tốt hơn cho điều này.

Hạn chế nói về việc bắt đầu Hoạt động, vì vậy ý ​​tưởng hiện tại của tôi là có thể nếu tôi bắt đầu dịch vụ tiền cảnh trong một giây, nó cũng sẽ giúp ích và vì điều này tôi thậm chí sẽ không cần sự cho phép của SAW.

EDIT: OK Tôi đã thử với dịch vụ nền trước (mẫu ở đây ) và nó không hoạt động. Không biết tại sao một Hoạt động đang hoạt động nhưng không phải là một dịch vụ. Tôi thậm chí đã cố gắng sắp xếp lại báo thức ở đó và cố gắng để dịch vụ ở lại một chút, ngay cả sau khi lên lịch lại. Cũng đã thử một dịch vụ bình thường nhưng tất nhiên nó đã đóng ngay lập tức, vì nhiệm vụ đã bị xóa và nó hoàn toàn không hoạt động (ngay cả khi tôi đã tạo một luồng để chạy trong nền).

Một giải pháp khả thi khác mà tôi đã không thử là sử dụng dịch vụ tiền cảnh mãi mãi hoặc ít nhất là cho đến khi tác vụ bị xóa, nhưng điều này hơi lạ và tôi không thấy các ứng dụng tôi đã đề cập sử dụng.

EDIT: đã cố gắng chạy dịch vụ nền trước trước khi xóa tác vụ của ứng dụng và sau đó một chút, và báo thức vẫn hoạt động. Cũng đã cố gắng để dịch vụ này trở thành dịch vụ chịu trách nhiệm loại bỏ sự kiện và đóng lại ngay khi nó xảy ra và nó vẫn hoạt động (ví dụ ở đây ). Ưu điểm của cách giải quyết này là bạn không cần phải có sự cho phép của SAW. Nhược điểm là bạn có một dịch vụ có thông báo trong khi ứng dụng đã hiển thị cho người dùng. Tôi tự hỏi liệu có thể ẩn thông báo trong khi ứng dụng đã ở phía trước thông qua Hoạt động không.


EDIT: Có vẻ như đó là một lỗi trên Android Studio (được báo cáo ở đây , bao gồm các video so sánh các phiên bản). Khi bạn khởi chạy ứng dụng từ phiên bản có vấn đề mà tôi đã thử, nó có thể khiến báo thức bị xóa.

Nếu bạn khởi chạy ứng dụng từ trình khởi chạy, nó hoạt động tốt.

Đây là mã hiện tại để đặt báo thức:

        val timeToTrigger = System.currentTimeMillis() + 10 * 1000
        val pendingShowList = PendingIntent.getActivity(this, 1, Intent(this, SomeActivity::class.java), PendingIntent.FLAG_UPDATE_CURRENT)
        val pendingIntent = PendingIntent.getBroadcast(this, 1, Intent(this, AlarmReceiver::class.java), PendingIntent.FLAG_UPDATE_CURRENT)
        manager.setAlarmClock(AlarmManager.AlarmClockInfo(timeToTrigger, pendingShowList), pendingIntent)

Tôi thậm chí không phải sử dụng "cấp phátShowList". Sử dụng null cũng ok.


Tôi chỉ muốn khởi động một hoạt động trênReceive () trên AndroidQ. Có cách giải quyết nào cho việc đó mà không SYSTEM_ALERT_WINDOWđược phép không?
Doctorram

2
Tại sao Google luôn biến các nhà phát triển Android thành một địa ngục sống với những thứ đơn giản?!
Doctorram

@doctorram Vâng, nó được viết trên các tài liệu về các trường hợp ngoại lệ khác nhau: developer.android.com/guide/components/activities/ ,. Tôi chỉ chọn HỆ THỐNG_PHẦN_WINDOW vì dễ kiểm tra nhất.
nhà phát triển Android

Từ lần chỉnh sửa cuối cùng của bạn, bạn có nghĩa là bây giờ chúng tôi không phải sử dụng bất kỳ cách giải quyết nào mà bạn đã đề cập để duy trì cảnh báo sau khi xóa ứng dụng khỏi danh sách gần đây ??
dùng3410835

Tôi muốn chạy một đoạn mã mỗi ngày trong khoảng thời gian từ 6 giờ sáng đến 7 giờ sáng ngay cả khi ứng dụng bị xóa khỏi danh sách gần đây. Tôi nên sử dụng WorkManager hay AlarmManager ?? Đã thử mã sau đây cho usecase của tôi và nó không hoạt động. Vấn đề với mã dưới đây là gì? calendar.setTimeInMillis (System.c currentTimeMillis ()); calendar.set (Lịch.HOUR_OF_DAY, 6); alarmManager.setInexactRepeat (AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis (), AlarmManager.INTERVAL_DAY, cấp phátIntent);
dùng3410835

1
  1. Hãy chắc chắn rằng ý định bạn phát là rõ ràng và có Intent.FLAG_RECEIVER_FOREGROUNDcờ.

https://developer.android.com/about/versions/oreo/background#broadcasts

Intent intent = new Intent(context, Receiver.class);
intent.setAction(action);
...
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);

PendingIntent operation = PendingIntent.getBroadcast(context, 0, intent, flags);
  1. Sử dụng setExactAndAllowWhileIdle()khi nhắm mục tiêu API 23+.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, time, operation);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    alarmManager.setExact(AlarmManager.RTC_WAKEUP, time, operation);
} else {
    alarmManager.set(AlarmManager.RTC_WAKEUP, time, operation);
}
  1. Bắt đầu báo thức của bạn dưới dạng Dịch vụ Tiền cảnh:

https://developer.android.com/about/versions/oreo/background#migration

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    context.startForegroundService(intent);
} else {
    context.startService(intent);
}
  1. Và đừng quên quyền:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

Tại sao vấn đề về dịch vụ lại quan trọng, nếu chính BroadcastReceiver không nhận được Ý định (hoặc gần thời gian)? Đó là bước đầu tiên ... Ngoài ra, không phải AlertManagerCompat đã cung cấp cùng mã này? Bạn đã thử cách này bằng các bài kiểm tra tôi đã viết, bao gồm xóa ứng dụng khỏi các tác vụ gần đây chưa? Bạn có thể vui lòng hiển thị toàn bộ mã? Có thể chia sẻ trên Github?
nhà phát triển Android

@androiddeveloper cập nhật câu trả lời.
Maksim Ivanov

Vẫn không có vẻ làm việc. Đây là một dự án mẫu: ufile.io/6qrsor7o . Vui lòng thử trên Android 10 (trình giả lập cũng ok), đặt báo thức và xóa ứng dụng khỏi các tác vụ gần đây. Nếu bạn không xóa khỏi các tác vụ gần đây, nó sẽ hoạt động tốt và được kích hoạt sau 10 giây.
nhà phát triển Android

Tôi cũng đã cập nhật câu hỏi để có liên kết đến báo cáo lỗi bao gồm dự án mẫu và video, vì tôi nghĩ đây là một lỗi vì tôi không thấy bất kỳ lý do nào khác cho việc này xảy ra.
nhà phát triển Android

0

Tôi biết điều này không hiệu quả nhưng có thể phù hợp hơn với độ chính xác là 60 giây.

https://developer.android.com/reference/android/content/Intent#ACTION_TIME_TICK

nếu máy thu quảng bá này được sử dụng bên trong dịch vụ nền trước, bạn có thể kiểm tra thời gian mỗi phút và đưa ra quyết định thực hiện hành động.


Nếu tôi có một dịch vụ tiền cảnh, tại sao tôi lại cần dịch vụ này? Tôi chỉ có thể sử dụng Handler.postDelayed hoặc bất kỳ giải pháp tương tự nào khác nếu tôi muốn ...
nhà phát triển Android

0

Tôi nghĩ bạn có thể yêu cầu người dùng thiết lập quyền để nó vô hiệu hóa chế độ tiết kiệm năng lượng và cảnh báo người dùng rằng nếu anh ta không sử dụng nó, thời gian chính xác sẽ không đạt được.

Đây là mã để yêu cầu nó:

PowerManager powerManager = (PowerManager) getApplicationContext().getSystemService(POWER_SERVICE);
            String packageName = "your Package name";
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                Intent i = new Intent();
                if (!powerManager.isIgnoringBatteryOptimizations(packageName)) {
                    i.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
                    i.setData(Uri.parse("package:" + packageName));
                    startActivity(i);

Đã thử điều này vì tôi nhận thấy rằng không có ứng dụng nào khác làm điều đó và tò mò liệu nó có thể giúp ích không. Không hoạt động. Cập nhật câu hỏi.
nhà phát triển Android

0

Tôi là tác giả của dự án nguồn mở mà bạn đã đề cập trong câu hỏi của bạn ( đồng hồ báo thức đơn giản) .

Tôi ngạc nhiên khi sử dụng AlarmManager.setAlarmClock không hiệu quả với bạn, vì ứng dụng của tôi thực hiện chính xác điều đó. Mã này nằm trong tập tin AlertSetter.kt. Đây là một đoạn:

  val pendingAlarm = Intent(ACTION_FIRED)
                .apply {
                    setClass(mContext, AlarmsReceiver::class.java)
                    putExtra(EXTRA_ID, id)
                    putExtra(EXTRA_TYPE, typeName)
                }
                .let { PendingIntent.getBroadcast(mContext, pendingAlarmRequestCode, it, PendingIntent.FLAG_UPDATE_CURRENT) }

            val pendingShowList = PendingIntent.getActivity(
                    mContext,
                    100500,
                    Intent(mContext, AlarmsListActivity::class.java),
                    PendingIntent.FLAG_UPDATE_CURRENT
            )

            am.setAlarmClock(AlarmManager.AlarmClockInfo(calendar.timeInMillis, pendingShowList), pendingAlarm)

Về cơ bản nó không có gì đặc biệt, chỉ cần đảm bảo rằng ý định đó có một hành động và một lớp mục tiêu, đó là một máy thu phát sóng trong trường hợp của tôi.


Đáng buồn thay đã không làm việc. Đó là những gì tôi đã cố gắng. Xem các tập tin ở đây: github.com/yuriykulikov/AlarmClock/issues/ trộm
nhà phát triển Android

Tôi đã kiểm tra mã của bạn trên GitHub. Bộ thu phát sóng hoạt động sau khi xóa ứng dụng khỏi phần lõm trên Moto Z2 Play. Tôi có thể thử nó trên Pixel, nhưng mã có vẻ ổn với tôi. Buộc dừng ứng dụng sẽ xóa cảnh báo theo lịch trình, nhưng điều này sẽ xảy ra với bất kỳ ứng dụng nào bị buộc dừng.
Yuriy Kulikov

Tôi đã thể hiện nhiều lần: tất cả những gì tôi làm sau khi lên lịch là xóa khỏi các tác vụ gần đây. Và tôi đã làm điều đó trên cả trình giả lập và Pixel 4.
nhà phát triển Android

Vui lòng kiểm tra xem việc sử dụng yetShowList có khắc phục được sự cố không và nếu có, tôi sẽ cập nhật câu trả lời. Có lẽ nó sẽ hữu ích cho một ai đó.
Yuriy Kulikov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.