我在我的应用中使用了firebase auth。我正在检查用户是否在我的MainActivity上进行了身份验证,就像Firebase文档和Udacity课程中所述。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
firebaseAuth = FirebaseAuth.getInstance();
final FirebaseUser user = firebaseAuth.getCurrentUser();
if (user == null){
loadLogIn();
}
authListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
if (user == null){
loadLogIn();
}
}
};
private void loadLogIn(){
Intent intent = new Intent(MainActivity.this, LoginActivity.class);
//Flags prevent user from returning to MainActivity when pressing back button
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
当我使用调试器逐步执行代码时,一切运行良好,用户为null,因此调用loadLogIn方法,该方法发送intent,但Login Activity永远不会打开,并且因为它继续执行代码而导致崩溃需要用户进行身份验证。如果我的登录活动从未被调用,则为onCreate方法。我无法理解为什么意图没有执行/什么阻止它。之前已经过完美的测试和完成。
当执行意图行时,我在控制台上获得以下输出:
I/Timeline: Timeline: Activity_launch_request id:com.example.tobias.run time:2369840341
如果有帮助,这是我的表现:
<?xml version="1.0" encoding="utf-8"?>
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:name=".app.RunApplication"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".app.MainActivity"
android:configChanges="orientation|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".editor.EditorActivity"
android:parentActivityName=".app.MainActivity" />
<activity
android:name=".login.LoginActivity"
android:screenOrientation="portrait"
android:theme="@style/LoginTheme" />
<activity
android:name=".settings.SettingsActivity"
android:parentActivityName=".app.MainActivity" />
<activity
android:name=".login.NewAccountActivity"
android:screenOrientation="portrait"
android:theme="@style/LoginTheme" />
<activity android:name=".login.ForgotPasswordActivity"
android:screenOrientation="portrait"
android:theme="@style/LoginTheme"/>
</application>
当我尝试从我的应用中退出
时,这个问题首次出现FirebaseAuth.getInstance().signOut();
用户已退出,但未发送意图,导致应用程序处于无效状态,然后在尝试执行需要用户的代码后崩溃了几秒钟。这不是我第一次退出应用程序,我已多次完成它并且有效。
这是一个奇怪的问题,我希望有人可以帮我找到错误。提前谢谢。
答案 0 :(得分:1)
<强>问题:强>
//...
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
//...
<强>解决方案:强>
//...
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
//...
当您使用setFlags
时,您正在替换旧标志...当您使用addFlags
时,您将附加新标记。请记住,flag
只是一个2的幂的整数...在二进制中,标志看起来像这样:1,10,100,1000等......(在这种情况下是1,2, 4,8)。因此,addFlags
所做的是使用|
运算符追加您传递的整数。