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();
}
}
進行状況バーが完了したときに終了するようにコードを変更するにはどうすればよいですか?
ロード画面を実行している場合は、アクティビティスタックに保持しないようにパラメーターを設定するだけです。 manifest.xmlで、アクティビティを定義する場所:
<activity Android:name=".LoadingScreen" Android:noHistory="true" ... />
そして、あなたのコードでは、もう.finish()を呼び出す必要はありません。 startActivity(i);
また、現在のアクティビティのインスタンスを別のフィールドに保持する必要もありません。 private LoadingScreen loadingScreen;
の代わりにLoadingScreen.this.doSomething()
のようにいつでもアクセスできます
この例を使用してみましたが、失敗しました。ハンドラー内でfinish()/ finishactivity()を呼び出すたびに、この恐ろしいJava.lang.IllegalAccess Exception
になります。質問を提出した人にとってそれがどのように機能したのか分かりません。
代わりに、私が見つけた解決策は、次のようなメソッドをアクティビティに作成することでした
void kill_activity()
{
finish();
}
このメソッドは、ハンドラーのrunメソッド内から呼び出します。これは私にとって魅力的でした。これが「別のスレッドからのアクティビティを閉じる方法」に苦労している人の助けになることを願っています。
バックグラウンドスレッドではなく、UIスレッドからfinish()
を呼び出す必要があります。これを行う方法は、ハンドラーを宣言し、ハンドラーにUIスレッドでRunnableを実行するように依頼することです。例えば:
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();
}
}
finish()
メソッドを呼び出すだけです:
context.finish();
新しいアクティビティを開始して現在のアクティビティを終了する場合、次の操作を実行できます。
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);
これが誰かを助けることを願っています=)
私は多くの答えを見つけましたが、1つは簡単ではありません...これがあなたを助けることを願っています...
try{
Intent intent = new Intent(CurrentActivity.this, NewActivity.class);
startActivity(intent);
} finally {
finish();
}
したがって、非常に単純なロジックがあります。Javaではtryブロックで例外の可能性があるコードを記述し、catchブロックでその例外を処理しますが、最後のブロックでは任意のコストで実行されます(例外が発生するかどうか)。
次も使用できます。 finishAffinity()
このアクティビティと、同じアフィニティを持つ現在のタスクのすぐ下のすべてのアクティビティを終了します。