如何重新启动Android Activity
?我试过以下,但Activity
简单地退出了.
public static void restartActivity(Activity act){
Intent intent=new Intent();
intent.setClass(act, act.getClass());
act.startActivity(intent);
act.finish();
}
Run Code Online (Sandbox Code Playgroud)
Ebo*_*ike 608
我做了我的主题切换器:
Intent intent = getIntent();
finish();
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
基本上,我finish()
先打电话,我正在使用与此活动开始时完全相同的意图.这似乎成功了?
更新:正如下面的拉尔夫所指出的,Activity.recreate()
是API 11及更高版本的发展方向.如果您在API11 +环境中,这是首选.如果您使用的是API 10或更低版本,您仍然可以检查当前版本并调用上面的代码段.(请不要忘记提升Ralf的答案!)
Ral*_*alf 357
从API级别11(Honeycomb)开始,您可以调用活动的recreate()方法(感谢这个答案).
recreate()方法就像配置更改一样,因此如果适用,还会调用onSaveInstanceState()和onRestoreInstanceState()方法.
Ben*_*Ben 129
在SDK 11之前,一种方法是这样的:
public void reload() {
Intent intent = getIntent();
overridePendingTransition(0, 0);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
overridePendingTransition(0, 0);
startActivity(intent);
}
Run Code Online (Sandbox Code Playgroud)
Jus*_*ris 110
只是结合Ralf和Ben的答案(包括评论中的更改):
if (Build.VERSION.SDK_INT >= 11) {
recreate();
} else {
Intent intent = getIntent();
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
overridePendingTransition(0, 0);
startActivity(intent);
overridePendingTransition(0, 0);
}
Run Code Online (Sandbox Code Playgroud)
Tho*_*Vos 24
我使用此代码,因此我仍然可以支持较旧的Android版本并recreate()
在较新的Android版本上使用.
码:
public static void restartActivity(Activity activity){
if (Build.VERSION.SDK_INT >= 11) {
activity.recreate();
} else {
activity.finish();
activity.startActivity(activity.getIntent());
}
}
Run Code Online (Sandbox Code Playgroud)
样品:
import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private Activity mActivity;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mActivity = MainActivity.this;
Button button = (Button) findViewById(R.id.restart_button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
restartActivity(mActivity);
}
});
}
public static void restartActivity(Activity activity) {
if (Build.VERSION.SDK_INT >= 11) {
activity.recreate();
} else {
activity.finish();
activity.startActivity(activity.getIntent());
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 20
这个解决方案对我有用.
首先完成活动,然后再次启动它.
示例代码:
public void restartActivity(){
Intent mIntent = getIntent();
finish();
startActivity(mIntent);
}
Run Code Online (Sandbox Code Playgroud)
Abh*_*oni 18
这是迄今为止重启当前活动的最简单方法:
finish();
startActivity(getIntent());
Run Code Online (Sandbox Code Playgroud)
Nik*_*esh 17
调用此方法
private void restartFirstActivity()
{
Intent i = getApplicationContext().getPackageManager()
.getLaunchIntentForPackage(getApplicationContext().getPackageName() );
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK );
startActivity(i);
}
Run Code Online (Sandbox Code Playgroud)
谢谢,
Chr*_*ins 16
即使这已被多次回答.
如果从片段重新启动活动,我会这样做:
new Handler().post(new Runnable() {
@Override
public void run()
{
Intent intent = getActivity().getIntent();
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION);
getActivity().overridePendingTransition(0, 0);
getActivity().finish();
getActivity().overridePendingTransition(0, 0);
startActivity(intent);
}
});
Run Code Online (Sandbox Code Playgroud)
所以你可能会认为这有点矫枉过正?但是Handler
发布允许您在生命周期方法中调用它.在检查用户返回应用程序时状态是否发生变化时,我在onRestart
/ onResume
methods中使用了此方法.(装了东西).
没有Handler
你如果你在一个奇怪的地方调用它它将杀死活动而不是重新启动它.
随意问任何问题.
干杯,克里斯
Cod*_*sed 15
那么这不是列出的,而是已经发布的一些组合:
if (Build.VERSION.SDK_INT >= 11) {
recreate();
} else {
Intent intent = getIntent();
finish();
startActivity(intent);
}
Run Code Online (Sandbox Code Playgroud)
shk*_*der 14
我想知道为什么没有人提到Intent.makeRestartActivityTask()
清楚地实现了这一确切目的。
制作一个 Intent,可用于在其基本状态下重新启动应用程序的任务 *。
startActivity(Intent.makeRestartActivityTask(getActivity().getIntent().getComponent()));
Run Code Online (Sandbox Code Playgroud)
此方法设置Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK
为默认标志。
如果有人正在寻找 Kotlin 答案,您只需要这一行。
分段
startActivity(Intent.makeRestartActivityTask(activity?.intent?.component))
Run Code Online (Sandbox Code Playgroud)
活动
startActivity(Intent.makeRestartActivityTask(this.intent?.component))
Run Code Online (Sandbox Code Playgroud)
如果删除最后一行,您将创建新的act
Activity,但旧实例仍然存在。
您是否需要像方向更改时那样重新启动 Activity(即您的状态已保存并传递给onCreate(Bundle)
)?
如果不这样做,一个可能的解决方法是使用一个额外的虚拟活动,该活动将从第一个活动启动,并且该作业将启动它的新实例。act.finish()
或者只是在新的呼叫开始后延迟对 , 的呼叫。
如果您需要保存大部分状态,那么您就陷入了相当深的困境,因为传递状态的所有属性并非易事,尤其是通过将其传递给新实例而不会泄漏旧的上下文/活动。
请具体说明您想做什么。
归档时间: |
|
查看次数: |
285852 次 |
最近记录: |