トップへ戻る
C++、C#、VC、JAVA、Androidプログラミングを初歩的なことから書いていきます。

プログラムの多重起動と連続起動について

Android用のプログラムを書いていると、このプログラムは多重起動してほしくない、連続で起動-終了を繰り返したら問題があるといったことが発生するかもしれません。 そこで、今回は多重起動を禁止する方法と、連続で起動-終了を繰り返した動作に対する処理方法(間違いなく最適ではない)について記述します。
  • 多重起動の禁止

  • こちらは簡単で、AndroidManifestのactivity内に以下のように記述します。
    android:launchMode="singleTask"
    
    他にも、以下のような起動モードがあります。
    起動モードIntentで呼ばれた時の
    Activityタスクの所持場所
    複数生成できるかインスタンスのタスクに
    他のアクティビティを内包できるか
    新規にインスタンスを
    生成した時の振る舞い
    defaultstartActivity()を呼び出したタスク複数回インスタンス化可能複数のアクティビティを割り当て可能新しいインスタンスに応答する時には
    必ず新しいインスタンスを生成
    singleTopstartActivity()を呼び出したタスク複数回インスタンス化可複数のアクティビティを割り当て可能クラスの既存のインスタンスが対象タスクのアクティビティスタックの
    最上位にあれば、それを再利用して新しいインスタンスを処理。
    それ以外は新しいインスタンスを生成
    singleTaskアクティビティが常にタスクのルートアクティビティになる。
    他のタスクの一部として起動しない
    インスタンスは1つに制限。
    アクティビティはタスクのルート
    複数のアクティビティを割り当て可能インスタンスは常に新しいインテントで起動
    singleInstanceアクティビティが常にタスクのルートアクティビティになる。
    他のタスクの一部として起動しない
    インスタンスは1つに制限。
    アクティビティはタスクのルート
    アクティビティは、そのタスク内の唯一の
    アクティビティとして単独で動作
    インスタンスは常に新しいインテントで起動

  • 連続起動の禁止

  • こちらはどうすればうまくいくか悩みました。結論から言えば、何かしら処理に失敗したら、その失敗した部分を初期化し、失敗した趣旨をユーザにトースト等で伝え、終了(finish())させるだけです。
    私の場合は、スレッドを大量に回し、そのスレッドの1つでソケット通信をしていますが、連続で起動-終了を繰り返すと、サーバと通信が確立しているのにも関わらず(そのような判定になっていた)、null値が入っていました。 その後は何度起動させてもnull値で、更に静的領域で宣言した変数も初期化されず、最後に正しく起動した状態のままとなっていました。あるスレッドが起動しっぱなしではないのかと疑いましたが、連続で起動-終了させないと この現象には陥らないため(ガーベッジコレクションのおかげ?)、終了処理、判定を一括で行うクラスを作り、そこで例外処理を記述するようにし、ようやくアプリケーションが停止することがなくなりました。
    考察ですが、onDestoryが端末の画面から消えてすぐに実行するという保証がないそうなので、ここらへんが関係あるのかなーと思いました。
    inserted by FC2 system