簡體   English   中英

將android中的動作延遲到上一個動作完成為止

[英]Delay actions in android until a previous action has completed

我正在使用的應用程序在打開時提示用戶使用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
    }
}

建議將不勝感激。

我認為在Home_Screen活動中,如果將一個完成偵聽器添加到signInWithEmailAndPassword() ,將獲得更好的結果,類似於MainActivity

使用現有代碼:

    mAuth.signInWithEmailAndPassword(prefs.getString("username", ""), prefs.getString("password", ""));

    user = FirebaseAuth.getInstance().getCurrentUser();

    if(user != null){
        //all good
    }

您正在登錄之前請求當前用戶,因此user為null。

添加完成監聽器和移動代碼來生成烤面包和啟動MainActivity那里,運行它時task.isSuccessful()是假的。

另外,您可能不希望使用注銷/登錄來測試用戶帳戶是否仍然有效,而可以嘗試使用FirebaseUser.reload() 文檔指出如果禁用或刪除了當前用戶帳戶,它將返回失敗結果。

使用完成偵聽器獲取reload()狀態:

user.reload().addOnCompleteListener(new OnCompleteListener<Void>() {
    @Override
    public void onComplete(@NonNull Task<Void> task) {
        if (task.isSuccessful()) {
            // account is still valid
        } else {
            // account is no longer valid
        }
    }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM