2013-12-20 4 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, поэтому я предположил, что он должен иметь стандартное ОСНОВНОЕ действие, чтобы сделать его главной точкой входа. Подробнее [здесь] (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

hmm so in my 'MainActiviy' Я проверяю, существует ли значение в shared pref. Если это так, запустите некоторую активность, которая может быть видна только зарегистрированным пользователям, если не начать «LoginActivity» и после входа в систему заполнить общую настройку? Это будет работать нормально, но что, если у меня есть 10 видов деятельности, и из этих 9 требуется, чтобы пользователь был зарегистрирован ... мне нужно будет проверить общие предпочтения перед началом каждого действия? – birdy

+0

Я думаю, что вы следуете за потоком приложений, так как приложение начинается с одного действия и следующего действия. поэтому один раз, если вы проверите mainactivity, тогда не может быть никаких зависимостей. –

Смежные вопросы