3

同じアクティビティ (全員が共有するライブラリ プロジェクト内) を使用して、一度に1 つのアプリケーションしか実行できないように、アプリケーションのファミリを制限しようとしています。

その方法を学ぼうとした最初のラウンドで、私は次のことを学びました。

  1. android:launchMode="singleTask" はうまくいきません。
  2. setVisible(true/false)それぞれ onResume()/onPause() でアプリケーションが実行されているかどうかを確認する最良の方法です。しかし、2 番目のインスタンスが 1 番目のインスタンスが実行中であることを認識したら、どうすればよいでしょうか?

そのため、 Activity.getApplication()をオーバーライドして共有静的を返すことで、常に同じインスタンスを返すことで、システムをだますことを考えています。

public class MyApplication extends Application 
{   
    private static MyApplication s_instance;

    public MyApplication()
    {
        s_instance = this;
    }

    public static MyApplication getApplication()
    {
        return s_instance;
    }
}

(アイデアの功績は@inazarukにあります)

しかし、前述の可視化ソリューションと同様に、これをどうすればよいでしょうか?

システム自体がgetApplication()を使用して、新しいインスタンスを起動するか、単にスタックの先頭に置くかを決定しますか? これは安全ですか?

答えが「いいえ」の場合、Activity.finish()を呼び出して、2 番目のアクティビティが開始されないようにすることはできますか? もしそうなら、どこでこれをしますか?

  1. Activity.onCreate ()にありますか?
  2. Activity.onResume() ?
  3. MyApplication() ? (コンストラクタ)
  4. より良い場所?
4

1 に答える 1

1

私は少し混乱しています。あなたはアプリケーションのファミリーと言っていますが、これらはどのようにパッケージ化されていますか? Android では、APK には 1 つのアプリケーションが含まれます。アプリケーションには固有のパッケージ名と固有のユーザー ID があり、独自のプロセスで実行されます。これは、2 つの別個のパッケージに 2 つのアプリケーションがある場合、それらは 2 つの別個のプロセスで実行されるため、getApplication() から静的インスタンスを返すことはまったく役に立たないことを意味します。

ここにあなたのために働くかもしれない考えがあります:

この共有ライブラリを使用するすべてのアプリケーションは、 Extraとして実行されているアプリケーションのパッケージ名を含むスティッキー インテントをブロードキャストできます。

共有ライブラリを使用するすべてのアプリケーションは、このスティッキー インテントのリスナーを登録できます。リスナーを取得すると、そのアプリケーション ( Extra内のアプリケーション) が現在実行されているかどうかを確認できます。そのアプリケーションが実行中の場合、実行を拒否する (または、ユーザーに警告し、実行する必要があるかどうかを尋ねるなど) 可能性があります。

あくまでも想像で、実際に試したことはありませんが、これでやりたいことができると思います。

于 2012-08-01T22:38:00.313 に答える