2015-01-07 128 views
6

我目前有個週期性問題,當我撥打Activity.startLockTask()時,我得到IllegalArgumentException。我的應用程序安裝了一個設備所有者應用程序,允許我的程序包自動鎖定自己。Activity.startLockTask()偶爾會拋出IllegalArgumentException

下面的代碼正在檢查以確保我的包可以鎖定自己。如果它可以,那麼它釘住自己。

代碼:

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) 

的問題是我的應用程序需要偶爾重新啓動。因此,我們取消固定,完成活動並重新開始一項新任務,然後退出我們的流程。當活動恢復時,它會嘗試固定自己 - 有時會起作用 - 有時不起作用。我相信我們如何重新啓動可能是拋出異常的原因,但是這並不重要,因爲新的活動處於前臺和IS的焦點。

一旦活動無法固定,只要它嘗試就會繼續失敗:如果我坐在那裏嘗試每隔5秒固定一次任務,則每次都會繼續失敗。我試過onCreateonWindowFocusChanged,onResumeonStart

有誰知道這個問題可能是什麼?

參考:8853
線:https://android.googlesource.com/platform/frameworks/base/+/android-5.0.2_r1/services/core/java/com/android/server/am/ActivityManagerService.java

+0

在'ActivityManagerService'使用mFocusedActivity'的'似乎暗示'onWindowFocusChanged(真)'其實是在做正確的地方這個。免責聲明:我還沒有嘗試使用任務鎖定功能。 –

+0

如果您懷疑您重新啓動的方式是問題,那麼也許您可以以更有序的方式重新啓動?綁定在單獨進程中運行的服務。將它傳遞給主流程中創建的「Binder」。讓主進程解鎖任務,完成並退出。在嘗試重新生成活動之前,請讓服務等待對象死亡通知。 –

+1

這基本上就是我們正在做的。我要創建一個簡單的應用程序,看看我能否做到這一點。 – Randy

回答

5

我有同樣的問題,我還沒有找到一個妥善的解決辦法呢。但這是我目前所做的。

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); 

看來,請求鎖的應用程序尚未收到即使onWindowFocusChanged被激發的焦點。通過推遲startLocktask的調用一段時間它會起作用。如何有一段時間的應用程序不會被鎖定/鎖定。我已經通過一些額外的安全措施解決了這個問題(我在背景中有一個長時間運行的服務,可以防止通知陰影下拉,如果打開,它將關閉設置窗口)。

順便說一句,你有沒有設法以適當的方式解決這個問題?

0

我有這個問題,並使用從答案在這篇文章中所採取的邏輯解決它: How can you tell when a layout has been drawn?

基本上只是保證了UI已經被抽中然後嘗試針。

示例代碼(在你onCreate方法將這個):

> findViewById(R.id.your_view).post(new Runnable() { 
>    @Override 
>    public void run() { 
> 
>     // Run pinning code here 
>    } 
>   }); 
相關問題