重新启动Android应用程序编程

问题描述:

这是一个后续问题,这个问题:重新启动Android应用程序编程

Force application to restart on first activity

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

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()是唯一的工作。如果我删除了finish(),没有任何反应。这是为什么?

+0

https://stackoverflow.com/questions/17294428/how-to-restart-an-application-completely –

+0

可能重复[如何以编程方式“重新启动”Android应用程序?](https:// stackoverflow。 com/questions/6609414/how-do-i-programmatically-restart-an-android-app) – Zoe

+0

你在哪里执行这段代码?这是在一个'活动'?如果是这样,哪一个?请张贴您的清单。你究竟想要完成什么? –

如果你只是考虑切换到你的出发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

您应该考虑使用* * android.os.Process.killProcess(android.os.Process.myPid()); ** –

一旦你添加此FLAGS的意图

i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

,并呼吁startActivity(),它会清除所有其他活动,包括一个你调用该方法,因此调用finish()startActivity()将关闭开始活动。基本上删除getActivity().finish()

+0

我在问题中专门写了一句话:“如果我删除了finish(),没有任何反应。“ –

Intent i = getBaseContext().getPackageManager() 
      .getLaunchIntentForPackage(getBaseContext().getPackageName()); 
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
finish(); 
startActivity(i); 

你可以参考previous discussion (click here)

+1

怎么是比我已经做了 –

尝试使用下面几行:

Intent i = getBaseContext().getPackageManager() 
       .getLaunchIntentForPackage(getBaseContext().getPackageName()); 
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(i); 
ActivityCompat.finishAfterTransition(YourCurrentActivity.this); 

ActivityCompat.finishAfterTransition(YourCurrentActivity.this);这条线清除实例创建另一个活动

+0

方法finishAfterTransition(活动)不同的是未定义类型ActivityCompat –

+0

在我的情况下,其工作完全正常 –

后,请参考下面的代码

Intent intent = new Intent(this, YourHomeActivity.class); 
    this.startActivity(intent); 
    this.finishAffinity(); 

它开始你家的活动并关闭所有其他活动。它看起来像是重新启动给用户,但过程是一样的。

试试这个

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); 
+0

为什么你有这两个特定意图的标志? –