4

スプラッシュスクリーン(デフォルト)、ログイン、メインの3つのアクティビティを持つアプリがあります。アプリケーションはスプラッシュで起動し、数秒後にログインに変更されます。ログインプロセスが正しければ、メインに移動します。

私の問題は、ログインアクティビティを一時停止状態から回復できないことです。ホームボタンを押すと、onPause()が正しく呼び出され、onDestroy()が呼び出されません。次に、アプリケーションに戻ろうとすると、スプラッシュで開始しますが、ログインに到達することはなく、ホームに戻るだけです。logcatはエラーを表示せず、デバッガーはアプリケーションがまだ開いていると述べます(そうあるべきです)。スプラッシュとメイン画面での動作は予想どおりです。

public class LoginActivity extends Activity {
/* UI ELEMENTS */
private OnClickListener mOnClickListener;

private EditText mPasswordField;

private EditText mUserField;

private ProgressDialog mProgressDialog;

/* LOGIC ELEMENTS */
/** handler to update interface */
private static Handler sInterfaceUpdateHandler;


public static class UpdateHandler extends Handler {

    private final WeakReference<LoginActivity> mLogin;

    UpdateHandler(final LoginActivity loginActivity) {
        super();
        mLogin = new WeakReference<LoginActivity>(loginActivity);
    }

    /**
     * handle events from other threads in UI thread.
     * 
     * @param message message data. Property what determines action.
     */
    @Override
    public void handleMessage(final Message message) {
       // STUFF HERE
    }


@Override
public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.initializeInterface(); // fields filled here, listener added to buttons
}

編集:リクエストに応じてSplashScreenでアクティビティを作成

 public class SplashScreen extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.splashscreen);
    final Thread splashThread = new Thread() {
        @Override
        public void run() {
            try {
                int waited = 0;
                while (waited < 2000) {
                    sleep(100);
                    waited += 100;
                }
            } catch (final InterruptedException catchException) {
                LoggerFactory.consoleLogger().printStackTrace(catchException);
            }
            SplashScreen.this.finish();
            final Intent loginIntent = new Intent(SplashScreen.this, LoginActivity.class);
            SplashScreen.this.startActivity(loginIntent);
        }
    };
    splashThread.start();
}

}

4

3 に答える 3

3

エラーが見つかり、修正されました。アクティビティは、マニフェストで SingleInstance としてマークされました。SingleTop に変更したところ、期待どおりに動作するようになりました。

原因に関する詳細なドキュメントは、http: //developer.android.com/guide/topics/manifest/activity-element.html#lmodeにあります。

于 2013-01-28T08:31:00.150 に答える
0

私はあまりスレッドで遊んだことはありませんが、スプラッシュ アクティビティから別のスレッドを作成し、そのスレッドからアクティビティを開始しているように見えます。次に、一時停止すると、新しいアクティビティが何らかの形で失われたり、ガベージコレクションが発生したりします(おそらく、メインスレッドにないためです)。前のアクティビティに戻ると、onCreate は再度呼び出されないため、これがあります永続的な SplashScreen (問題を正しく理解している場合)。

編集また、なぜそのスレッド内で待っているのか尋ねなければなりませんか?

于 2013-01-25T22:24:01.723 に答える
0

SplashActivity以下のように andから finally ブロックを削除します。

final Thread splashThread = new Thread() {
    @Override
    public void run() {
        try {
            int waited = 0;
            while (waited < 2000) {
                sleep(100);
                waited += 100;
            }
        } catch (final InterruptedException catchException) {
            LoggerFactory.consoleLogger().printStackTrace(catchException);
        } 
            SplashScreen.this.finish();
            final Intent loginIntent = new Intent(SplashScreen.this, LoginActivity.class);
            SplashScreen.this.startActivity(loginIntent);
        }
};
splashThread.start();
于 2013-01-23T11:01:49.400 に答える