新しいアプリで幼児をロックする必要があり、ランチャーを使用したくありませんでした。これが私がしたことです、あなたはhttps://play.google.com/store/apps/details?id=com.justforkids.animalsoundsでアプリを見ることができます
- ロックが有効になったらサービスを開始し、ロックが無効になったら停止します
- サービスは最も実行中のアプリをチェックし、それが私のアクティビティでない場合、サービスは私のアクティビティを起動します
- ユーザーが「ホーム」をクリックしたときに、アクティビティが再開されるまでに約6秒かかるという問題がまだありました。これはAndroidのセキュリティ機能だと思いますが、よくわかりません。これを回避するために、サービスが別のアプリが表示されていることを検出すると、アプリの再起動にかかる数秒間、ホーム画面をカバーするトップビュー(アラートウィンドウとして)を追加します。
ステップ3については、次の詳細があります。
オーバーレイレイアウトを作成します(例:ファイルlocked_overlay.xml)。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#d0000000"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center_horizontal"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="12dp"
android:text="@string/app_name"
android:textColor="#fff"
android:textSize="18sp"
android:textStyle="bold" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Locked mode is on"
android:textColor="#fff"
android:textSize="18sp" />
</LinearLayout>
</FrameLayout>
オーバーレイを表示または非表示にするサービスでは、次を使用します。
private View lockedOverlay = null;
private void hideLockedOverlay() {
if (lockedOverlay != null) {
WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
windowManager.removeView(lockedOverlay);
lockedOverlay = null;
}
}
private void showLockedOverlay() {
if (lockedOverlay != null) {
return;
}
WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
WindowManager.LayoutParams viewLayoutParams = new WindowManager.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
PixelFormat.TRANSLUCENT);
viewLayoutParams.gravity = Gravity.TOP | Gravity.LEFT;
LayoutInflater inflater = LayoutInflater.from(this);
lockedOverlay = inflater.inflate(R.layout.locked_overlay, null);
windowManager.addView(lockedOverlay, viewLayoutParams);
}
許可が必要になります
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />