Android — Держите приложение в фокусе с сервисом

У меня есть приложение для детей, в котором я хочу запретить им доступ к функциям телефона. Он не обязательно должен быть надежным, просто избегайте случайных выходов.

Подход, который я использую, состоит в том, чтобы запустить службу для мониторинга, когда моя активность выходит из фокуса, а затем перезапускает ее. Я следовал руководству здесь:

http://nathanael.hevenet.com/android-dev-detecting-when-your-app-is-in-the-background-across-activities/

Идея заключается в том, что ваша активность привязывается к службе в onStart и отвязывается во время onStop(). Когда последнее действие отсоединяется, в службе вызывается onUnbind, из которого я перезапускаю действие.

Вот активность:

public class GameActivity extends Activity {

    @Override
    public void onStart() {
        super.onStart();
        // Next call always returns true
        bindService( new Intent( this, LockService.class ),
                mConnection, Context.BIND_AUTO_CREATE );
    }

    @Override
    public void onStop() {
        super.onStop();
        unbindService( mConnection );
    }

    private ServiceConnection mConnection = new ServiceConnection() {
        public void onServiceConnected( ComponentName cn, IBinder service ) {}
        public void onServiceDisconnected( ComponentName cn ) {}
    };
}

А вот Сервис:

public class LockService extends Service {

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

    private void refocus() {
        // Launch the monitored Activity
        Intent intent = new Intent(getBaseContext(), GameActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
    }

    @Override
    public boolean onUnbind( Intent intent ) {
        // Relaunch
        refocus();
        return false;
    }

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

    public class LocalBinder extends Binder {
        LockService getService() {
            return LockService.this;
        }
    }

    private final IBinder mBinder = new LocalBinder();
}

Это работает, но только один раз. Когда GameActivity закрывается или сворачивается, вызывается LockService.onUnbind.

Это перезапускает GameActivity, который пытается снова привязаться к службе. Он возвращает true, но LockService.onBind не происходит во второй раз, и, следовательно, LockService.onUnbind не происходит, когда Activity останавливается. Ссылка потеряна.

Теперь у меня ОПРЕДЕЛЕННО это работало, но я что-то изменил и сломал его. Возможно, так я перезапускаю Activity? Хотел бы я проверить это в SVN, когда это сработало!

Любая помощь принята с благодарностью.

Спасибо

РЕДАКТИРОВАТЬ: Вот как я запускаю службу из MenuActivity:

public static void StartLockService() {
    Context context = getApplicationContext();
    Intent intent = new Intent(context, LockService.class);
    context.startService(intent);
}

person sipickles    schedule 10.04.2014    source источник
comment
как вы запускаете службу изначально?   -  person Libin    schedule 11.04.2014
comment
@Libin Я включил способ запуска службы.   -  person sipickles    schedule 11.04.2014


Ответы (1)


Хорошо, я понял, благодаря Android Service: onBind (Intent) и onUnbind(Intent) вызывается только один раз

Похоже, мне нужно было вернуть true из onUnbind, чтобы указать, что я хочу получать уведомления onRebind.

Затем я могу переориентировать свое приложение в onRebind.

person sipickles    schedule 11.04.2014