实现重启App的功能

项目开发过程中需要实现重启App的功能,常用的可行方案有:

1. 使用 FLAG_ACTIVITY_CLEAR_TOP :

new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage(getApplication().getPackageName());
                LaunchIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(LaunchIntent);
            }
        }, 1000);// 1秒钟后重启应用

2. 使用 AlarmManager :

 Intent intent = getPackageManager()
                .getLaunchIntentForPackage(getApplication().getPackageName());
        PendingIntent restartIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_ONE_SHOT);
        AlarmManager mgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, restartIntent); // 1秒钟后重启应用
        System.exit(0);

  经过测试发现两种都可以实现,但是当默认启动的activity的launchMode 设置为不是以”standard” 方式启动时,这个时候重启app不能清除activity中的内存数据。

也可以直接kill 掉当前进程,app 会重新启动,又创建一个新的进程:

/**结束当前正在运行中的Java虚拟机**/
/**System.exit(0)是正常退出程序,而System.exit(1)或者说非0表示非正常退出程序**/
System.exit(0);
/**杀死整个进程**/
android.os.Process.killProcess(android.os.Process.myPid());

  其实 Process.killProcess 或 System.exit(0) 都不应该直接调用, 进程是由 os 底层进行管理的,android 系统会自己进行处理回收进程。

退出应用你就直接 finish 掉 activity 就行了。

附上使用自杀式服务重启app完整代码:


/**
 * 自杀式服务--重启app
 */

public class KillSelfService extends Service {
    private Handler handler;

    public KillSelfService() {
        handler = new Handler();
    }

    @Override
    public int onStartCommand(final Intent intent, int flags, int startId) {
        long stopDelayed = intent.getLongExtra("Delayed", 2000);
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage(getApplication().getPackageName());
                LaunchIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(LaunchIntent);
                KillSelfService.this.stopSelf();
            }
        }, stopDelayed);
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

补充:清理数据或注销后回到登录界面:

 Intent outIntent = new Intent(HomeActivity.this,
                                LoginActivity.class);
                        outIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK
                                | Intent.FLAG_ACTIVITY_NEW_TASK);
                        startActivity(outIntent);

参考:
android比较便捷的重启APP的方法
android Process.killProcess 和 System.exit(0) 区别

推荐阅读更多精彩内容