10

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

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

现在,我使用的是 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);
}

问题是:它只重新启动当前活动而不关闭整个应用程序,因此,没有重新启动服务

有任何想法吗?

4

7 回答 7

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

可以在此处查找示例

更新

正如@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());
于 2013-06-25T10:16:51.693 回答
3

尝试这个

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

     overridePendingTransition(0, 0);
     startActivity(intent);
    }
于 2013-06-25T10:15:34.717 回答
2

这是 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
于 2017-09-24T01:52:26.800 回答
1

解决方案AlarmManager无法工作,因为在终止应用程序时可以删除所有待处理的意图。在 android-10 我有这个问题。

但我找到了其他方法 - 创建类Instrumentation并调用startInstrumentation. Context工作得很好。

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

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

这个函数不是同步的——它在仪器启动和运行时立即返回。

检测通常只允许针对未签名或使用检测包也签名的签名的包运行(确保目标信任检测)。

Instrumentation必须在清单中定义。谷歌如何使用它。

于 2015-11-22T17:56:54.613 回答
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);
}
于 2013-06-25T10:13:06.457 回答
0

在你的重启活动中添加这个

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

为您的每个活动添加 getactivity(yourclassname) 然后完成活动。如果您像这样添加所有活动,您的应用程序将关闭并重新启动

于 2014-11-07T08:25:58.153 回答
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);
于 2019-07-25T16:33:25.080 回答