2015-01-07 28 views
6

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, onResumeonStart.

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

+0

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ụ. –

+0

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. –

+1

Đó 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

Trả lời

5

Tôi có cùng một vấn đề, tôi đã không tìm thấy một giải pháp thích hợp được nêu ra. Nhưng đây là những gì tôi hiện đang làm.

Handler handler = new Handler(Looper.getMainLooper()); 
handler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     try { 
      if (dpm.isLockTaskPermitted(getPackageName())) { 
       super.startLockTask(); 
      } 
     }catch (Exception exception) { 
      Log.v("KioskActivity","startLockTask - Invalid task, not in foreground"); 
     } 
    } 
},1500); 

Dường như ứng dụng yêu cầu khóa chưa nhận được tiêu điểm ngay cả khi onWindowFocusChanged bị kích hoạt. Bằng cách trì hoãn cuộc gọi đến startLocktask một thời gian nó sẽ hoạt động. Bao giờ có một khoảng thời gian nhỏ mà ứng dụng sẽ không được ghim/khóa. Tôi đã giải quyết điều này bằng một số biện pháp bảo mật bổ sung (tôi có một dịch vụ chạy dài trong nền để ngăn chặn thông báo kéo bóng xuống và sẽ đóng cửa sổ cài đặt nếu mở).

Btw, bạn đã bao giờ quản lý để giải quyết vấn đề này một cách đầy đủ chưa?

0

Tôi có vấn đề này và giải quyết nó bằng cách sử logic lấy từ các câu trả lời trong bài viết này: How can you tell when a layout has been drawn?

Về cơ bản nó chỉ đảm bảo rằng giao diện người dùng đã được rút ra đầu tiên sau đó cố gắng để ghim.

Ví dụ Mã (Đặt này trong phương pháp onCreate của bạn):

> findViewById(R.id.your_view).post(new Runnable() { 
>    @Override 
>    public void run() { 
> 
>     // Run pinning code here 
>    } 
>   }); 
Các vấn đề liên quan