104


  1. ランチャーアクティビティからAccountManager経由で独自AccountAuthenticatorActivityを起動
  2. 独自AccountAuthenticatorActivityでバックボタンが押されたら、認証をキャンセル
  3. AccountManagerのコールバックでfutureがキャンセルされていたら、ランチャーアクティビティをfinish
  4. アクティビティが消えるトランジションの後、一瞬 (それまでに起動していた) アプリの画面が表示される

という症状です。

AndroidManifest.xml

[code]

        <activity
            android:name=".activity.LaunchActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait"
            android:theme="@style/Theme.AppCompat.Translucent.NoTitleBar" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    
[/code]

バックボタンが押された時のコールバック: 認証をキャンセルする

[code]

    public class LoginActivity extends AccountAuthenticatorActivity {
        @Override
        public void onBackPressed() {
            setAccountAuthenticatorResult(null);
            setResult(RESULT_CANCELED);
            finish();
        }
    }
    
[/code]

AccountManagerのコールバック内でキャンセルを処理

[code]

        mAccountManager.getAuthTokenByFeatures(mAccountType, mAuthTokenType, null, activity, null, null,
            new AccountManagerCallback<Bundle>() {
                @Override
                public void run(AccountManagerFuture<Bundle> future) {
                    Bundle bundle;
                    try {
                        if (future.isCancelled()) {
                            eventBus.post(new LoginFailedEvent(true));
                            return;
                        }
    
[/code]

ランチャーアクティビティを`finish()`

[code]

    public class LaunchActivity extends BaseActivity {
        // EventBus経由で受け取る
        public void onEventMainThread(LoginFailedEvent event) {
            if (event.isCancelled()) {
                finish();
            }
    
[/code]

終了の仕方がおかしいなどあるでしょうか。


CC BY-SA 3.0
2014-10-09T10:18:10.977
103
2014-10-13T14:46:55.037
2014-10-13T14:46:55.037
30
30
question
android
finishする瞬間に他のアプリが一瞬表示されてしまう


これは[Nexus 5 + Android
4.4.3以降で起きる問題](https://code.google.com/p/android/issues/detail?id=71067)のようです。

回避策として、`moveTaskToBack`で一旦アプリをバックグラウンドに回すようにしたら他のアプリは表示されなくなりました。

[code]

    public class LaunchActivity extends BaseActivity {
        // EventBus経由で受け取る
        public void onEventMainThread(LoginFailedEvent event) {
            if (event.isCancelled()) {
                // workaround for: https://code.google.com/p/android/issues/detail?id=71067
                moveTaskToBack(false);
                finish();
            }
        }
    }
    
[/code]


CC BY-SA 3.0
2014-10-09T10:18:10.977
104
2014-10-13T14:45:06.843
2014-10-13T14:45:06.843
30
30
103
answer