Tôi hiện đang gặp sự cố định kỳ khi tôi nhận được IllegalArgumentException
khi tôi gọi Activity.startLockTask()
. Ứng dụng của tôi đã cài đặt ứng dụng của chủ sở hữu thiết bị đã cho phép gói của tôi tự động ghim.Activity.startLockTask() thỉnh thoảng ném IllegalArgumentException
Mã bên dưới đang kiểm tra để đảm bảo gói của tôi có thể tự khóa. Nếu nó có thể sau đó nó chân chính nó.
Code:
if (dpm.isLockTaskPermitted(getPackageName())) {
super.startLockTask();
}
Logcat:
java.lang.IllegalArgumentException: Invalid task, not in foreground
at android.os.Parcel.readException(Parcel.java:1544)
at android.os.Parcel.readException(Parcel.java:1493)
at android.app.ActivityManagerProxy.startLockTaskMode(ActivityManagerNative.java:5223)
at android.app.Activity.startLockTask(Activity.java:6163)
Vấn đề là ứng dụng của tôi cần phải thỉnh thoảng tự khởi động lại. Vì vậy, chúng tôi bỏ ghim, hoàn thành hoạt động và bắt đầu lại với nhiệm vụ mới, sau đó thoát khỏi quy trình của chúng tôi. Khi hoạt động trở lại, nó sẽ cố gắng tự sửa lỗi - đôi khi nó hoạt động - đôi khi nó không hoạt động. Tôi tin rằng làm thế nào chúng tôi khởi động lại có lẽ là lý do ngoại lệ được ném nhưng nó không nên quan trọng kể từ khi hoạt động mới IS ở phía trước và IS tập trung.
Sau khi hoạt động không khóa nó sẽ tiếp tục thất bại miễn là nó cố gắng: Nếu tôi ngồi đó và cố gắng và pin nhiệm vụ mỗi 5 giây nó sẽ tiếp tục thất bại mỗi lần. Tôi đã thử ghim trong onCreate
, onWindowFocusChanged
, onResume
và onStart
.
Có ai biết vấn đề có thể là gì không?
Để tham khảo:
Dòng 8853: https://android.googlesource.com/platform/frameworks/base/+/android-5.0.2_r1/services/core/java/com/android/server/am/ActivityManagerService.java
Việc sử dụng của 'mFocusedActivity' trong' ActivityManagerService' dường như ngụ ý rằng 'onWindowFocusChanged (true)' là trong thực tế đúng nơi để làm điều này. Tuyên bố từ chối trách nhiệm: Tôi chưa cố gắng sử dụng tính năng khóa tác vụ. –
Nếu bạn nghi ngờ cách thức bạn khởi động lại là vấn đề, thì có lẽ bạn có thể khởi động lại theo cách có trật tự hơn? Liên kết một dịch vụ chạy trong một tiến trình riêng biệt. Vượt qua nó một 'Binder' được tạo ra trong quá trình chính. Có quá trình chính mở khóa nhiệm vụ, kết thúc và thoát. Yêu cầu dịch vụ chờ thông báo tử vong đối tượng trước khi cố gắng hồi sinh hoạt động của bạn. –
Đó là cơ bản những gì chúng tôi đang làm.Tôi sẽ tạo một ứng dụng đơn giản và xem liệu tôi có thể làm cho nó hoạt động tương tự không. – Randy