为什么主页在登录页面之前显示?

时间:2018-03-15 07:33:35

标签: android firebase firebase-authentication

根据我的期望,用户在登录前不应看到任何页面。

执行应用时的当前行为:
显示主页(约一秒) - >显示登录页面

预期行为:
显示登录页面 - >已登录 - >显示主页

问题:

  1. 如何将当前行为修改为预期行为?

  2. 根据运行流程(下面附带),在" MainActivity的片段:onCreate"之前触发登录页面。为什么主页面在登录页面之前出现?

  3. 主线程调用startActivityForResult()后,是否应该停止并等待用户登录?为什么它继续运行?

  4. 非常感谢你的帮助。

    APP中有一个活动和两个片段 FirebaseAuth UI(登录页面)在onResume()方法上触发。

    Here is the app's running flow:
    MainActivity: onCreate: 
    MainActivity: onStart: 
    MainActivity: onResume: 
    MainActivity: startLoginProcess: Show Login page
    MainActivity's fragment: onCreate: 
    MainActivity's fragment: onActivityCreated: 
    MainActivity's fragment: onStart: 
    MainActivity's fragment: onResume: 
    MainActivity's fragment: onPause: 
    MainActivity: onPause: 
    MainActivity's fragment: onStop: 
    MainActivity: onStop: 
    

    的AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.android.fastorder">
    
    <application
        android:allowBackup="false"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".ui.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
    
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>
    
    </manifest>
    
    public class MainActivity extends AppCompatActivity {
    
    private static final int RC_SIGN_IN = 1;
    private static final String TAG = "MainActivity";
    private FirebaseAuth mFirebaseAuth;
    private FirebaseAuth.AuthStateListener mAuthStatListener;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        initializeScreen();
        setupLogin();
    
        Log.d(TAG, "onCreate: ");
    
    
    }
    
    
    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "onStart: ");
    }
    
    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "onStop: ");
    }
    
    @Override
    protected void onResume() {
        super.onResume();
        mFirebaseAuth.addAuthStateListener(mAuthStatListener);
        Log.d(TAG, "onResume: ");
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        mFirebaseAuth.removeAuthStateListener(mAuthStatListener);
        Log.d(TAG, "onPause: ");
    }
    
    private void initializeScreen() {
        ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
        PanelFragmentAdapter panelFragmentAdapter = new PanelFragmentAdapter(getSupportFragmentManager(),
                MainActivity.this);
        viewPager.setOffscreenPageLimit(2);
        viewPager.setAdapter(panelFragmentAdapter);
    
        TabLayout tabLayout = (TabLayout) findViewById(R.id.sliding_tabs);
        tabLayout.setupWithViewPager(viewPager);
    
    
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // RC_SIGN_IN is the request code you passed into startActivityForResult(...) when starting the sign in flow.
        if (requestCode == RC_SIGN_IN) {
            if (resultCode == RESULT_OK) {
                Toast.makeText(this, "signed in success", Toast.LENGTH_SHORT).show();
            } else if (resultCode == RESULT_CANCELED) {
                Toast.makeText(this, "user canceled", Toast.LENGTH_SHORT).show();
                finish();
            } else {
                Toast.makeText(this, "signed in failed", Toast.LENGTH_SHORT).show();
            }
        }
    }
    
    private void setupLogin() {
        mFirebaseAuth = FirebaseAuth.getInstance();
        mAuthStatListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();
                if (user != null) {
                    // user is signed in
                    Toast.makeText(MainActivity.this, "signed in", Toast.LENGTH_SHORT).show();
                } else {
                    // user is signed out
                    startLoginProcess();
    
                }
            }
        };
    }
    
    private void startLoginProcess() {
        Log.d(TAG, "startLoginProcess: Show Login page");
        startActivityForResult(
                AuthUI.getInstance()
                        .createSignInIntentBuilder()
                        .setIsSmartLockEnabled(false)
                        .setAvailableProviders(Arrays.asList(
                                new AuthUI.IdpConfig.EmailBuilder().build(),
                                new AuthUI.IdpConfig.GoogleBuilder().build()))
                        .build(),
                RC_SIGN_IN);
    }
    
    /**
     * Created by yorick on 2018/2/2.
     */
    
    public class PanelFragmentAdapter extends FragmentPagerAdapter {
        private Context context;
    
        private String[] mTitles = new String[]{"menu", "order"};
    
        public PanelFragmentAdapter(FragmentManager fm, Context context) {
            super(fm);
            this.context = context;
        }
    
    
        @Override
        public Fragment getItem(int position) {
            Fragment fragment = null;
    
            switch (position) {
                case 0:
                    fragment = MenuFragment.newInstance();
                    break;
                case 1:
                    fragment = PanelOrderFragment.newInstance();
                    break;
                default:
                    fragment = MenuFragment.newInstance();
            }
    
            return fragment;
    
        }
    
        @Override
        public int getCount() {
            return 2;
        }
    
        @Override
        public CharSequence getPageTitle(int position) {
            return mTitles[position];
        }
    }
    

    }

2 个答案:

答案 0 :(得分:0)

在清单文件中,检查您声明为启动器活动的活动。如果您可以在此向我们展示您的清单文件以及您的登录活动代码,那将非常有用。

编辑:此外,因为您首先OriginalValue Result --------------------------------------- --------------------------------------- 19.91 19.90000000 19.92 19.90000000 19.93 19.95000000 19.94 19.95000000 19.95 19.95000000 19.96 19.95000000 19.97 19.95000000 19.98 20.00000000 19.99 20.00000000 然后

setContentView(R.layout.activity_main);

在您的登录过程开始之前显示您的主要活动是有意义的。

答案 1 :(得分:0)

在您的清单中,将<intent-filter>更改为您的LoginActivity

 <intent-filter>
            <action android:name="android.intent.action.MAIN"/>

            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>

更改以上行