希望這個職位將成爲誰運行到類似的問題,但這裏的人一個助手是我最近碰到的問題:Facebook登錄
我們推出我們自己的Facebook
背景登錄片段,並使其與3.0 sdk中的樣本相似。該片段是一個setRetainInstance(true)片段,並且預計來自facebook SDK的回調將被傳遞到有問題的片段。登錄過程將在片段的onCreate()方法被啓動時,像這樣:
if (sessionIsOpenable(session)) {
session.openForRead(new Session.OpenRequest(this).setCallback(mReadStatusCallback).setPermissions(mReadPermissions));
} else if (SessionState.OPENING != session.getState()) {
Session.openActiveSession(getActivity(), this, true, mReadStatusCallback);
}
問題遇到
這似乎只發生在第一次登錄/授權嘗試爲用戶, FB或我們的本地緩存中不存在緩存的訪問令牌。會出現什麼情況是,當用戶接受讀取權限請求,Facebook的SDK會叫我們的回調,而是因爲我們把守的額外的工作,像這樣我們的片段將不會進行任何額外的處理以支票:
if (isResumed()) {
// Do processing (adding fragments, etc...)
}
我們看到從暫停到恢復的片段轉換,但它是在片段的新實例上,而不是啓動登錄嘗試的實例。當我在調試過程中刪除了對isResumed()的檢查時,代碼會因未連接片段而崩潰。
的原因 ,我們發現的是,你絕對不能由於Facebook將推出它自己的活動執行從片段的onCreate()方法的會話初始化,這將導致片段的事被FragmentManager置爲非活動狀態(當我們的活動恢復時,會導致新的片段實例被添加到片段管理器中)。這是因爲FragmentManager做這個初始化片段時:
if (!f.mRetaining) {
f.performCreate(f.mSavedFragmentState);
}
f.mRetaining = false;
而接下來的過渡片段將使稱此:
if (!f.mRetaining) {
f.performDestroy();
}
和碎片將不會被保留。我知道這是比較複雜的,但是它的要點是片段將被破壞,因爲它還沒有機會被完全激活。