2010-12-02 18 views
6

ユーザが設定を変更したときにアプリケーションを再起動する必要があります。スタックをクリアすることは、バックエンドのサービスコールをキャンセルしないので役に立ちません。私は申請プロセス自体を殺したい。私は使用していますアプリケーション内からAndroidアプリケーションを再起動する方法

Process.killProcess(Process.myPid()); 

それは私のアプリケーションを殺すために動作します。しかし、私は必要なのは、アプリケーションを再起動することです。手段はプロセスを停止し、新しいプロセスをトリガーするので、アプリケーションは再び新鮮になります。

これを行う方法はありますか?

ありがとうございます。

+0

これはテスト目的のために、またはその何かあれば必要とされている場合、私は思ったんだけどあなたはライブアプリで行う必要がありますか? – jcollum

答えて

4

Androidはこれを行うようには設計されておらず、これは「要件」ではありません。これは実装です。要件は何ですか?再起動せずに設定の変更を処理するようにアプリを設計できないのはなぜですか?それは非常に貧しい解決策のようです。

+0

私はいくつかのテスト環境を持ち、環境固有のサーバーとの接続を確立するための固有のプロパティを持っています。ですから、私たちが環境を切り替えるときには、新しいプロパティでアプリケーション全体を再起動する必要があります。 – AKh

+0

これは、コードまたはプロダクションコードをテストするためですか?それがテストのためのものならば、確かに進んでプロセスを終了してください。おそらくテストコードで再起動することができます。 – Falmarri

+0

私は、デバイスが20分以上アイドル状態になっていた場合、タイムアウトしていたため、新しいアプリケーションを再確立するためにHTTP接続をリセットします。それで、私たちはサーバに接続するために新しい接続を再確立するためにアプリを再起動したがっています。 – AKh

2

アプリケーションを再起動できるようにOSを設計することは、非常に悪い考えのようです。 Android OSはのメモリを解放するプロセスを終了する必要があります。 - アプリケーションが突然再起動する可能性がある場合は、解放されたメモリが再び使用されます。私はFalmarriに同意します。なぜあなたのアプリがその場で嗜好の変化に対処できないのかを調べる必要があります。

+0

私はFalmarriに詳細な要求をしました。あなたはそれを見て、それができる方法があるかどうかを見てください。しかし、とにかく、アプリケーション内からアプリケーションを再起動する必要があります。これは確かであり、この要求は変更できません。 – AKh

+0

これは本質的にQAプロセスをスピードアップする方法ですか? – jcollum

+0

アプリケーションの要件を決めることはできません。例えば、店のディスプレイ上のタブレットは、映画をノンストップで再生している。顧客がAndroidのホーム画面に到達すると、アプリはすぐに再起動します。 – Yar

5

これは、おそらくテスト環境の外で行う必要があるものではありません。

1)非常に近い将来にいくつかの時間にアラームを設定し、

2あなたのプロセスを殺す)何か他のもの(おそらく小さなネイティブプロセスまたはシェルを起動します、2つのアイデアを言っ

スクリプト)あなたの死を検出してから、あなたを再起動します。

あなたは自分自身を開始してからすばやく死ぬことを試みることもできますが、これは実装によっては競合状態になる可能性があります。/procからバインダーfdを取得してネイティブコードで邪悪なことをした場合、ioctlからの復帰時にアプリケーションがクラッシュするような方法でインテントを起動する可能性があります...

0

ここにアイデア:

には、残りのコンポーネント(アクティビティ、サービスなど)とは異なるプロセスがあります。

アプリを再起動するには、このサービスを呼び出すと、アプリの他のコンポーネントのプロセスを強制終了してから、行きたいアクティビティにインテントを送信します。

これは単なるアイデアです。テストしたことはありません。それがうまくいくかどうか教えてください。本当にうまくいけば答えを含めるように質問を更新してください。

2

あなたは、アプリケーションがこのコードを使用し、再起動し、プロセスを強制終了して行われているので:

Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName()); 
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(i); 
+0

良い解決策!!! –

1

あなたが本当に現在のプロセスのキルを含むあなたの活動を再開したい場合は、コードを次してみてください。それをHelperClassまたは必要な場所に置きます。

public static void doRestart(Context c) { 
     try { 
      //check if the context is given 
      if (c != null) { 
       //fetch the packagemanager so we can get the default launch activity 
       // (you can replace this intent with any other activity if you want 
       PackageManager pm = c.getPackageManager(); 
       //check if we got the PackageManager 
       if (pm != null) { 
        //create the intent with the default start activity for your application 
        Intent mStartActivity = pm.getLaunchIntentForPackage(
          c.getPackageName() 
        ); 
        if (mStartActivity != null) { 
         mStartActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
         //create a pending intent so the application is restarted after System.exit(0) was called. 
         // We use an AlarmManager to call this intent in 100ms 
         int mPendingIntentId = 223344; 
         PendingIntent mPendingIntent = PendingIntent 
           .getActivity(c, mPendingIntentId, mStartActivity, 
             PendingIntent.FLAG_CANCEL_CURRENT); 
         AlarmManager mgr = (AlarmManager) c.getSystemService(Context.ALARM_SERVICE); 
         mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent); 
         //kill the application 
         System.exit(0); 
        } else { 
         Log.e(TAG, "Was not able to restart application, mStartActivity null"); 
        } 
       } else { 
        Log.e(TAG, "Was not able to restart application, PM null"); 
       } 
      } else { 
       Log.e(TAG, "Was not able to restart application, Context null"); 
      } 
     } catch (Exception ex) { 
      Log.e(TAG, "Was not able to restart application"); 
     } 
    } 

これは、jniクラスとすべての静的インスタンスも再初期化します。

0

これは、デバイスの制御権を持つエンタープライズプロジェクトの場合、最初のアプリケーションのウォッチドッグとして機能する2番目のアプリケーションを簡単にインストールできます。私のクライアントの1人は、このようなウォッチドッグアプリケーションを使用して夜間のアプリケーションの再起動(奇妙で非技術的な理由による)やセルフサービス(非Playストア)アプリケーションの更新の確認やインストールなどを処理します。

しかし、あなたが本当にあなたのアプリの中からそれを望んでいた場合は、(上記のあなたのkillプロセスを含む)は、次のことが可能です。

Process.killProcess(Process.myPid()); 
AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); 
am.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 500 /* half a second*/, 
     PendingIntent.getActivity(this, 0, new Intent(this, this.getClass()), 
           Intent.FLAG_ACTIVITY_NEW_TASK)); 
関連する問題