重新创建一个 activity 并传递参数
Recreate an activity and also pass arguments
我有一个 activity 可以侦听偏好更改并重新加载应用程序。我正在使用 recreate()
来做到这一点。但我不知道如何通过它传递参数,所以我求助于手动 activity 重新加载。
Intent intent = getIntent();
finish();
// add in the arguments as Extras to the intent
startActivity(intent);
这有我想要的行为,但是重新创建 activity 对用户来说并不顺利,因为他们会看到 activity 被杀死并且相同的 activity 重新启动.我希望用户不知道 activity 已重新启动。所以,我的问题是我可以使用方法 recreate()
并仍然通过它传递参数吗?
你可以这样试试:
您可以 activity 将启动模式设为 SingleTop 并处理 onNewIntent(Intent intent) 方法。这样你就可以重新启动 activity 并发送意图,同时 activity 不会被杀死,即你的 activity 的 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 将重新启动 Activity。
生命周期将为
-点击
-onPause
-onNewIntent
-onResume
您可以在调用 recreate
之前在 activity 的意图上设置数据
getIntent().putExtra("RECREATE_DATA", "Some Data");
recreate()
因为当您重新创建 activity 时使用相同的 activity 实例,意图中的数据在重新创建后仍然存在。
我有一个 activity 可以侦听偏好更改并重新加载应用程序。我正在使用 recreate()
来做到这一点。但我不知道如何通过它传递参数,所以我求助于手动 activity 重新加载。
Intent intent = getIntent();
finish();
// add in the arguments as Extras to the intent
startActivity(intent);
这有我想要的行为,但是重新创建 activity 对用户来说并不顺利,因为他们会看到 activity 被杀死并且相同的 activity 重新启动.我希望用户不知道 activity 已重新启动。所以,我的问题是我可以使用方法 recreate()
并仍然通过它传递参数吗?
你可以这样试试: 您可以 activity 将启动模式设为 SingleTop 并处理 onNewIntent(Intent intent) 方法。这样你就可以重新启动 activity 并发送意图,同时 activity 不会被杀死,即你的 activity 的 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 将重新启动 Activity。
生命周期将为
-点击
-onPause
-onNewIntent
-onResume
您可以在调用 recreate
之前在 activity 的意图上设置数据 getIntent().putExtra("RECREATE_DATA", "Some Data");
recreate()
因为当您重新创建 activity 时使用相同的 activity 实例,意图中的数据在重新创建后仍然存在。