6

設定の変更をリッスンしてアプリをリロードするアクティビティがあります。私はそれをするために使用recreate()しています。しかし、それを介して引数を渡す方法がわからないため、手動のアクティビティのリロードに頼っています。

Intent intent = getIntent();
finish();
// add in the arguments as Extras to the intent
startActivity(intent);

これには私が望む動作がありますが、アクティビティが強制終了され、同じアクティビティが再起動されるため、アクティビティの再作成はユーザーにとってスムーズではありません。アクティビティが再開されたことをユーザーに知られたくない。したがって、私の質問は、メソッドを使用してrecreate()引数を渡すことができるかということです。

4

2 に答える 2

5

再作成を呼び出す前に、アクティビティの意図に基づいてデータを設定できます

        getIntent().putExtra("RECREATE_DATA", "Some Data");
        recreate()

アクティビティを再作成すると、同じアクティビティ インスタンスが使用されるため、インテント内のデータは再作成後も存在します。

于 2019-11-08T06:35:21.793 に答える
3

この方法を試すことができます: 起動モードを SingleTop にしてアクティビティを再開し、 onNewIntent(Intent intent) メソッドを処理できます。このようにして、アクティビティを再起動してインテントを送信します。このアクティビティは強制終了されません。つまり、アクティビティの oncreate は呼び出されません。

public class MainActivity extends Activity implements View.OnClickListener {
    Button btn ;
    String mRelaunchData ;
    public static String TAG = "RelaunchMainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button)findViewById(R.id.button);
        btn.setOnClickListener(this);
        Log.e(TAG, "onCreate called");
    }

    @Override
    public void onClick(View view) {
        Log.e(TAG, "onClick called");
        Intent intent = new Intent("relaunch.activity.ACTIVITY_SELF_START_INTENT").setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        intent.putExtra("RESTART_DATA", "This is relaunch of this Activity");
        startActivity(intent);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        Log.e(TAG, "onNewIntent called");
        mRelaunchData = intent.getStringExtra("RESTART_DATA");
        Log.e(TAG, "mRelaunchData =" + mRelaunchData);
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.e(TAG, "onResume called");
        if(mRelaunchData != null){
            Toast.makeText(MainActivity.this, mRelaunchData, Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.e(TAG, "onPause called");

    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.e(TAG, "onStart called");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.e(TAG, "onStop called");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.e(TAG, "onDestroy called");
    }
}

AndroidManifest.xml で

 <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="relaunch.activity.ACTIVITY_SELF_START_INTENT" />
                <category android:name = "android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

onClick はアクティビティを再起動します。

ライフサイクルは

-onclick

-onPause

-onNewIntent

-onResume

于 2016-08-04T06:07:34.020 に答える