根据我的期望,用户在登录前不应看到任何页面。
执行应用时的当前行为:
显示主页(约一秒) - >显示登录页面
预期行为:
显示登录页面 - >已登录 - >显示主页
问题:
如何将当前行为修改为预期行为?
根据运行流程(下面附带),在" MainActivity的片段:onCreate"之前触发登录页面。为什么主页面在登录页面之前出现?
主线程调用startActivityForResult()后,是否应该停止并等待用户登录?为什么它继续运行?
非常感谢你的帮助。
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];
}
}
}
答案 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>
更改以上行