1

インテントによって起動されるアクティビティがあります: ProgressDialog を設定、表示、および非表示にします。アクティビティを設定して表示すると正常に動作しますが、hide が呼び出されると、onDestroy メソッドを呼び出す代わりに onCreate が呼び出されます。アクティビティが開始されたときの LogCat は次のとおりです。

SHOW_PROGESS
SET_PROGESS
onCreate
onStart
onResume
SET_PROGESS
onPause
DialogSET 15
onResume
SET_PROGESS
onPause
DialogSET 16
onResume
...

ProgressDialog は onNewIntent(Intent intent) メソッドで設定および表示されます。しかし、hide タスクが呼び出されると、

pd.dismiss();
finish();

が呼び出され、onDestroy を呼び出す代わりに onCreate が呼び出されます。

HIDE_PROGESS
onPause
DialogHIDE
onResume
onPause
onCreate
onStart
onResume
onStop
destroyed
Activity -activityName- has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@41347af0 that was originally added here android.view.WindowLeaked

ProgessDialog のない白い表示があります。BACKボタンを押した後、

onPause
onDestroy 

が呼び出され、必要なワットが表示されます。BACKボタンを押してonDestroyを再度呼び出すべきではないことを解決するにはどうすればよいですか?

インテントは次のように開始されます。

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
                intent.setAction(intent.ACTION_VIEW);

                startActivity(intent);

ありがとうございました!

編集:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);                     

        this.requestWindowFeature(Window.FEATURE_NO_TITLE);

        extras = getIntent().getExtras();

        progress = 0;
        max = extras.getInt("max");
        title = extras.getInt("title");

        pd = new ProgressDialog(this);

        pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        pd.setCancelable(false);

        Log.w("screenPD", "onCreate");
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);

        setIntent(intent);

        int newTitle = intent.getExtras().getInt("title");

        if (intent.getExtras().getString("action").equals("set")){
            pd.setTitle(newTitle);
            pd.setMessage(intent.getExtras().getString("message"));
            max = intent.getExtras().getInt("max");
            pd.setMax(max);
            pd.setProgress(intent.getExtras().getInt("progress"));
            pd.show();

            Log.e("DialogSET", "DialogSET "+intent.getExtras().getInt("progress"));
        }
        else if (intent.getExtras().getString("action").equals("show")){
            pd.setProgress(intent.getExtras().getInt("progress"));
            pd.setMessage(intent.getExtras().getString("message"));
            //pd.show();

            Log.e("DialogSHOW", "DialogSHOW "+progress);

        }
        else if (intent.getExtras().getString("action").equals("hide")){

            //pd.dismiss();
            finish();

            Log.e("DialogHIDE", "DialogHIDE");

        }
    }
4

1 に答える 1

0

これは、のドキュメントで述べられていることですonNewIntent()

アクティビティは、新しいインテントを受け取る前に常に一時停止されるため、このメソッドの後に onResume() が呼び出されることを期待できます。

あなたが見ている問題は、finish()呼び出しが行われonNewIntent()、フレームワークが (次のステップとしてアクティビティを再開する必要があることを確認して) アクティビティを再び復活させることが原因であると思います。

代わりにコードを移動してみてくださいonNewIntent()(onResume()おそらく、処理が必要かどうかを確認するためにフラグも追加します)。

private boolean mNewIntentProcessed;

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);

    setIntent(intent);

    mNewIntentProcessed = false;

    // move the rest of the code here to onResume() ..
}


@Override
protected void onResume() {
    super.onResume();

    if (!mNewIntentProcessed) {

        final int newTitle = intent.getExtras().getInt("title");

        // the rest of your code from onNewIntent() should be moved here ..  

        mNewIntentProcessed = true;
    }

}
于 2012-07-15T13:38:03.780 に答える