问题
I have an application which starts a Remote Service in its first launched activity. Then, in another activity, the user can set the configuration of the application. Please note that this second activity isn't bound to the Service and I don't wish to bind it.
Now my question is : how could I restart the whole application from the second activity, after changing the configuration settings?
For now, I am using a button which onClickListener is :
public void onClick(DialogInterface dialog, int which) {
sauvegarde();
Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName());
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
}
The problem is : it only restarts the current activity without shutting the whole application, and therefore, without restarting the service
Any ideas?
回答1:
You can use the Androids system AlarmManager like this:
Code to restart the app in your activity:
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);
An example can be looked up here
UPDATE
As @CommonsWare pointed out, its a bad way to design your app, when you have to restart it (bad practice). If you really want to do it, you can try setting alarmmanager to start your app in a second after you killed your own process:
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());
回答2:
try this
public void reload() {
Intent intent = getIntent();
overridePendingTransition(0, 0);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
overridePendingTransition(0, 0);
startActivity(intent);
}
回答3:
Solution of AlarmManager
can not work because on kill app all pending intents can be removed. On android-10 I have this issue.
But I found other way - create Instrumentation
class and call startInstrumentation
on Context
. Worked very nice.
boolean android.content.Context.startInstrumentation(ComponentName className, String profileFile, Bundle arguments)
Start executing an android.app.Instrumentation class. The given Instrumentation component will be run by killing its target application (if currently running), starting the target process, instantiating the instrumentation component, and then letting it drive the application.
This function is not synchronous -- it returns as soon as the instrumentation has started and while it is running.
Instrumentation is normally only allowed to run against a package that is either unsigned or signed with a signature that the the instrumentation package is also signed with (ensuring the target trusts the instrumentation).
Instrumentation
must be defined in manifest. Google how use it.
回答4:
This is the newest answer with the latest update 2017 tested and working like a charm hope that help :)
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
回答5:
try this code,
public void onClick(DialogInterface dialog, int which) {
sauvegarde();
restart(2);
}
restart method
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);
}
回答6:
in your restart activity add this
restart.this.finish();
getActivity(otheractivity.class).finish();
Intent in = new Intent(this,main.class);
startActivity(in);
for each of your activity add getactivity(yourclassname) then finish activity. if you add all your activity like this your application close & restart
回答7:
By Using a Pending Intent You can Restart your Application when you want,Just use the below Lines of code
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);
来源:https://stackoverflow.com/questions/17294428/how-to-restart-an-application-completely