如何通过编程在Android 10中重新启动应用程序?

4
我希望找到一种方法,在用户购买移除广告横幅后,重新启动应用程序,以便再次调用onCreate()方法。但问题在于,我不想结束任何服务,我只想在限制更改后重新启动应用程序。我在 Stack Overflow 上找到了以下代码:
Intent mStartActivity = new Intent(getApplicationContext(), MainActivity.class);
int mPendingIntentId = 123456;
PendingIntent mPendingIntent = PendingIntent.getActivity(getApplicationContext(), mPendingIntentId, mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager mgr = (AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent);
System.exit(0);

如果您接受答案,请勾选以关闭。 - Francesco Bocci
自 Android 10 开始,您无法从后台启动应用。请使用我下面的方法。使用此链接:https://dev59.com/E1YO5IYBdhLWcg3wRvkh#71392776 - grebulon
这个回答解决了你的问题吗?以编程方式重新启动Android应用程序 - grebulon
2个回答

5
更新:若要重新启动您的应用程序,请设置您的根活动意图时使用以下标记:intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);。这将确保启动一个新的根活动实例(第一个标记),而所有先前的活动将从堆栈中弹出(第二个标记)。
当在同一活动内时,可以使用recreate()方法。 如果您的应用程序没有运行,在打开时它已经被刷新了。

1
是的。在这种情况下,按照@Francesco的解决方案中提到的使用Intent,同时根据更新的答案中提到的添加标志。 - Arvind
现在我只有一个问题,我应该把采纳的答案给谁呢? :) - User104163
是的,第二个标志可以实现这一点。 - Arvind
接受谁的意见由你决定,但我相信我已经回答了实际/关键部分的问题。 - Arvind
它在Android 11中也可以工作。 - Evgeny GooDi
显示剩余2条评论

3
尝试这个:
Intent refresh= new Intent(getActivity(), MainActivity.class);
startActivity(refresh);

这很好,但有没有方法让它在重新启动之前等待1或两秒钟?我希望应用程序在再次启动之前已经完成了将布尔值写入共享首选项(布尔值表示已进行购买)的操作。 - User104163
如果您将此代码放在SharedPreferences之后,它将等待所有操作完成(无需“等待1或2秒”)。 - Francesco Bocci
你确定 editor.apply() 会在它下面的代码执行之前完成吗? - User104163
您可以检查editor.apply()是否成功。但使用计时器并不是一个好主意。 - Francesco Bocci
这对我非常有效,尽管它只重新启动活动而不是应用程序。 给未来的读者注意,getActivity在活动中不起作用(根据SF上的某些人),请改用getApplicationContext。 - anon
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接