2013-12-20 35 views
2

如果沒有帳戶存在,我想迫使我的應用程序運行LoginActivity如何強制android啓動LoginActivity

我已經完成了以下工作,但仍然在模擬器中啓動應用程序時,我有MainActivityTest出現。

現在我沒有帳戶在模擬器上的我的應用程序,所以我希望只是看到登錄屏幕。然而,我所看到的好像MainActivityTest運行

public class AccountAuthenticator extends AbstractAccountAuthenticator { 
    private Context context; 
    private static final String TAG = "AccountAuthenticator"; 
    public AccountAuthenticator(final Context context) { 
     super(context); 
     this.context = context; 
    } 

    @Override 
    public Bundle addAccount(final AccountAuthenticatorResponse response, 
          final String accountType, final String authTokenType, 
          final String[] requiredFeatures, final Bundle options) throws NetworkErrorException { 
     final Intent intent = new Intent(context, LoginActivity.class); 
     final Bundle bundle = new Bundle(); 
     bundle.putParcelable(KEY_INTENT, intent); 
     return bundle; 

    } 
    ... 
} 

public class AccountAuthenticatorService extends Service { 

    private static AccountAuthenticator AUTHENTICATOR; 

    public IBinder onBind(Intent intent) { 
     return intent.getAction().equals(ACTION_AUTHENTICATOR_INTENT) ? getAuthenticator() 
       .getIBinder() : null; 
    } 

    private AccountAuthenticator getAuthenticator() { 
     if (AUTHENTICATOR == null) 
      AUTHENTICATOR = new AccountAuthenticator(this); 
     return AUTHENTICATOR; 
    } 
} 

public class LoginActivity extends RoboSherlockAccountAuthenticatorActivity { 
    @Override 
    public void startActivity(Intent intent) { 
     if (intent != null && ACTION_VIEW.equals(intent.getAction())) 
      intent.addCategory(CATEGORY_BROWSABLE); 
     super.startActivity(intent); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.login); 
    } 
} 

AndroidManifest.xml就像下面

<application 
      android:icon="@drawable/ic_launcher" 
      android:label="myapp" > 
     <activity 
     android:name=".ui.ui.MainActivityTest" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
     </activity> 

    <service 
     android:name="com.myapp.AccountAuthenticatorService" 
     android:exported="false" 
     android:process=":auth" > 
     <intent-filter> 
      <action android:name="android.accounts.AccountAuthenticator" /> 
     </intent-filter> 

     <meta-data 
      android:name="android.accounts.AccountAuthenticator" 
      android:resource="@xml/authenticator" /> 
    </service> 
    <activity 
     android:name="com.myapp.LoginActivity" 
     android:configChanges="orientation|keyboardHidden|screenSize" 
     android:excludeFromRecents="true" > 
     <!-- 
      No intent-filter here! This activity is only ever launched by 
      someone who explicitly knows the class name 
     --> 
    </activity> 
    </application 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" /> 
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" /> 
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS" /> 
<uses-permission android:name="android.permission.READ_SYNC_STATS" /> 
<uses-permission android:name="android.permission.USE_CREDENTIALS" /> 
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" /> 
+0

所以你不想設置意圖過濾器LoginActivity。你想要你的服務來完成這項工作。對? – Nizam

+0

是的。我希望LoginActivity僅在我的應用的帳戶不在手機上時才顯示。此外,用戶不應該能夠做任何事情,如果他們還沒有登錄... – birdy

回答

1

當您啓動在模擬器中的應用程序,MainActivityTest上來了,因爲你的AndroidManifest有:

<activity 
    android:name=".ui.ui.MainActivityTest" 
    android:label="@string/app_name" > 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
    </activity> 

如果您想默認啓動LoginActivity,請使用

<activity 
    android:name="com.myapp.LoginActivity" 
    android:configChanges="orientation|keyboardHidden|screenSize" 
    android:excludeFromRecents="true" > 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
    </activity> 

另外,如果你想顯示LoginActivity基於某些條件下,第一個活動,然後

  1. 在Android清單,保持MainActivityTest作爲默認 活動
  2. 在MainActivityTest->的onCreate,檢查條件爲 ,如果條件成立,則啓動LoginActivity
+0

我跟隨github android應用程序。在他們的清單中,他們似乎將HomeActivity作爲MAIN:https://github.com/github/android/blob/master/app/AndroidManifest.xml#L35。但是,在'onCreate'中,他們沒有檢查啓動'LoginActivity'的條件https://github.com/github/android/blob/master/app/src/main/java/com/github/mobile/ ui/user/HomeActivity.java#L96不知道他們是怎麼做到的? – birdy

+0

您保留爲主的活動將是單擊應用程序圖標時默認啓動的活動。您希望首先展示哪個活動。既然你在問題中提到過,你想啓動LoginActivity,所以我建議它應該有標準的MAIN動作來使它成爲主要的入口點。更多信息[here](http://developer.android.com/reference/android/content/Intent.html)。 –

2

如果您在完成登錄過程後將值設置爲共享首選項,那將很簡單。 每當你啓動應用程序時,檢查一次sharedpreference值,並導航到活動

Boolean mobile_register_flag = sharedpref.getBoolean("mobile_register_flag", false); 

if (!mobile_register_flag) { 
      Intent intent = new Intent(FlashView.this, 
        RegisterActivity.class); 
      startActivity(intent); 
     } else { 
      Intent intent = new Intent(FlashView.this, 
        ActivityTwo.class); 
      startActivity(intent); 
     } 
+1

嗯所以在我的'MainActiviy'我檢查是否存在共享前綴。如果是這樣,請啓動一些只能通過登錄用戶才能看到的活動,如果不啓動「LoginActivity」,登錄後填充共享首選項?這將工作正常,但如果我有10個活動,並在這9個需要用戶登錄...我需要檢查共享首選項之前開始每個活動? – birdy

+0

我認爲您正在關注像應用程序一樣的應用程序流程,並開始一項活動並開始下一項活動。所以一旦你檢查主要活動,那麼可能沒有任何依賴關係。 –

相關問題