2015-04-08 59 views
9

我正在開發一個有兩個活動的應用程序:LoginActivityMainActivity。當用戶第一次打開應用程序時,他將登錄並將其憑據(用戶名和標記)保存在Preferences中。如何在android中以編程方式配置Launcher活動?

現在,如果用戶再次打開該應用程序,則MainActivity應該啓動。我試圖在Application類中的這些活動之間切換,並從清單中移除了LAUNCHER_ACTIVITY的意圖過濾器,但它不起作用。

是否有任何方式根據保存的偏好以編程方式在啓動器活動之間切換?

+0

檢查是否使用偏好,在LoginActivity登錄,然後打開MainAcivity和完成LoginActivity如果用戶登錄 – Yazan

+0

如果我檢查在MainActivity喜好那麼這將是更好,因爲切換到登錄活動將會發生更少的時間不, 對 ? –

+0

可能是,它取決於你的業務,如果一旦數據被提取一次mainAcitivty被加載,那麼你可能會得到一些錯誤,如果用戶沒有登錄,否則它可能會罰款。 – Yazan

回答

11

長話短說,您不能更改默認啓動的Activity。更新:在另一個答案中有CommonsWare所述的替代方案。

但是,有合理的解決辦法。在您的MainActivity中,您可以檢查用戶是否已登錄並立即將其重定向到LoginActivity。那有你在登錄後自動返回到MainActivity的好處。

或者,你總是可以先去LoginActivity,如果用戶已經登錄,並將它們發送到MainActivity(重寫意向歷史記錄以刪除返回到LoginActivity或在清單中設置noHistory標誌)。

+0

我想我會嘗試檢查MainActivity。謝謝:) –

2

活動並不一定需要UI,因此您可以使用清單中的啓動器活動來激活您期望的任何活動。

3

最簡單的方法是像往常一樣製作MainActivity啓動器活動。
然後通過SharedPreferences檢查MainActivity#onCreate(Bundle)如果用戶已經登錄,並且如果不是立即啓動LoginActivity。當用戶登錄時,保存指示用戶登錄的布爾標誌SharedPreferences並完成MainActivity

16

是否有任何方式根據保存的參數以編程方式在啓動器活動之間切換?

你可以試試這個:

第1步:有LoginActivityLAUNCHER<intent-filter>正常,並有MainActivity沒有<intent-filter>

步驟#2:有an <activity-alias> element in the manifest指向MainActivityLAUNCHER<intent-filter>

第3步:將android:enabled="false"<activity-alias>,所以它被默認禁用,因此在首次安裝應用程序時,唯一的啓動器圖標是LoginActivity

第四步:當用戶登錄時,你想改變這樣MainActivity是發射活動,用PackageManagersetComponentEnabledSetting()使使<activity-alias>和禁用LoginActivity

並非所有的主屏幕都會在運行中檢測到這種變化,對於那些設備需要重新啓動才能接受更改。出於這個原因,最好堅持一個單一的發射器活動。如果你願意,那麼發射器的活動可能有Theme.NoDisplay,並且根據Fahim的回答,簡單地路由到onCreate()中正確的「真實」活動。

+2

你每天都會學到新的東西。好的提示。 – Knossos

2

據我所知,以編程方式更改啓動程序是不可能的,但它也沒有任何意義。

在您的LoginActivity的onCreate上檢查用戶名和標記是否已經保存,如果嘗試自動登錄,是否成功重定向到您的MainAcivity。根據您的應用程序的工作方式,您可以使用變量來檢查用戶是否登錄,如果他是LoginActivity會將其重定向到MainActivity而不嘗試再次登錄。

//LoginActivity 
onCreate(Bundle bundle) 
{ 
    /* ... */ 

    //Or whatever you use to login (it could also go inside a thread or an AsyncTask 
    if (login()) 
    { 
     //Intent 
     Intent intent = new Intent(this, MainActivity.class); 

     //Start Activity 
     startActivity(intent); 

     //Finish this activity, so when user pressed back the login activity will not come forth and the app will exit 
     //this looks like when a user has logged in once, the login screen will not be visible to him (unless you want to) 
     finish(); 
    } 
} 

您還可以配置它來保存用戶名和令牌只有在登錄成功,這意味着上面的代碼可以修改如下:

if (getUsername() != null) 
{ 
    /* Start Main Activity */ 
} 

這不會嘗試登錄,但它知道憑證是正確的,因爲它已經至少登錄過一次。

如果您的應用程序的行爲方式不同的是,這些方法都不奏效,隨意說出這樣的話,我可能能夠提供更多信息

0

可以僅僅指剛在OnCreate後加入意向要顯示的XML在你的APP開始。

public class LoginActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     //add some code to detect if user is logged in 
     if (user != null){ 
      Intent in = new Intent(LoginActivity.this, YourDesiredActivity.class); 
      startActivity(in); 
     } 
    .......... 
    ........... 
相關問題