2015-01-07 94 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 
>    } 
>   }); 
相关问题