Как сохранить логин бросить Активность? - PullRequest
0 голосов
/ 19 ноября 2010

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

Как я могу это сделать?

Ответы [ 3 ]

1 голос
/ 19 ноября 2010

После того, как вы подтвердите правильность входа в систему (проверив соединение с сервером и аутентификация), вы можете хранить данные для входа в SharedPreferences или что-то подобное.

Затем вы можете просто сделать последующие запросы, используя эти данные для входа (независимо от того, в какой деятельности вы находитесь). Это, конечно, при условии, что сервер принимает аутентификацию таким образом.

0 голосов
/ 19 ноября 2010

Вы также можете использовать Сервис .Службы - это долго выполняющиеся фоновые задачи, которые выполняются через Операции.

В форме входа в систему вы можете отправить намерение startService, аналогичное запуску нового действия.Это вызывает onStartCommand для класса Service, где вы можете создать соединение и сохранить его в самом объекте Service.Когда вам требуется информация из соединения, вы можете получить экземпляр службы, используя bindService вызов.

Ниже приведен пример базовой службы входа, адаптированной из базового примера Google.

public class LocalService extends Service {

    private MyConnection conn;

    /**
     * Class for clients to access.  Because we know this service always
     * runs in the same process as its clients, we don't need to deal with
     * IPC.
     */
    public class LocalBinder extends Binder {
        LocalService getService() {
            return LocalService.this;
        }
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Intent i = new Intent("my.service.connected");
        try {
            conn = new MyConnection(
                intent.getStringExtra("username"),
                intent.getStringExtra("password"));
            i.putExtra("succeeded", true);
            sendBroadcast(i);
        } catch (ConnectionException ex) {
            i.putExtra("succeeded", false);
            sendBroadcast(i);
        }
        return START_STICKY;
    }

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

    // This is the object that receives interactions from clients.  See
    // RemoteService for a more complete example.
    private final IBinder mBinder = new LocalBinder();
}

Android.Manifest.xml также нуждается в элементе <service android:name="LocalService"></service> внутри <application />.

Сервисы не обходятся без своих недостатков.Обычно вы должны передавать параметры запуска в Intent, что означает, что они должны быть сериализуемыми или разборчивыми.Это не позволяет вам создать соединение в вашей активности, проверить, что вход в систему прошел успешно, и отправить ему службу. * Вместо этого вам нужно отправить параметры входа в службу и выполнить вход в нее там.

Сложности возникают, когда вынеобходимо решить, установилось ли соединение успешно, и вам следует перейти к следующему действию или если оно не удалось, и вы должны показать сообщение об ошибке.Есть несколько решений, но все они требуют некоторой настройки.Особенно, если учесть, что пользователь может приостановить вашу активность между нажатием кнопки «Войти» и фактическим входом в систему.

Как показано выше, одним из вариантов является уведомление об активности путем отправки трансляций из Сервиса.,Ниже приведено действие, которое запускает вышеуказанный сервис и прослушивает трансляции.Приведенное ниже действие не учитывает возможность того, что действие может быть приостановлено в любой момент.

public class LoginActivity extends Activity {
    class MyReceiver extends BroadcastReceiver {
        @Override
        public final void onReceive(Context ctx, Intent i) {
            if (i.getBooleanExtra("succeeded", false)) {
                startMyMainActivity();
            } else {
                showErrorMessage();
            }
        }
    }
    private BroadcastReceiver bcReceiver;

    private void doLogin(String username, String password) {
        // Register receiver that listens for connected messages.
        bcReceiver = new MyReceiver();
        IntentFilter ifilter = new IntentFilter("my.service.connected");
        registerReceiver(bcReceiver, ifilter);

        // Send command to start service (connects)
        Intent i = new Intent(this, LocalService.class);
        i.putExtra("username", username);
        i.putExtra("password", password);
        startService(i);
    }

    @Override
    protected void onPause() {
        if (bcReceiver != null) unregisterReceiver(bcReceiver);
        super.onPause();
    }
}

Когда действие должно изящно обрабатывать приостановленное действие, вы должны отслеживать его состояние в общей переменной.Если ранее он находился в состоянии, когда отслеживал Службу, он должен привязаться к Службе и проверить его состояние при возобновлении.Если служба все еще подключается (в отличие от подключенной или отключенной), она должна заново зарегистрировать прослушиватель вещания.

0 голосов
/ 19 ноября 2010

Интересно, зачем вам нужно поддерживать связь. Может быть, вы можете просто снова открыть соединение и войти в систему?

Но если вам действительно нужно держать соединение открытым: вы можете сохранить соединение в Приложении. Но убедитесь, что вы закрыли соединение, когда пользователь уходит из вашего приложения! Я действительно не рекомендую это. Или установите тайм-аут для закрытия соединения, как после 5 минут бездействия.

http://developer.android.com/reference/android/app/Application.html

Вы должны указать в AndroidManifest, какое приложение использует ваше приложение. http://developer.android.com/guide/topics/manifest/application-element.html#nm (см. Andriod: имя).

Затем вы можете получить приложение из действия через: getApplication (). Не забудьте сыграть это. Чем добавить функции, где вы можете войти и так далее.

Edit:

Немного подробнее:

Вам нужно будет создать приложение, расширяющее класс. Имя этого класса вы вводите в android: название приложения в манифесте. В этом классе вы пишете функции, с которыми вы обрабатываете соединение. Например: startConnection () doLogin () stopConnection () ... В действиях, которые вы вызываете:

NameOfYouApplication app = (NameOfYouApplication) getApplication();
app.startConnection();
app.doLogin();

вроде как. Но имейте в виду, что даже если действие будет закрыто, ваше приложение останется в живых. Вам лучше найти подходящее время, чтобы закрыть соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...