Android他の操作を行う前にユーザーにログインを要求するアプリケーションに取り組んでいます。現在、LoginScreenという名前のメインアクティビティを作成しました。ユーザーがホームアクティビティから戻るボタンを押すとどうなりますか?ユーザーがログイン画面に戻ることを望まない場合、ユーザーがそれを行わないようにする正しい方法は何ですか?
私がやったことは、ホームアクティビティでインテントを処理することでしたAndroid.intent.action.MAIN。ホームアクティビティは、起動時に、ユーザーがサインインしているかどうかを確認し(共有設定を使用)、そうでない場合はLoginActivityを開始し、自分自身でfinish()を呼び出します。
ログインに成功すると、LoginActivityはメインアクティビティを開始しますが、今回はユーザーがログオンしているため、メインアクティビティは通常のコースを継続します。 LoginActivityは、マニフェストファイルで次のように宣言されています。
<activity Android:name="LoginScreen" Android:label="@string/app_name"
Android:noHistory="true" Android:excludeFromRecents="true">
</activity>
LoginActivityに対してnoHistoryおよびexcludeFromRecentsをtrueに設定すると、ユーザーは[戻る]ボタンを使用してこのアクティビティに戻ることができなくなります。
LoginScreenアクティビティでstartActivity(...)
を呼び出した後、finish()
を呼び出します。これにより、アクティビティスタックからそのアクティビティが削除されるので、ホームアクティビティに入ったら、押し戻すことで基本的にアプリが閉じられます。
インテントにフラグを設定してみてください。
例:
new Intent(context, SomeActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
フラグの詳細: 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>
.....................
完全なコードをご覧ください https://androidpugnator.wordpress.com/2017/03/12/Android-login-and-signup-screens
参照: https://stackoverflow.com/a/41290453/4560689 (以下のテキスト)
これを行うには、(AndroidのNoDisplayテーマを使用して)ディスプレイなしの単一のランチャーアクティビティを作成し、ホーム画面に移動するか、ログイン/登録するかのロジックを実行する必要があります。
まず、マニフェストで:
<?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>
次に、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();
}
}
ここの要点: https://Gist.github.com/chanakin/c44bf1c6a9a80d2640440b5aaa92c8ee
startActivity(...)を何らかのイベントのLoginActivityで呼び出します(ログインボタンのクリックなど)。また、HomeActivityクラスのユーザーのユーザー名とパスワードを保存するために、別のデータベースクラスを使用します。
HomeActivityで戻るボタンを制御するためのonKeyDown()イベントを処理します(finish()メソッドを使用します)。
OnCreate() LoginActivityクラスのメソッドでは、データベース接続を使用して、データベーステーブルにユーザー名とパスワードが既に存在するかどうかを確認します(存在する場合)startActivity() LoginScreenからHomeScreenへ。これはLoginScreenを表示しません。
これがあなたのために働くことを願っています。それを試してみてください。