2016-10-10 80 views
7

我有一個應用程序,它將自己註冊爲默認啓動器,並在啓動時自動將其自身引腳。啓動時的Android引腳活動

這一切工作正常,安裝應用程序時。它自己釘住,只有後退按鈕是可見的。

問題是,當設備第一次啓動時,它不能正確引腳。我多次看到一系列吐司「屏幕固定」和「屏幕解鎖」。 「Home」和「Recent Tasks」按鈕仍然可見。

-

運行 「亞行外殼dumpsys活動活動」 - 最後的線表明它不固定:

mLockTaskModeState=NONE mLockTaskPackages (userId:packages)= 
0:[com.example.myapp] 
mLockTaskModeTasks[] 

-

測試設備華碩ZenPad運行棉花糖/ 6.0/23

我依靠MainActivity清單屬性「lockTaskMode」來引腳(而不是activity.startLockTask()):

<activity 
    android:name=".MainActivity" 
    android:configChanges="keyboardHidden|orientation|screenSize" 
    android:label="@string/launcher_main" 
    android:launchMode="singleTask" 
    android:lockTaskMode="if_whitelisted" 
    android:screenOrientation="landscape"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN"/> 
     <category android:name="android.intent.category.HOME"/> 
     <category android:name="android.intent.category.DEFAULT"/> 
     <category android:name="android.intent.category.LAUNCHER"/> 
    </intent-filter> 
</activity> 

任何幫助或指針將不勝感激

+0

如果使用默認的'lockTaskMode'並調用'startLockTask()',會發生什麼? –

+0

似乎行爲相同 –

+0

我想知道在啓動啓動程序和建立任務固定權限之間是否存在競爭條件。我編寫了一個應用程序,該應用程序在啓動時自動進行引導,但不是啓動程序,而是響應'BOOT_COMPLETED'啓動。在發射器出現幾秒鐘後播放。 –

回答

2

我有同樣的問題,我可以真的只找到一個解決方案。我不確定爲什麼,但是是的,在啓動任務鎖定時,android中的某些東西可以防止任務鎖定,因爲任務鎖定旨在創建這些「kiosk」類型的應用程序。我能找到的唯一解決方案是檢測一個沒有鎖定的情況,然後重新啓動應用程序。它有點「哈克」,但你還能做什麼?

爲了檢測它沒有鎖定的情況,我創建了一個狀態變量並分配狀態(鎖定,鎖定,解鎖,解鎖)。然後在onTaskModeExiting的設備管理接收器中,如果狀態不是「解鎖」,那麼我知道它自己解鎖。因此,如果這種情況發生在那裏失敗了,我再重新啓動使用這種方法(其中安排在報警管理器應用程序,然後殺死應用程序)的應用程序:

how to programmatically "restart" android app?

下面是一些示例代碼:

DeviceAdminReceiver

@Override 
public void onLockTaskModeEntering(Context context, Intent intent, String pkg) { 
    super.onLockTaskModeEntering(context, intent, pkg); 
    Lockdown.LockState = Lockdown.LOCK_STATE_LOCKED; 
} 

@Override 
public void onLockTaskModeExiting(Context context, Intent intent) { 
    super.onLockTaskModeExiting(context, intent); 

    if (Lockdown.LockState != Lockdown.LOCK_STATE_UNLOCKING) { 
     MainActivity.restartActivity(context); 
    } 
    Lockdown.LockState = Lockdown.LOCK_STATE_UNLOCKED; 
} 

MainActivity

public static void restartActivity(Context context) { 
    if (context != null) { 
     PackageManager pm = context.getPackageManager(); 
     if (pm != null) { 
      Intent intent = pm.getLaunchIntentForPackage(context.getPackageName()); 
      if (intent != null) { 
       intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       int pendingIntentId = 223344; 
       PendingIntent pendingIntent = PendingIntent.getActivity(context, pendingIntentId, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
       AlarmManager mgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
       mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, pendingIntent); 
       System.exit(0); 
      } 
     } 
    } 
} 

private void lock() { 
    Lockdown.LockState = Lockdown.LOCK_STATE_LOCKING; 
    startLockTask(); 
} 

private void unlock() { 
    ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
    if (am.getLockTaskModeState() == ActivityManager.LOCK_TASK_MODE_LOCKED) { 
     Lockdown.LockState = Lockdown.LOCK_STATE_UNLOCKING; 
     stopLockTask(); 
    } 
} 

事實上,這是我實施的簡化版本。但它應該有希望讓你指出一個解決方案。

+0

不是一個理想的解決方案,但這確實可以防止用戶逃脫信息亭模式。該應用將被殺害並再次啓動(假設它是默認啓動器)。 –

+0

希望這會得到清理在未來的Android版本 –

+0

對我來說它沒有工作。我的活動像往常一樣在無限循環中重新啓動;(還有其他解決方案嗎? – LionisIAm

0

我現在發現的唯一解決方案是:製作另一個啓動程序,沒有locktask,每次啓動程序出現時都會觸發主應用程序。這可防止用戶在使用BOOT_COMPLETED接收方調用LockTasked應用程序之前等待幾秒鐘。因此,只有當lockTask應用程序具有清單中某些活動的啓動屬性時,我們才能遇到此問題。