我有一个应用程序在其首次启动的活动中启动远程服务。然后,在另一个活动中,用户可以设置应用程序的配置。请注意,第二项活动不受服务约束,我不希望将其绑定。
现在我的问题是:在更改配置设置后,如何从第二个活动重启整个应用程序?
目前,我正在使用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);
}
问题是:它只会在不关闭整个应用程序的情况下重新启动当前活动,因此无需重新启动服务
有什么想法吗?
答案 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);