为啥在firebase onAuthStateChanged中完成活动时最近的应用程序中没有屏幕截图

Posted

技术标签:

【中文标题】为啥在firebase onAuthStateChanged中完成活动时最近的应用程序中没有屏幕截图【英文标题】:Why is there no screenshot in recent apps when finnishing activity in firebase onAuthStateChanged为什么在firebase onAuthStateChanged中完成活动时最近的应用程序中没有屏幕截图 【发布时间】:2017-10-08 06:27:03 【问题描述】:

我有一个非常基本的启动画面活动:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_start);

    FirebaseAnalytics.getInstance(this);


    mAuth = FirebaseAuth.getInstance();
    mAuth.addAuthStateListener(new FirebaseAuth.AuthStateListener() 
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) 
            FirebaseUser user = firebaseAuth.getCurrentUser();
            if (user != null) 
                FirebaseAuth.getInstance().removeAuthStateListener(this);
                startActivity(new Intent(StartActivity.this, MainActivity.class));
                finish();
            
        
    );

这个闪屏会打开我的MainActivity。当我关闭此活动时,这是最近应用中的屏幕截图:

似乎截屏太晚了,这导致了这个嵌套的最近应用截屏。这也发生在实际设备上。我该如何解决这种奇怪的行为?

活动清单:

<activity
    android:name="activities.StartActivity"
    android:label="@string/app_name"
    android:screenOrientation="portrait">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

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

<activity
    android:name="activities.MainActivity"
    android:label="@string/app_name"
    android:screenOrientation="portrait"
    android:launchMode="singleTask">
</activity>

问题似乎不在launchMode 中。我一直有同样的行为。即使删除 lauchmode。

这绝对与回调有关。直接启动activity时,没有问题。

编辑:

我找到了一个解决方案。在开始活动时使用延迟可以解决它。虽然硬编码的延迟不是那么好。

new Handler().postDelayed(new Runnable() 
    @Override
    public void run() 
        startActivity(new Intent(StartActivity.this, MainActivity.class));
        finish();
    
,500);

编辑 2

直接启动活动时,我没有出现此行为。所以它可能与回调有关。我正在使用谷歌登录。看起来一些透明的活动正在关闭。这可能是 Google 登录活动吗?

【问题讨论】:

截图的代码在哪里? 没有代码。这只是默认的 android 行为 您是否尝试过使用真正的启动屏幕?我的意思是使用主题进行自定义启动并在身份验证后设置内容视图和真实应用主题? 也许 Firebase 代码使用了这个? developer.android.com/reference/android/view/… 我不这么认为。该问题仅在按下后退按钮时出现。按下主页按钮时不会。 【参考方案1】:

您可以像这样在应用清单中使用android:noHistory="true",而不是调用finish();

<activity
    android:name=".SplashActivity"
    android:noHistory="true" />

或者您可以在 Intent 中使用FLAG_ACTIVITY_CLEAR_TOP

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

编辑:

您为什么使用android:launchMode="singleTask"? 您可能应该将其更改为 android:launchMode="singleInstance" 或完全删除此行。 欲了解更多信息,here is a great article about launch modes

【讨论】:

我一直有同样的行为。即使删除 lauchmode。【参考方案2】:

我猜你的问题是由于使用了launchMode singleTask 而没有taskAffinity

让我们更改 AndroidManifest.xml

<activity
    android:name="activities.StartActivity"
    android:label="@string/app_name"
    android:screenOrientation="portrait">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

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

<activity
    android:name="activities.MainActivity"
    android:label="@string/app_name"
    android:screenOrientation="portrait"
    android:launchMode="singleTask"
    android:taskAffinity="your_any_string">
</activity>

希望有帮助!

【讨论】:

我一直有同样的行为。即使删除 lauchmode。【参考方案3】:

我无法重现您所描述的问题,但既然您说使用 Handler.postDelayed() 会有所帮助,请尝试以下代码。

通过在onResume()/onPause() 之间添加/删除监听器,您还可以避免在您的应用处于后台时启动活动。此外,如果FirebaseAuth 拥有一个侦听器列表,它将保留对已被销毁的活动的引用,如果多次点击onCreate() 方法,例如轮换。这样可以避免内存泄漏。

private FirebaseAuth.AuthStateListener authStateListener;

@Override
protected void onResume() 
    super.onResume();

    FirebaseAnalytics.getInstance(this);

    authStateListener = new FirebaseAuth.AuthStateListener() 
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) 
            FirebaseUser user = firebaseAuth.getCurrentUser();
            if (user != null) 
                FirebaseAuth.getInstance().removeAuthStateListener(this);
                authStateListener = null;
                startActivity(new Intent(StartActivity.this, MainActivity.class));
                finish();
            
        
    ;
    FirebaseAuth.getInstance().addAuthStateListener(authStateListener);


@Override
protected void onPause() 
    super.onPause();
    if (authStateListener != null) 
        FirebaseAuth.getInstance().removeAuthStateListener(authStateListener);
    

【讨论】:

这也没什么区别。但是您无法重现该问题?我注意到我在使用 Android O 的模拟器上不会出现这种奇怪的行为。 监听器被调用了多少次?也许您的问题是由于它被多次调用?这个答案有一个解决方法 - ***.com/a/37686371/1449010 我相信我之前测试过,据我所知它只被调用一次。它对回调做一些事情。我正在使用谷歌登录。有什么你能想到的吗?

以上是关于为啥在firebase onAuthStateChanged中完成活动时最近的应用程序中没有屏幕截图的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 Typescript(Firebase 函数)中双重导入 NPM 包

为啥我无法通过 Firebase 的身份验证?

为啥在 Vue js 中尝试从 firebase 检索令牌时出现错误?

为啥 Firebase 报告错误的屏幕数据?

在 Firebase 中使用事务时,为啥 onChildChanged() 在 onComplete() 之前触发?

为啥这个 NSString 在 FireBase 查询块中为空?