He creado un SDK para UserApp que se ocupa la mayor parte de la autenticación de usuario, tales como inicio de sesión, una suscripción, sesiones, perfiles de usuario de inicio de sesión, sociales, etc.
https://github.com/userapp-io/userapp-android
Ya que es de código abierto, podría modificarlo faet r sus propias necesidades y conectarse a sus propios servicios.
El formulario de acceso se colocaría dentro de un fragmento que se extiende la AuthFragment
, así:
public class LoginFragment extends AuthFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_signup, container, false);
// Setup the login form with bindings to UserApp
super.setupLoginForm(view, R.id.login, R.id.password, R.id.login_button);
return view;
}
@Override
public Boolean onLoginStart(String login, String password, Boolean isSocialLogin) {
// Show loader when waiting for server
getView().findViewById(R.id.login_form).setVisibility(View.GONE);
getView().findViewById(R.id.login_status).setVisibility(View.VISIBLE);
// Return true to complete the login
return true;
}
@Override
public void onLoginCompleted(Boolean authenticated, Exception exception) {
// Hide the loader
getView().findViewById(R.id.login_form).setVisibility(View.VISIBLE);
getView().findViewById(R.id.login_status).setVisibility(View.GONE);
if (exception != null) {
// Show an error message
((TextView) getView().findViewById(R.id.error_text)).setText(exception.getMessage());
} else {
// Clear the message
((TextView) getView().findViewById(R.id.error_text)).setText("");
}
}
}
Y el diseño de la LoginFragment
sería algo como esto:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<!-- Progress -->
<LinearLayout
android:id="@+id/login_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center_horizontal"
android:orientation="vertical"
android:visibility="gone" >
<ProgressBar
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp" />
<TextView
android:id="@+id/login_status_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:fontFamily="sans-serif-light"
android:text="@string/login_progress_signing_in"
android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>
<!-- Login form -->
<ScrollView
android:id="@+id/login_form"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center" >
<EditText
android:id="@+id/login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:hint="@string/username"
android:maxLines="1"
android:singleLine="true" />
<EditText
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:hint="@string/password"
android:maxLines="1"
android:singleLine="true" />
<Button
android:id="@+id/login_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:paddingLeft="32dp"
android:paddingRight="32dp"
android:text="@string/login" />
<Button
android:id="@+id/facebook_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:paddingLeft="32dp"
android:paddingRight="32dp"
android:text="@string/facebook_login" />
<Button
android:id="@+id/show_signup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:paddingLeft="32dp"
android:paddingRight="32dp"
android:text="@string/signup" />
<TextView
android:id="@+id/error_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
</ScrollView>
</LinearLayout>
después añadirlo al diseño de su actividad Principal, junto con otro Fragmento que contiene su "tablero de instrumentos":
<RelativeLayout ... >
<fragment
android:id="@+id/loginFragment"
android:name="com.example.demo.LoginFragment"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" />
...
</RelativeLayout>
Esto acaba de mostrar brevemente cómo se puede utilizar la biblioteca. Consulte la documentación para obtener más información sobre cómo usarlo. También echa un vistazo a la aplicación de demostración en GitHub.
Como se menciona en la respuesta aceptada; a la sesión del usuario cuando la aplicación está cerrada, escuchar en el caso onStop()
en su actividad principal y llame session.logout()
, así:
UserApp.Session session;
session.logout();
Lo único que quiero decir es que la clase de inicio de sesión debe escribirse como un archivo separado –
La idea de la API de Android es separar todas las vistas en diferentes actividades. Por lo tanto, para su aplicación, probablemente desee que la pantalla de inicio de sesión sea una única clase (ampliando la clase de Actividad) y su pantalla principal como otra clase (extendiendo también la clase de Actividad). Cuando el inicio de sesión es exitoso, inicia su actividad principal desde su actividad de inicio de sesión usando startActivity() o startActivityForResult() como se explica en el tutorial de developerlife. –