Вы также можете использовать Сервис .Службы - это долго выполняющиеся фоновые задачи, которые выполняются через Операции.
В форме входа в систему вы можете отправить намерение 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();
}
}
Когда действие должно изящно обрабатывать приостановленное действие, вы должны отслеживать его состояние в общей переменной.Если ранее он находился в состоянии, когда отслеживал Службу, он должен привязаться к Службе и проверить его состояние при возобновлении.Если служба все еще подключается (в отличие от подключенной или отключенной), она должна заново зарегистрировать прослушиватель вещания.