重新创建一个活动并传递参数
Posted
技术标签:
【中文标题】重新创建一个活动并传递参数【英文标题】:Recreate an activity and also pass arguments 【发布时间】:2016-12-10 00:30:36 【问题描述】:我有一个监听偏好变化并重新加载应用程序的活动。我正在使用recreate()
来做到这一点。但我不知道如何通过它传递参数,所以我求助于手动重新加载活动。
Intent intent = getIntent();
finish();
// add in the arguments as Extras to the intent
startActivity(intent);
这具有我想要的行为,但是对于用户来说,重新创建活动并不顺利,因为他们会看到活动被终止并且相同的活动重新启动。我希望用户不知道该活动已重新启动。所以,我的问题是我可以使用方法recreate()
并且仍然通过它传递参数吗?
【问题讨论】:
您可以使用 recreate() 并将参数保存在 sharedPreference 中 这是唯一可行的方法吗? 看看this的回答。 【参考方案1】:您可以在调用 recreate 之前设置 Activity 的 Intent 数据
getIntent().putExtra("RECREATE_DATA", "Some Data");
recreate()
由于重新创建活动时使用的是相同的活动实例,因此重新创建后意图中的数据仍然存在。
【讨论】:
很好的解决方案,我也可以在抽象类中使用。【参考方案2】:你可以试试这样: 您可以使用作为 SingleTop 的启动模式重新启动活动并处理 onNewIntent(Intent intent) 方法。这样,您将重新启动 Activity 并发送 Intent,同时该 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
【讨论】:
但是我想调用 oncreate,问题的关键在于处理首选项更改(这会大大改变整个 UI),我在 oncreate 中做 UI 的东西,所以我需要调用它 一种方法是在 onCreate 和 setvisibility 中为重启后所需的 UI 集创建所有视图,一旦你进入 onNewIntent,使用意图并将这些视图集的可见性设置为 true 和另一个设置为假。这样用户就不会知道该活动已重新启动。以上是关于重新创建一个活动并传递参数的主要内容,如果未能解决你的问题,请参考以下文章
OBIEE 11g:如何导航到另一个报告并传递参数(使用 Go URL)?