Je travaille sur une application Android qui nécessite qu'un utilisateur se connecte avant de faire quoi que ce soit d'autre. Actuellement, j'ai créé une activité principale nommée LoginScreen et après une connexion réussie, cette activité lance une autre activité appelée Accueil. Mais je vois un problème avec cette approche. Que se passe-t-il si l'utilisateur appuie sur le bouton de retour de l'activité d'accueil? Je ne veux pas que l'utilisateur revienne à l'écran de connexion. Quelle est la bonne façon d'empêcher l'utilisateur de le faire. Dois-je gérer les événements de pression de touche?
Ce que j'ai fini par faire était de faire en sorte que mon activité à domicile gère l'intention Android.intent.action.MAIN. L'activité d'accueil, lorsqu'elle est lancée, vérifie si l'utilisateur est connecté ou non (en utilisant les préférences partagées), si ce n'est pas le cas, il démarre LoginActivity et appelle finish () sur lui-même.
LoginActivity en cas de connexion réussie démarre l'activité principale et cette fois parce que l'utilisateur est connecté, l'activité principale continuera son cours normal. LoginActivity est déclaré comme suit dans le fichier manifeste:
<activity Android:name="LoginScreen" Android:label="@string/app_name"
Android:noHistory="true" Android:excludeFromRecents="true">
</activity>
La définition de noHistory et excludeFromRecents sur true pour LoginActivity signifie que l'utilisateur ne peut pas revenir à cette activité à l'aide du bouton de retour.
Après avoir appelé startActivity(...)
dans l'activité LoginScreen, appelez finish()
. Cela supprimera cette activité de la pile d'activités, donc en appuyant sur arrière, vous fermerez essentiellement votre application une fois que vous serez dans votre activité à domicile.
Essayez de définir des indicateurs sur l'intention.
Exemple:
new Intent(context, SomeActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
Plus d'informations sur les drapeaux: http://developer.Android.com/reference/Android/content/Intent.html#nestedclasses
LoginActivity.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:fitsSystemWindows="true"
Android:background="#263238">
<LinearLayout
Android:orientation="vertical"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:paddingTop="80dp"
Android:paddingLeft="16dp"
Android:paddingRight="16dp">
<!-- App Logo -->
<ImageView Android:id="@+id/logo"
Android:src="@drawable/logo"
Android:layout_width="wrap_content"
Android:layout_height="50dp"
Android:layout_marginBottom="20dp"
Android:layout_gravity="center_horizontal" />
<!--Title TextView-->
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="STOCK BUDDY"
Android:id="@+id/title"
Android:textSize="24sp"
Android:textStyle="bold"
Android:textColor="#7B869B"
Android:layout_marginBottom="24dp"
Android:layout_gravity="center_horizontal"/>
<!--User Email-->
<EditText
Android:id="@+id/login_email"
Android:layout_marginTop="10dp"
Android:layout_marginBottom="5dp"
Android:layout_centerVertical="true"
Android:layout_width="match_parent"
Android:layout_height="40dp"
Android:ellipsize="start"
Android:gravity="center"
Android:hint="Email"
Android:paddingLeft="16dp"
Android:paddingRight="16dp"
Android:textColorHint="#cccccc"
Android:textColor="#7B869B"
Android:maxLength="40"
Android:maxLines="1"
Android:inputType="textEmailAddress"
Android:background="@drawable/edittextshape"/>
<!-- User Password -->
<EditText
Android:id="@+id/login_password"
Android:layout_marginTop="5dp"
Android:layout_marginBottom="10dp"
Android:layout_centerVertical="true"
Android:layout_width="match_parent"
Android:layout_height="40dp"
Android:ellipsize="start"
Android:gravity="center"
Android:paddingRight="16dp"
Android:paddingLeft="16dp"
Android:hint="Password"
Android:textColor="#7B869B"
Android:textColorHint="#cccccc"
Android:maxLength="20"
Android:maxLines="1"
Android:inputType="textPassword"
Android:background="@drawable/edittextshape"/>
<!--Login Button-->
<Android.support.v7.widget.AppCompatButton
Android:id="@+id/btn_login"
Android:layout_width="fill_parent"
Android:layout_marginTop="5dp"
Android:layout_marginBottom="24dp"
Android:background="@drawable/buttonshape"
Android:text="Login"
Android:textSize="20sp"
Android:layout_height="40dp"
Android:textColor="#ffffff"
Android:shadowRadius="5"
Android:onClick="Login"/>
<!--signup Link TextView-->
<TextView Android:id="@+id/link_signup"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_marginBottom="24dp"
Android:text="No account yet? Create one"
Android:gravity="center"
Android:textSize="12sp"
Android:textColor="#7B869B"/>
</LinearLayout>
</ScrollView>
buttonshape.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:shape="rectangle" >
<corners
Android:radius="44dp"
/>
<gradient
Android:angle="45"
Android:centerX="35%"
Android:centerColor="#63D0C3"
Android:startColor="#70DB9A"
Android:endColor="#56C5EE"
Android:type="linear"
/>
<padding
Android:left="0dp"
Android:top="0dp"
Android:right="0dp"
Android:bottom="0dp"
/>
<stroke
Android:width="0dp"
Android:color="#878787"
/>
</shape>
edittextshape.xml
<?xml version="1.0" encoding="utf-8" ?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:thickness="0dp"
Android:shape="rectangle">
<solid Android:color="#ffffff"/>
<stroke Android:width="1dp"
Android:color="#ffffff" />
<corners Android:radius="44dp" />
</shape>
.....................
veuillez voir le code complet sur https://androidpugnator.wordpress.com/2017/03/12/Android-login-and-signup-screens
Voir: https://stackoverflow.com/a/41290453/4560689 (texte ci-dessous)
Pour ce faire, vous devez créer une seule activité de lancement avec aucun affichage (en utilisant le thème NoDisplay d'Android), qui exécute la logique pour aller à l'écran d'accueil ou se connecter/s'inscrire.
Premièrement, dans votre manifeste:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
package="com.example.Android">
<-- Permissions etc -->
<application
Android:icon="@mipmap/ic_launcher"
Android:label="@string/app_name">
<activity
Android:name=".onboarding.StartupActivity"
Android:label="@string/app_name"
Android:launchMode="singleInstance"
Android:theme="Android:style/Theme.NoDisplay">
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
Android:name=".MainActivity"
Android:label="@string/app_name"
Android:launchMode="singleTop" />
<activity
Android:name=".authentication.controller.AuthenticationActivity"
Android:label="@string/title_sign_in"
Android:launchMode="singleTask"
Android:windowSoftInputMode="adjustResize|stateHidden" />
<-- Other activities, services, etc -->
</application>
Ensuite, votre StartupActivity:
package com.example.Android.onboarding;
import Android.app.Activity;
import Android.content.Intent;
import Android.os.Bundle;
import com.example.Android.MainActivity;
import com.example.Android.authentication.controller.AuthenticationActivity;
import com.example.Android.util.ResourceUtils;
public class StartupActivity extends Activity {
private static final AUTHENTICATION_REQUEST_CODE = 1000;
@Override
protected void onCreate(Bundle savedInstanceState) {
if (isLoggedIn()) {
Intent startupIntent = new Intent(this, MainActivity.class);
startupIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(startupIntent);
finish();
} else {
Intent startupIntent = new Intent(this, AuthenticationActivity.class);
startActivityForResult(startupIntent, AUTHENTICATION_REQUEST_CODE);
}
super.onCreate(savedInstanceState);
}
private boolean isLoggedIn() {
// Check SharedPreferences or wherever you store login information
return this.getSharedPreferences("my_app_preferences", Context.MODE_PRIVATE).getBoolean("loggedIn", false);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == AUTHENTICATION_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
Intent startupIntent = new Intent(this, MainActivity.class);
startupIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(startupIntent);
}
finish();
}
}
Gist here: https://Gist.github.com/chanakin/c44bf1c6a9a80d2640440b5aaa92c8ee
Appelez startActivity (...) dans le LoginActivity sur un événement (par exemple, cliquez sur le bouton de connexion). Utilisez également une classe de base de données distincte pour stocker le nom d'utilisateur et le mot de passe de l'utilisateur de la classe HomeActivity.
Gérez l'événement onKeyDown () pour contrôler le bouton de retour dans HomeActivity (utilisez la méthode finish ()).
Dans OnCreate () méthode de la classe LoginActivity, utilisez la connexion à la base de données pour vérifier si le mot de passe du nom d'utilisateur existe déjà dans la table de base de données si oui, appelez startActivity () là aussi pour accéder directement à HomeScreen de LoginScreen.Cela ne montrera pas le LoginScreen.
J'espère que cela fonctionnera pour vous. Essayez-le.