2013-05-06 103 views
3

我有MainActivityLoginActivity。我創建了一個超類FacebookActivity保持UiLifecycleHelper對象和所有的重載方法:使用UiLifecycleHelper實施Facebook登錄

MainActivity

public class MainActivity extends FacebookActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main_activity); 
    } 
} 

LoginActivity(基本上是一個閃屏與Facebook登錄按鈕):

public class LoginActivity extends FacebookActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.login_activity); 
    } 

} 

Facebook活動實施所有的UI生命週期方法:

public class FacebookActivity extends SherlockFragmentActivity { 

    private UiLifecycleHelper uiHelper; 
    private Session.StatusCallback statusCallback = new Session.StatusCallback() { 
     @Override 
     public void call(Session session, SessionState state, 
       Exception exception) { 
      onSessionStateChange(session, state, exception); 
     } 
    }; 

    public FacebookActivity() { 
     Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     uiHelper = new UiLifecycleHelper(this, statusCallback); 
     uiHelper.onCreate(savedInstanceState); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     // For scenarios where the main activity is launched and user 
     // session is not null, the session state change notification 
     // may not be triggered. Trigger it if it's open/closed. 
     Session session = Session.getActiveSession(); 
     if (session != null && (session.isOpened() || session.isClosed())) { 
      onSessionStateChange(session, session.getState(), null); 
     } 
     uiHelper.onResume(); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     uiHelper.onPause(); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     uiHelper.onActivityResult(requestCode, resultCode, data); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     uiHelper.onDestroy(); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     Session session = Session.getActiveSession(); 
     Session.saveSession(session, outState); 
     uiHelper.onSaveInstanceState(outState); 
    } 

    private void onSessionStateChange(Session session, SessionState state, Exception exception) { 
     if (state.isOpened()) { 
      Log.i(Consts.TAG, "Logged in..."); 
      setCookies(); 
      Intent intent = new Intent(this, MainActivity.class); 
      this.startActivity(intent); 
     } else if (state.isClosed()) { 
      Log.i(Consts.TAG, "Logged out..."); 
      Intent intent = new Intent(this, LoginActivity.class); 
      this.startActivity(intent); 
     } 
    } 
} 

我認爲這將是一個好主意,所有的活動課,將從FacebookActivity這樣我會處理所有的會話管理的一個代碼繼承。

不幸的是這並不能很好地工作,其中一個例子是,當我通過MainActivity登出我得到一個循環:

  1. onSessionStateChange事件監聽器觸發了,因爲我清除
  2. LoginActivity開始
  3. 會議
  4. FacebookActivity.onCreate()LoginActivity.onCreate()
  5. onSessionStateChange稱爲被再次調用並回到2

我不完全知道什麼事件觸發了Session.StatusCallback聽衆,我不明白我的方法有什麼問題。

任何其他方式來處理這個?

+0

什麼是SherlockFragmentActivity? – keen 2013-07-15 06:56:28

+2

@BSThakrar它是低級別API廣泛使用的ActionBar支持包的一部分:「當在所有版本的Android上創建活動以使用操作欄時,必須聲明您的活動以擴展任何以'Sherlock 「」。我使用它的Android 2.2+,效果很好。 – 2013-07-17 04:28:06

+0

感謝@BenSewards。 – keen 2013-07-17 05:13:37

回答

2

UiLifecycleHelper顯然做了很多與Session類有關的事情。 這是onCreate方法的一部分:

public void onCreate(Bundle savedInstanceState) { 
    Session session = Session.getActiveSession(); 
    if (session == null) { 
     if (savedInstanceState != null) { 
      session = Session.restoreSession(activity, null, callback, savedInstanceState); 
     } 
     if (session == null) { 
      session = new Session(activity); 
     } 
     Session.setActiveSession(session); 
    } 

    [...] 
} 

會話變化,所以Session.StatusCallback被稱爲每次..導致您的無限循環。

+0

這個onCreate會用於Facebook類還是每個已實施的活動onCreate?謝謝! – 2013-07-17 04:15:02

+0

當然每個活動。您不必實施Facebook課程。 – 5agado 2013-07-17 08:00:35

+0

謝謝,我是否會將這個添加到我從另一個活動註銷後開始的活動中,以便會話被刷新並更新? – 2013-07-17 13:37:30