79

Android アプリケーションがあります。プログレスバー付きのロード画面を作っています。

onCreate メソッドに遅延を入力しました。タイマーが終了したら、現在のアクティビティを終了し、新しいアクティビティを開始したいと考えています。

finish()メソッドを呼び出すときに例外が発生するだけです。

public class LoadingScreen extends Activity{
    private LoadingScreen loadingScreen;
    Intent i = new Intent(this, HomeScreen.class);
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.loading);

        CountDownTimer timer = new CountDownTimer(10000, 1000) //10 second Timer
        {
            public void onTick(long l) 
            {

            }

            @Override
            public void onFinish() 
            {
                loadingScreen.finishActivity(0);
                startActivity(i);
            };
        }.start();
    }
}

プログレスバーが完了したときに終了するようにコードを変更するにはどうすればよいですか?

4

8 に答える 8

134

ロード画面を実行している場合は、パラメータをアクティビティ スタックに保持しないように設定するだけです。アクティビティを定義する manifest.xml で、次のことを行います。

<activity android:name=".LoadingScreen" android:noHistory="true" ... />

また、コードで .finish() を呼び出す必要はもうありません。startActivity(i); を実行するだけです。

現在のアクティビティのインスタンスを別のフィールドに保持する必要もありません。LoadingScreen.this.doSomething()の代わりにいつでもアクセスできますprivate LoadingScreen loadingScreen;

于 2011-02-15T07:19:34.843 に答える
52

この例を使用してみましたが、惨めに失敗しました。ハンドラー内でfinish()/finishactivity()を呼び出すたびに、この脅威に陥りjava.lang.IllegalAccess Exceptionます。質問をした人にとってそれがどのように機能したかはわかりません。

代わりに、私が見つけた解決策は、次のようなアクティビティでメソッドを作成することでした

void kill_activity()
{ 
    finish();
}

このメソッドは、ハンドラーの run メソッド内から呼び出します。これは私にとって魅力のように機能しました。これが「別のスレッドからのアクティビティを閉じる方法」に苦労している人の助けになることを願っています.

于 2011-10-05T19:23:54.327 に答える
13

新しいアクティビティを開始して現在のアクティビティを終了する場合は、次のようにします。

API 11 以上

Intent intent = new Intent(OldActivity.this, NewActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

API 10 以下

Intent intent = new Intent(OldActivity.this, NewActivity.class);
intent.setFlags(IntentCompat.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

これが誰かに役立つことを願っています=)

于 2016-05-16T07:00:28.793 に答える
13

finish()バックグラウンド スレッドではなく、UI スレッドから呼び出す必要があります。これを行う方法は、Handler を宣言し、UI スレッドで Runnable を実行するよう Handler に依頼することです。例えば:

public class LoadingScreen extends Activity{
    private LoadingScreen loadingScreen;
    Intent i = new Intent(this, HomeScreen.class);
    Handler handler;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        handler = new Handler();
        setContentView(R.layout.loading);

        CountDownTimer timer = new CountDownTimer(10000, 1000) //10seceonds Timer
        {
             @Override
             public void onTick(long l) 
             {

             }

             @Override
             public void onFinish() 
             {
                 handler.post(new Runnable() {
                     public void run() {
                         loadingScreen.finishActivity(0);
                         startActivity(i);
                     }
                 });
             };
        }.start();
    }
}
于 2011-02-15T07:20:16.013 に答える
7

finish()メソッドを呼び出すだけです:

context.finish();
于 2015-03-04T03:27:09.137 に答える