9

自分自身をデフォルトのランチャーとして登録し、起動時に自動的にピン留めするアプリがあります。

アプリをインストールするとき、これはすべて正常に機能します。それ自体がピン留めされ、戻るボタンだけが表示されます。

問題は、デバイスが最初に起動したときに、正しくピン留めされないことです。一連のトースト「画面固定」と「画面固定解除」が複数回表示されます。「ホーム」ボタンと「最近のタスク」ボタンも引き続き表示されます。

--

「adb shell dumpsys activity activities」の実行 - 最後の行は、固定されていないことを示しています。

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

--

Marshmallow/6.0/23 を実行するテスト デバイス Asus ZenPad

固定する 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>

ヘルプやポインタをいただければ幸いです

4

3 に答える 3

3

私は同じ問題を抱えていましたが、実際には1つの解決策しか見つかりませんでした。理由はわかりませんが、タスク ロックはこれらの「キオスク」タイプのアプリケーションを作成するように設計されているため、Android の何かが起動時にタスク ロックを妨げていることに気が付きません。私が見つけた唯一の解決策は、ロックされなかった場合を検出してからアプリケーションを再起動することでした。少し「ハッキー」ですが、他に何ができますか?

ロックされなかったケースを検出するために、状態変数を作成し、状態 (ロック、ロック、ロック解除、ロック解除) を割り当てました。次に、onTaskModeExiting のデバイス管理レシーバーで、状態が「ロック解除中」でない場合、それ自体がロック解除されていることがわかります。したがって、失敗した場所でこのケースが発生した場合は、次の方法を使用してアプリケーションを再起動します (アラーム マネージャーでアプリケーションをスケジュールし、アプリケーションを強制終了します)。

プログラムでAndroidアプリを「再起動」する方法は?

サンプルコードは次のとおりです。

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

主な活動

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

実際、これは私が実装したものの単純化されたバージョンです。しかし、うまくいけば、解決策を示してくれるはずです。

于 2017-05-05T21:50:22.793 に答える