如何完全重启应用程序?

时间:2013-06-25 10:05:17

标签: android android-activity application-restart application-shutdown

我有一个应用程序在其首次启动的活动中启动远程服务。然后,在另一个活动中,用户可以设置应用程序的配置。请注意,第二项活动不受服务约束,我不希望将其绑定。

现在我的问题是:在更改配置设置后,如何从第二个活动重启整个应用程序?

目前,我正在使用onClickListener的按钮:

public void onClick(DialogInterface dialog, int which) {
    sauvegarde();
    Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName());
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(i);
}

问题是:它只会在不关闭整个应用程序的情况下重新启动当前活动,因此无需重新启动服务

有什么想法吗?

7 个答案:

答案 0 :(得分:9)

您可以像这样使用Androids系统AlarmManager

在您的活动中重启应用的代码:

AlarmManager mgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, PendingIntent.getActivity(this.getBaseContext(), 0, new    Intent(getIntent()), getIntent().getFlags()));
System.exit(2);

可以查看示例here

<强>更新

正如@CommonsWare指出的那样,当你不得不重新启动它时,它是一种设计应用程序的坏方法(不好的做法)。如果你真的想这样做,你可以尝试设置alarmmanager来在你杀死自己的进程后一秒钟启动你的应用程序:

AlarmManager mgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, PendingIntent.getActivity(this.getBaseContext(), 0, new    Intent(getIntent()), getIntent().getFlags()));
android.os.Process.killProcess(android.os.Process.myPid());

答案 1 :(得分:1)

试试这个

   public void reload() {
     Intent intent = getIntent();
     overridePendingTransition(0, 0);
     intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
     finish();

     overridePendingTransition(0, 0);
     startActivity(intent);
    }

答案 2 :(得分:1)

AlarmManager的解决方案无效,因为在kill app上可以删除所有挂起的意图。在android-10上我有这个问题。

但我找到了其他方式 - 创建Instrumentation课程并在startInstrumentation上致电Context。工作得很好。

  

boolean android.content.Context.startInstrumentation(ComponentName className,   String profileFile,Bundle arguments)

     

开始执行android.app.Instrumentation类。给定的   Instrumentation组件将通过杀死其目标来运行   应用程序(如果当前正在运行),启动目标进程,   实例化检测组件,然后让它驱动   应用程序。

     

此功能不是同步的 - 它会尽快返回   仪表已经开始运行。

     

通常只允许对一个包运行检测   要么是未签名的,要么使用签名签名   仪表包也签有(确保目标   信任仪器)。

必须在清单中定义

Instrumentation。谷歌如何使用它。

答案 3 :(得分:1)

这是2017年最新更新测试的最新答案,并且像魅力希望一样工作:)

     Intent i = getBaseContext().
               getPackageManager().
          getLaunchIntentForPackage(getBaseContext().getPackageName());
           i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//clear the stack
           i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
           finish();//don`t forget to finish before starting again

                        startActivity(i);//start the activity again

答案 4 :(得分:0)

试试这段代码,

public void onClick(DialogInterface dialog, int which) {
    sauvegarde();
    restart(2);
}

重启方法

public void restart(int delay) {
    Intent launchIntent = new Intent(context, YourStartUpActivity.class);
    PendingIntent intent = PendingIntent.getActivity(getApplicationContext(), 0, launchIntent , 0);
    AlarmManager manager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
    manager.set(AlarmManager.RTC, System.currentTimeMillis() + delay, intent);
    System.exit(2);
}

答案 5 :(得分:0)

在重启活动中添加此

restart.this.finish();
getActivity(otheractivity.class).finish();
Intent in = new Intent(this,main.class);
startActivity(in);

为您的每个活动添加getactivity(yourclassname),然后完成活动。 如果您将此类活动添加到您的应用程序关闭&amp;重新启动

答案 6 :(得分:0)

通过使用待定意图,您可以根据需要重新启动应用程序,只需使用以下代码行

int pendingId_Intent = 987654;
Intent YourMainActivityIntent = new Intent(Context, YourMainActivity.class);

PendingIntent intentPending = PendingIntent.getActivity(context, 
pendingId_Intent,    YourMainActivityIntent, 
PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarm_manager = 
(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
alarm_manager.set(AlarmManager.RTC, System.currentTimeMillis() + 100, 
intentPending);
System.exit(0);