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

Yon*_*Nir 7 android android-intent

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

强制应用程序重新启动第一个活动

我试图从像这样的片段重新启动我的应用程序:

    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();
Run Code Online (Sandbox Code Playgroud)

代码什么也没做.这finish()是唯一有用的原因.如果我删除finish(),没有任何反应.这是为什么?

gre*_*lon 26

这适用于 Android > 10,经测试最高可达 Android 13(预览版)

Context ctx = getApplicationContext();
PackageManager pm = ctx.getPackageManager();
Intent intent = pm.getLaunchIntentForPackage(ctx.getPackageName());
Intent mainIntent = Intent.makeRestartActivityTask(intent.getComponent());
ctx.startActivity(mainIntent);
Runtime.getRuntime().exit(0);
Run Code Online (Sandbox Code Playgroud)

  • 这非常简单,并且在我对 Android-12 的测试中运行良好。 (2认同)

Dmi*_*nov 10

如果您只是考虑切换到您的首发Activity,请参阅里卡多的答案.但是这种方法不会重置应用程序的静态上下文,也不会重建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);
}
Run Code Online (Sandbox Code Playgroud)

PS在我的项目中尝试了你的代码 - 无论是否有效都可以finish().所以也许你有关于你的活动或片段的具体内容,你还没有写过.

  • 你应该考虑使用**android.os.Process.killProcess(android.os.Process.myPid());** (2认同)
  • 它在 Android Q 中不起作用。您可以更新答案吗?找到这篇 https://developer.android.com/preview/privacy/background-activity-starts 文章,但找不到解决方案。 (2认同)
  • 我确认,此解决方案适用于 Android 9,但不适用于 Android 10 (Android Q)。我在 Pixel XL 4 上进行了测试,但没有运气……除了这种方式:如果我使用“打开”按钮从“应用程序信息”页面启动应用程序,那么它就会工作,按预期重新生成应用程序!...但这是一个非常具体的用例!:P (2认同)

pkg*_*ver 6

试试这个

 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);
Run Code Online (Sandbox Code Playgroud)


jit*_*555 5

请参考下面的代码

    Intent intent = new Intent(this, YourHomeActivity.class);
    this.startActivity(intent);
    this.finishAffinity();
Run Code Online (Sandbox Code Playgroud)

它正在开始您的家庭活动,并取消所有其他活动。对用户来说,这看起来像是重新启动,但是过程是相同的。


归档时间:

查看次数:

10031 次

最近记录:

6 年,1 月 前