Appの再起動機能を実現

2964 ワード

プロジェクト開発の過程で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());

実は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)の違い