1

Androidがライブラリプロジェクトを導入して以来、アプリをライブラリに変換して、適切な調整を加えた複数のバージョンを作成できるようにしています(たとえば、同じコードベースを使用する無料バージョンとプロバージョンですが、いくつか変更があります)。

最初は、ライブラリプロジェクトのコードがサブプロジェクトのフィールドにアクセスできるようにするのに問題がありました。言い換えれば、私の無料バージョンとプロバージョンにはそれぞれ、ライブラリプロジェクトが特定の機能を区別するために使用する、いくつかの定数を含むクラスがありました。

サブプロジェクトでは、ライブラリのメインアクティビティを拡張し、リフレクションを使用してライブラリ内のフィールドの値を変更する静的初期化ブロックを追加しました。

public class MyMainActivityProVersion extends MyMainActivity {

    public static final String TAG = Constants.APP_NAME + "/SubClass";

    static {
        try {
            ConstantsHelper.setConstants(Constants.class);
        } catch (Exception e) {
            Log.d(TAG, "--- Constants not initialised! ---");
            e.printStackTrace();
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
}

このコードでは、ConstantsHelperがライブラリにあり、サブプロジェクトからConstants.classを提供しています。これにより、ライブラリプロジェクトの定数が初期化されます。

私のアプローチは、1つの特定のユースケースを除いて、うまく機能します。アプリがしばらく使用されておらず、OSによって「停止」されている場合、ConstantsHelperの静的フィールドは忘れられます。

定数は(上記のように)メインアクティビティによってリセットされることになっていますが、OSが別のアクティビティを再開するため、メインアクティビティは起動されません。この結果、定数の初期化が忘れられ、再開されたアクティビティがライブラリ(サブプロジェクトの知識がない)にあるため、定数を再初期化できません。

ライブラリ内の他のアクティビティに、再開時にサブプロジェクトからコードを呼び出すように「指示」するにはどうすればよいですか?または、サブプロジェクトの一部のコードが履歴書ごとに呼び出されるようにする方法はありますか?

4

3 に答える 3

0

静的メンバーを介して2つのアクティビティ間でデータを共有しようとすることで、「不正行為」をしていると思います。これは、同じまたは関連するクラスローダーにある場合に機能します。ここで、Androidは個別のアクティビティに個別のクラスローダーを使用していると思いますが、子アクティビティは子クラスローダーにあります。したがって、ViewActivityたまたま親クラスローダーを調べて、親の統計を見ることができます。後で、親がいなくなったと思います。そのため、MyMainActivity次にアクセスしたときに子がローカルで再読み込みされ、希望どおりに初期化されません。(そうでない場合は、この説明のようなものです。)

もっと頑強な選択肢があると思います。APIを使用してLicenseChecker、アクティビティのライフサイクルとクラスローダーの詳細に依存するのではなく、無料バージョンか有料バージョンかを判断できます。他の種類の不正使用からあなたを保護するので、それはおそらくより良いでしょう。

于 2011-09-25T11:52:30.570 に答える
0

私はこの質問に対する良い答えを見つけられなかったのではないかと思います。私はおそらく、リフレクションのひどい使用を続けて、いくつかのハッキーな回避策を見つけます。

私は戻ってきて、少なくともこのページに来る他の人の利益のためにこれを解決しなかったことを指摘する必要があると感じました。

于 2011-10-31T10:42:02.527 に答える
0

これは、Androidリソースを使用して解決できます。基本的に、ライブラリプロジェクトのリソースxml値ファイルで定数を定義します(
例: "libproject" \ values \ constants.xml)

<resources xmlns:tools="http://schemas.android.com/tools">
   <bool name="const_free_version">false</bool>
   <string name="const_a_constant">pippo</bool>
</resources>

次に、サブプロジェクトで、別のリソースxml値ファイルを使用してlib-project値を再定義できます。
例: "sub project" \ values \ constants.xml

<resources xmlns:tools="http://schemas.android.com/tools">
   <bool name="const_free_version">true</bool>
</resources>

libプロジェクトコードでR.bool.const_free_versionを参照すると、サブプロジェクト定数値xmlに基づいて実際の値が取得されます。
libプロジェクトconstants.xmlで定義されているすべての値を再定義する必要はなく、サブプロジェクトで必要な値だけを再定義する必要があることに注意してください。

于 2015-06-25T07:38:02.560 に答える