私が働いているアプリは、アプリが開かれたときにFirebaseを使ってログインするように促すプロンプトです。アプリが完全に閉じられている場合、アプリを開くとログイン画面が表示されます。しかし、私が働く会社の従業員の多くは、アプリケーションを終了しないで、単にバックグラウンドに送信します。それは問題です。なぜなら、自分のアカウントを削除しても即座にそれらを蹴るわけではないからです。彼らは一度彼らがアプリケーションを閉じると、それらをキックアウトします。前回のアクションが完了するまでのアンドロイドの遅延アクション
これを修正するために、私は本質的にページがリロードされるたびに、フォアグラウンドに来るか、別のアクティビティから家に帰るか、またはアプリケーションを再起動するかを指定して、ユーザーをバックグラウンドでログアウトさせるそれらを再ログします。その時点で、ユーザーアカウントの有効性がチェックされます。
この最終目標は、有効なログインがまだある場合は影響を受けませんが、無効なログインがある場合は、アプリが完全にシャットダウンされていなくてもロックアウトされます。
しかし、現在、有効なログインが既に入力されていても、アプリはユーザーをログイン画面に戻します。主な活動(ログイン画面)用
コード:ホーム画面用
package com.priceelectric.xriley.priceprefab;
import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
public class MainActivity extends AppCompatActivity {
private FirebaseAuth.AuthStateListener mAuthListener;
private FirebaseAuth mAuth;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final SharedPreferences prefs = getSharedPreferences("myDataStorage", MODE_PRIVATE);
final SharedPreferences.Editor mEditor = prefs.edit();
mAuth = FirebaseAuth.getInstance();
FirebaseAuth.getInstance().signOut();
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if(user != null){
Log.d("loginTag", "onAuthStateChanged:signed_in:" + user.getUid());
Context context = getApplicationContext();
final Intent returnHome = new Intent();
returnHome.setClass(context, Home_Screen.class);
startActivity(returnHome);
}
else{
Log.d("loginTag", "onAuthStateChanged:signed_out");
}
}
};
final EditText usernameTextBox = (EditText) findViewById(R.id.usernameTextBox);
final EditText passwordTextBox = (EditText) findViewById(R.id.passwordTextBox);
usernameTextBox.setText(prefs.getString("username", ""));
passwordTextBox.setText(prefs.getString("password", ""));
final Button login = (Button) findViewById(R.id.loginButton);
assert login != null;
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mEditor.putString("username", usernameTextBox.getText().toString());
mEditor.putString("password", passwordTextBox.getText().toString());
mEditor.commit();
prefs.getInt("thing", 0);
final String email = usernameTextBox.getText().toString();
final String password = passwordTextBox.getText().toString();
// FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
// final String uid = user.getUid();
// final SharedPreferences prefs = getSharedPreferences("myDataStorage", MODE_PRIVATE);
// final SharedPreferences.Editor mEditor = prefs.edit();
mAuth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(MainActivity.this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
Log.d("loginTag", "signInWithEmail:onComplete:" + task.isSuccessful());
if(!task.isSuccessful()){
Log.w("loginTag", "signInWithEmail:failed", task.getException());
}
}
});
}
});
}
@Override
public void onStart(){
super.onStart();
mAuth.addAuthStateListener(mAuthListener);
}
@Override
public void onStop(){
super.onStop();
if(mAuthListener != null){
mAuth.removeAuthStateListener(mAuthListener);
}
}
@Override
public void onBackPressed(){
Context context = getApplicationContext();
CharSequence notificationText = "You need to log in.";
int duration = Toast.LENGTH_LONG;
Toast.makeText(context, notificationText, duration).show();
}
}
コード:
package com.priceelectric.xriley.priceprefab;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
public class Home_Screen extends AppCompatActivity {
private FirebaseAuth mAuth;
FirebaseUser user;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home__screen);
final Button paperworkButton = (Button) findViewById(R.id.paperworkButton);
mAuth = FirebaseAuth.getInstance();
final TextView versionLabel = (TextView) findViewById(R.id.versionLabel);
SharedPreferences prefs = getSharedPreferences("myDataStorage", MODE_PRIVATE);
FirebaseAuth.getInstance().signOut();
mAuth.signInWithEmailAndPassword(prefs.getString("username", ""), prefs.getString("password", ""));
user = FirebaseAuth.getInstance().getCurrentUser();
if(user != null){
//all good
}
else{
Context context = getApplicationContext();
CharSequence notificationText = "You need to log in.";
int duration = Toast.LENGTH_LONG;
Toast.makeText(context, notificationText, duration).show();
final Intent loginScreen = new Intent();
loginScreen.setClass(this, MainActivity.class);
startActivity(loginScreen);
}
if(prefs.getString("yourName", "").equals("")){
final Intent settingsScreen = new Intent();
settingsScreen.setClass(this, Settings_Screen.class);
startActivity(settingsScreen);
}
}
public void buttonOnClick(View view){
SharedPreferences prefs = getSharedPreferences("myDataStorage", MODE_PRIVATE);
switch(view.getId()){
case R.id.prefabOrderButton:
SharedPreferences.Editor mEditor = prefs.edit();
mEditor.putInt("itemNumberCounter", 0);
mEditor.commit();
final Intent prefabScreen = new Intent();
prefabScreen.setClass(this, Prefab_Order.class);
startActivity(prefabScreen);
break;
case R.id.safetyFormButton:
final Intent safetyReportScreen = new Intent();
safetyReportScreen.setClass(this, Safety_Report.class);
startActivity(safetyReportScreen);
break;
case R.id.resiPanelButton:
final Intent resiPanelScreen = new Intent();
resiPanelScreen.setClass(this, Resi_Panel_Builder.class);
startActivity(resiPanelScreen);
break;
case R.id.onlineResourcesButton:
final Intent onlineResourcesScreen = new Intent();
onlineResourcesScreen.setClass(this, Online_Resources.class);
startActivity(onlineResourcesScreen);
break;
case R.id.settingsButton:
final Intent settingsScreen = new Intent();
settingsScreen.setClass(this, Settings_Screen.class);
startActivity(settingsScreen);
break;
case R.id.paperworkButton:
final Intent paperworkScreen = new Intent();
paperworkScreen.setClass(this, Paperwork_Orders.class);
startActivity(paperworkScreen);
break;
}
}
@Override
public void onBackPressed(){
//do nothing
}
}
提案をいただければ幸いです。
私はリロード()コマンドと状態変化のリスナーを追加しますが、リロードは()リスナーをトリガしていないようです。 – Xander
私の答えは 'reload()'の使い方を示すように更新されました。 –