Restarting Android app programmatically

前端 未结 9 1990
独厮守ぢ
独厮守ぢ 2021-02-03 12:14

This is a follow up question to this question:

Force application to restart on first activity

I am trying to restart my application from a fragment like that:

相关标签:
9条回答
  • 2021-02-03 12:32

    Tray this

    getActivity().finish();
    getActivity().startActivity(new Intent(getContext(), Main.class));
    getActivity().finishAffinity();
    

    where finishAffinity() close all other Intents

    0 讨论(0)
  • 2021-02-03 12:34

    try using below lines:

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

    ActivityCompat.finishAfterTransition(YourCurrentActivity.this); this line clear the instance after creating another activity

    0 讨论(0)
  • 2021-02-03 12:34

    Add this code as per your activity and your app will restart. This code is in kotlin.

    val intent = Intent(baseContext, MainActivity::class.java)
    val pendingIntentId = 101
    val pendingIntent = PendingIntent.getActivity(this, pendingIntentId,intent, PendingIntent.FLAG_CANCEL_CURRENT)
    val alarmManager = (this.getSystemService(Context.ALARM_SERVICE)) as AlarmManager
    alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + 100, pendingIntent)
    exitProcess(0)
    
    0 讨论(0)
  • 2021-02-03 12:39

    Once you add this FLAGSto the intent

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

    and call startActivity(), it will clear all the other activities including the one you call this from, so calling finish() after startActivity() will close the started activity.

    Basically, remove getActivity().finish().

    0 讨论(0)
  • 2021-02-03 12:40

    If you just consider to switch to your starting Activity, refer to Ricardo's answer. But this approach won't reset static context of your app and won't rebuild the Application class, so the app won't be really restarted.

    If you want to completely restart your app, I can advise more radical way, using 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. Tried your code in my project - works well with and without finish(). So maybe you have something specific about your Activity or Fragment, you haven't written.

    0 讨论(0)
  • 2021-02-03 12:46

    try this one

     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 讨论(0)
提交回复
热议问题