2015-12-25 106 views
3

我的應用需要用戶使用Facebook登錄。一旦他們這樣做了,每次他們打開應用程序時都檢查Facebook令牌,以便我們不要求他們再次登錄 - 我們將其重定向到MainActivity活動流程:OnCreate在我想要恢復活動時調用

請注意,這是一個'空視圖'活動 - 我沒有使用setContentView將它設置爲一個視圖,它純粹是爲決策制定。

public class DecisionActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     FacebookSdk.sdkInitialize(getApplicationContext()); 

     if (AccessToken.getCurrentAccessToken() != null) { 
       Intent intent = new Intent(this, MainActivity.class); 
       startActivity(intent); 
     } else { 
      Intent startIntent = new Intent(this, SignUpActivity.class); 
      startActivity(startIntent); 
      finish(); 
     }; 
    } 
} 

這是我的MainActivity代碼。請注意,我在onCreate中致電我的網絡操作,因爲我不想在每次最小化我的應用程序時調用它們,並在活動onResumes時最大化我的應用程序。創建我的活動時必須調用一次。

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //show my progress bar 
     //CALL MY API TO GET SOME DATA FROM THE SERVER 
     //hide my progress bar after data is received. 
    } 
} 

這很好用。如果用戶已登錄,他會每次都重定向到我的MainActivity。如果用戶沒有登錄,他會去SignUpActivity

但是,今天我發現這個代碼有一個令人討厭的副作用。 onResuming情景1我的應用程序按我希望的方式工作。 關於onResuming我的應用程序的情景2確實是而不是按照我希望它工作的方式工作。

方案1:

如果你在你的MainActivity和您再次減少您的應用程序,並按下方形按鈕,找到您的應用,最大限度地提高,在MainActivity onCreate方法不會被稱爲活動只是onResumes因此不執行網絡操作,進度條不顯示,這是我想要的。

方案2:

然而,如果你減少你的應用程序,並決定點擊您的手機,DecisionActivity將推出應用程序圖標,這將決定MainActivity需要被推出作爲用戶登錄已經存在並且令牌存在。由於MainActivity重新啓動,onCreate被調用並執行網絡活動,並顯示進度條,這是而不是我想要的。

當我點擊手機上的應用程序圖標時,如何防止發生這種情況?

我查流行的應用程序,如Facebook,現在看他們通過對他們的測試方案1方案2有同樣的問題,他們似乎並沒有遇到這個問題,這讓我覺得是否設置我已經用來檢查是否有人登錄我的應用程序DecisionActivity可以以更好的方式完成。

回答

1

我敢肯定,更優雅的方式存在,但是這是我從我的頭頂:

嘗試使用SharedPreferences。所以,當您的應用程序最小化時,將調用onPause()方法。在此方法中,將SharedPreference設置爲false,這意味着您現在不想運行進度欄。在MainActivity的onCreate()方法中檢查SharedPreference。當應用程序恢復時,將SharedPreference設置爲true。

所以這意味着每當用戶通過onPause()方法時,進度條不會運行,如果他通過場景1(因爲然後他會擊中onResume(),它不會顯示進度條),或者如果他通過方案2(因爲您的SharedPreference爲false,並且您在MainActivity的onCreate()中事先檢查其值)。

但是,現在您還必須使用onFinish()或onDestroy()方法,並將SharedPreference的值更改爲true,這樣會在下次啓動應用程序時顯示進度條。

我能想到的唯一缺陷是我不確定如果用戶從最近的菜單中關閉了應用程序,是否會調用onDestroy()方法,或者Android內存清理器關閉應用程序以釋放內存,所以請嘗試一下並告訴我它是否有效。

而且我同意這是但更多的是黑客,而不是一個妥善的解決辦法,但如果它的工作原理,它是不夠好;)

+0

實際上,我認爲fundementally我的應用程序是有缺陷的,並且DecisionActivity需要與我的MainActivity合併。然後MainActivity將決定將作出所有決定性的電話,但這需要大量的返工... – Simon

+0

是的,你應該重做它,但如果它是一個活躍的應用程序,使用快速入侵,直到你找出一個真正的解決方案。我現在在學校,所以我會盡量考慮一些事情。 –

+0

而且,請勿在MainActivity的onCreate()方法中與服務器進行通信,因爲如果用戶的連接速度較慢,則永久需要加載主屏幕,並且客戶端會認爲應用程序已凍結。如果您正在與服務器進行通信,請確保在另一個線程中執行此操作,以便返回onCreate()方法,並且至少加載主屏幕。顯示一個對話框來顯示進度條。 –