Заблокировать приложение Android после определенного времени простоя

Я справился с этим, используя android-api AlarmManager для планирования android-mobile и отмены действия тайм-аута.

Затем android в событии onPause() всех android-sdk моих действий я назначаю android-mobile будильник. В событии onResume() всех android-device моих действий я проверяю, не android срабатывает ли будильник. Если android-sdk сработал будильник, я закрыл android-api приложение. Если будильник android-application еще не сработал, я его отменяю.

Я android-device создал Timeout.java для управления android-device своими будильниками. Когда android-api срабатывает будильник, запускается android-application намерение:

public class Timeout {
    private static final int REQUEST_ID = 0;
    private static final long DEFAULT_TIMEOUT = 5 * 60 * 1000;  // 5 minutes

    private static PendingIntent buildIntent(Context ctx) {
        Intent intent = new Intent(Intents.TIMEOUT);
        PendingIntent sender = PendingIntent.getBroadcast(ctx, REQUEST_ID, intent, PendingIntent.FLAG_CANCEL_CURRENT);

        return sender;
    }

    public static void start(Context ctx) {
        ctx.startService(new Intent(ctx, TimeoutService.class));

        long triggerTime = System.currentTimeMillis() + DEFAULT_TIMEOUT;

        AlarmManager am = (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE);

        am.set(AlarmManager.RTC, triggerTime, buildIntent(ctx));
    }

    public static void cancel(Context ctx) {
        AlarmManager am = (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE);

        am.cancel(buildIntent(ctx));

        ctx.startService(new Intent(ctx, TimeoutService.class));

    }

}

Затем я создал android-device службу, которая фиксирует android-framework намерение, сгенерированное android-application сигналом тревоги. Он устанавливает android некоторое глобальное состояние android-application в моем экземпляре класса android-device приложения, чтобы указать, что android-ui приложение должно заблокироваться:

public class TimeoutService extends Service {
    private BroadcastReceiver mIntentReceiver;

    @Override
    public void onCreate() {
        super.onCreate();

        mIntentReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();

                if ( action.equals(Intents.TIMEOUT) ) {
                    timeout(context);
                }
            }
        };

        IntentFilter filter = new IntentFilter();
        filter.addAction(Intents.TIMEOUT);
        registerReceiver(mIntentReceiver, filter);

    }

    private void timeout(Context context) {
        App.setShutdown();

        NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        nm.cancelAll();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        unregisterReceiver(mIntentReceiver);
    }

    public class TimeoutBinder extends Binder {
        public TimeoutService getService() {
            return TimeoutService.this;
        }
    }

    private final IBinder mBinder = new TimeoutBinder();

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

}

Наконец, я android-mobile создал подкласс Activity, который android-mobile является подклассом всех android-api действий моего приложения android-application для управления блокировкой android-api и разблокировкой:

public class LockingActivity extends Activity {

    @Override
    protected void onPause() {
        super.onPause();

        Timeout.start(this);
    }

    @Override
    protected void onResume() {
        super.onResume();

        Timeout.cancel(this);
        checkShutdown();
    }

    private void checkShutdown() {
        if ( App.isShutdown() ) {
            finish();
        }

    }

}

Использование android-ui onPause и onResume для запуска android-framework и остановки тайм-аута дает android-ui мне следующую семантику. Пока android-framework одно из действий моего приложения android-sdk активно, часы тайм-аута не android-framework работают. Поскольку я использовал android-api AlarmManager.RTC в качестве android-api типа будильника, каждый раз, когда android-ui телефон переходит в спящий android-framework режим, запускаются часы тайм-аута. Если android-api тайм-аут происходит, когда android-ui телефон спит, моя служба android-mobile заберет тайм-аут, как только android-ui телефон проснется. Кроме android-device того, часы идут, когда открыто android-mobile любое другое действие.

Для android-framework более подробной версии вы android-framework можете увидеть, как я фактически android реализовал их в своем приложении android-mobile https://github.com/bpellin/keepassdroid

android

2022-08-06T16:29:08+00:00