web-dev-qa-db-ja.com

単一のアクティビティで構成される私のAndroidアプリケーションの複数のインスタンスを防止します

単一のActivityで構成されるAndroidアプリケーションがあります。アプリケーションのインスタンス(== Activity)が1つだけ存在することをどのように保証できますか?一定の時間内に?アプリのアイコンを複数回クリックして、アプリの複数のインスタンスを開くことに成功した状況になりました(これは常に再現されるわけではありません)。

16
Daniel L.

マニフェストを次のように変更します。

    <activity
        Android:name="com.yourpackage.YourActivity"
        Android:label="@string/app_name"
        Android:launchMode="singleTask" >
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

Android:launchMode="singleTask"を含めると、アクティビティの複数のインスタンスを同時に起動することはできなくなります。 詳細についてはアクティビティドキュメントを参照してください。

26
FoamyGuy

受け入れられた答えはその目的を果たしますが、これを行うための最良の方法ではありません。

代わりに、次のように各アクティビティ内で静的なAtomicIntegerを使用することをお勧めします。

//create a counter to count the number of instances of this activity
public static AtomicInteger activitiesLaunched = new AtomicInteger(0);

@Override
protected void onCreate(Bundle pSavedInstanceState) {

        //if launching will create more than one 
        //instance of this activity, bail out
        if (activitiesLaunched.incrementAndGet() > 1) { finish(); }

        super.onCreate(pSavedInstanceState);

}

@Override
protected void onDestroy() {

        //remove this activity from the counter
        activitiesLaunched.getAndDecrement();

        super.onDestroy();

}



それで、受け入れられた答えの何が問題になっていますか?

singleInstanceモードを使用してアクティビティを起動する必要があることを宣言すると、アクティビティとタスクのデフォルトの動作が混乱し始め、望ましくない影響が生じる可能性があります。

Android docs この動作は、必要な場合にのみ中断することをお勧めします(この場合はそうではありません)。

注意:ほとんどのアプリケーションは、アクティビティとタスクのデフォルトの動作を中断しないでください。アクティビティでデフォルトの動作を変更する必要があると判断した場合は、注意を払い、起動時および他のアクティビティやタスクから[戻る]ボタンを使用してアクティビティに戻るときに、アクティビティのユーザビリティをテストしてください。ユーザーの予想される動作と競合する可能性のあるナビゲーション動作を必ずテストしてください。

13
Hunter S

アプリのユーザーのメモリが不足していることがわかり、その理由を理解するのに苦労していました。そうしようとすると、アプリの複数のインスタンスを開くことができ、アイコン、ホーム、アイコン、ホームの順にクリックすることができました。最終的にアプリがクラッシュするまで、メモリ使用量がどんどん増えていきました。クラッシュする前に、[閉じる]メニューオプションをクリックすると、前のインスタンスが前面に表示されました。これは、アプリを起動したときと同じ回数発生します。

私の解決策は、マニフェストにAndroid:launchMode="singleInstance"を追加することでした。それ以来、複数のインスタンスを開いたり、アプリをクラッシュさせたりすることができませんでした。

0
Mr Chops