2013-12-20 32 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

我认为您正在关注像应用程序一样的应用程序流程,并开始一项活动并开始下一项活动。所以一旦你检查主要活动,那么可能没有任何依赖关系。 –

相关问题