我正在爲我的Android應用程序的Facebookintegration和減少麻煩,我試圖創建一個單例類來分離我的應用程序的主邏輯Facebook的邏輯。Facebook會話單例使用
我希望能夠從我的應用程序的不同部分調用此類(入口點,asynctasks,...)。此時,我首先使用applicationcontext作爲上下文調用初始化函數。在初始化之後,我希望能夠調用例如。 FacebookSession.getInstance().login()
和FacebookSession.getInstance().requestWithQuery(examplestring)
。
問題是我找不到像樣的文檔。即使臉譜官方樣本使用舊的Facebook對象,這已棄用。我的代碼,我能找到的不同部分組合在一起扔這個類,我想出了這個:
package be.ugent.zeus.hydra.util.facebook;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import com.facebook.HttpMethod;
import com.facebook.Request;
import com.facebook.Session;
import com.facebook.SessionState;
public class FacebookSession {
private static final String APP_ID = "hidden";
private static final String ACCESS_TOKEN = "hidden";
private static FacebookSession fbSession;
public static final String TAG = "FACEBOOK";
private Activity activity;
private static Session.StatusCallback statusCallback = new SessionStatusCallback();
protected FacebookSession() {
}
public static void initialize(Context context) {
Session session = Session.getActiveSession();
if (session == null) {
session = new Session.Builder(context)
.setApplicationId(APP_ID)
.build();
}
Session.setActiveSession(session);
}
public static FacebookSession getInstance() {
if (fbSession == null) {
fbSession = new FacebookSession();
}
return fbSession;
}
public Session getSession() {
return Session.getActiveSession();
}
public void tryOpenSession(Activity activity) {
Session session = Session.openActiveSession(activity, false, statusCallback);
Session.setActiveSession(session);
}
public void login(Activity activity) {
Session session = Session.getActiveSession();
if (!session.isOpened() && !session.isClosed()) {
Session.openActiveSession(activity, true, statusCallback);
}
}
public void logout() {
Session session = Session.getActiveSession();
if (!session.isClosed()) {
session.closeAndClearTokenInformation();
}
}
public boolean isOpen() {
Session session = Session.getActiveSession();
return session.isOpened();
}
public Request requestWithQuery(String query) {
Bundle bundle = new Bundle();
bundle.putString("q", query);
return requestWithGraphPath("/fql", bundle, "GET");
}
private Request requestWithGraphPath(String path, Bundle bundle, String method) {
// Get the session
Session session = Session.getActiveSession();
// No session? Try to open one without user interaction
if (session == null) {
session = Session.openActiveSession(activity, false, statusCallback);
Session.setActiveSession(session);
}
// Still no session? Use the default key
if (session == null) {
bundle.putString("access_token", ACCESS_TOKEN);
}
return new Request(session, path, bundle, HttpMethod.valueOf(method));
}
private static class SessionStatusCallback implements Session.StatusCallback {
@Override
public void call(Session session, SessionState state, Exception exception) {
Log.i(TAG, state.toString());
switch (state) {
case CLOSED:
case CLOSED_LOGIN_FAILED:
session.closeAndClearTokenInformation();
break;
default:
break;
}
}
}
}
的queryingpart作品非常簡潔,但會議沒有。例如,如果我調用登錄函數,則活動會話爲空,但是我在應用程序的入口點使用applicationcontext初始化了會話。
混凝土,我有這樣的疑問:
- 這是(嘗試)來跟蹤會話狀態的「好」的方式?可以這樣做嗎?如果是這樣,我做錯了,它只是不工作?
而作爲一個後續問題:
- 如果不是,那麼什麼是跟蹤會話的過程中,可以應用生命時間以正確的方式和以其他方式應用程序會話之間?
在此先感謝。
你說得對,Session對象確實是作爲一個單身,我莫名其妙地忽略了這一點。謝謝! – Silox 2013-03-19 11:57:50
當然可以。如果它適合你,你會考慮接受答案嗎? – 2013-03-22 21:42:58