这是这个问题的后续问题:
Force application to restart on first activity
我正在尝试从像这样的片段重启我的应用程序:
window.signOut = function signOut(_e) {
firebase.auth().signOut().then(function() {
// Sign-out successful.
}).catch(function(error) {
// An error happened.
});
}
代码什么也没做。由于某种原因, Toast.makeText(getActivity(), "Restarting app", Toast.LENGTH_SHORT).show();
Intent i = getActivity().getBaseContext().getPackageManager()
.getLaunchIntentForPackage(getActivity().getBaseContext().getPackageName() );
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
getActivity().finish();
是唯一可行的。如果我删除finish()
,则没有任何反应。那是为什么?
答案 0 :(得分:9)
如果您只是考虑切换到起始Activity
,请参阅Ricardo's回答。但是这种方法不会重置应用程序的静态上下文,也不会重建Application
类,因此不会重新启动应用程序。
如果您想完全重启您的应用,我可以使用PendingIntent
建议更激进的方式。
private void restartApp() {
Intent intent = new Intent(getApplicationContext(), YourStarterActivity.class);
int mPendingIntentId = MAGICAL_NUMBER;
PendingIntent mPendingIntent = PendingIntent.getActivity(getApplicationContext(), mPendingIntentId, intent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager mgr = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent);
System.exit(0);
}
P.S。在我的项目中尝试了您的代码 - 无论是否使用finish()
都能正常运行。所以也许你有关于你的活动或片段的具体内容,你还没有写过。
答案 1 :(得分:5)
请参阅以下代码
Intent intent = new Intent(this, YourHomeActivity.class);
this.startActivity(intent);
this.finishAffinity();
它正在开始您的家庭活动并解雇所有其他活动。它看起来像是重启用户,但过程是一样的。
答案 2 :(得分:3)
尝试这个
Intent intent = getActivity().getBaseContext().getPackageManager().getLaunchIntentForPackage(getActivity().getBaseContext().getPackageName() );
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
答案 3 :(得分:2)
将此FLAGS
添加到意图
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
并致电startActivity()
,它会清除所有其他活动,包括您调用此活动的活动,因此在finish()
之后调用startActivity()
将关闭已启动的活动。
基本上,请删除getActivity().finish()
。
答案 4 :(得分:2)
托盘
getActivity().finish();
getActivity().startActivity(new Intent(getContext(), Main.class));
getActivity().finishAffinity();
finishAffinity()
关闭所有其他Intent
答案 5 :(得分:0)
Intent i = getBaseContext().getPackageManager()
.getLaunchIntentForPackage( getBaseContext().getPackageName() );
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
finish();
startActivity(i);
答案 6 :(得分:0)
尝试使用以下行:
Intent i = getBaseContext().getPackageManager()
.getLaunchIntentForPackage(getBaseContext().getPackageName());
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
ActivityCompat.finishAfterTransition(YourCurrentActivity.this);
ActivityCompat.finishAfterTransition(YourCurrentActivity.this);此行在创建另一个活动后清除实例
答案 7 :(得分:0)
由于新的后台启动限制,被接受的答案似乎不再适用于Android Q,因此,我添加自己的解决方案:
startActivity(
Intent(applicationContext, MainActivity::class.java)
)
System.exit(0)
尽管它看起来很奇怪,但它对我来说非常可靠,因为意图触发的时间比系统出口要长。另外,它是从主线程触发的,因此Android Q不会抱怨。
答案 8 :(得分:0)
根据您的活动添加此代码,您的应用将重新启动。这段代码在kotlin中。
val intent = Intent(baseContext, MainActivity::class.java)
val pendingIntentId = 101
val pendingIntent = PendingIntent.getActivity(this, pendingIntentId,intent, PendingIntent.FLAG_CANCEL_CURRENT)
val alarmManager = (this.getSystemService(Context.ALARM_SERVICE)) as AlarmManager
alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + 100, pendingIntent)
exitProcess(0)