以编程方式重新启动Android应用

时间:2017-09-06 09:01:25

标签: android android-intent

这是这个问题的后续问题:

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(),则没有任何反应。那是为什么?

9 个答案:

答案 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);

您可以参考previous discussion (click here)

答案 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)
相关问题