1. ホーム
  2. android

[解決済み] 警告 Android のコンテキスト クラスを静的フィールドに配置しないでください。

2022-01-30 01:23:03

質問

Android Studioです。

Androidコンテキストクラスを静的フィールドに配置しないでください。 メモリリーク(とインスタントランが壊れる)。

そこで2つ質問です。
#1 どのように startService 静的メソッドから、コンテキストに静的変数を使用せずに?
#2 静的なメソッドから localBroadcast を送信するにはどうしたらいいですか(同じ)?

例を挙げます。

public static void log(int iLogLevel, String sRequest, String sData) {
    if(iLogLevel > 0) {

        Intent intent = new Intent(mContext, LogService.class);
        intent.putExtra("UPDATE_MAIN_ACTIVITY_VIEW", "UPDATE_MAIN_ACTIVITY_VIEW");
        mContext.startService(intent);
    }
}

または

        Intent intent = new Intent(MAIN_ACTIVITY_RECEIVER_INTENT);
        intent.putExtra(MAIN_ACTIVITY_REQUEST_FOR_UPDATE, sRequest));
        intent.putExtra(MAIN_ACTIVITY_DATA_FOR_VIEW, sData);
        intent.putExtra(MAIN_ACTIVITY_LOG_LEVEL, iLogLevel);
        LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);

を使用しない正しい方法は何でしょうか? mContext ?

注:私の主な疑問は、呼び出し元のメソッドが生きているクラスにコンテキストを渡す方法かもしれないと思います。

どのように解決するのですか?

単純にメソッドのパラメータとして渡すだけです。の静的なインスタンスを作成する意味はありません。 Context を起動するためだけのものです。 Intent .

メソッドはこのように表示されるはずです。

public static void log(int iLogLevel, String sRequest, String sData, Context ctx) {
    if(iLogLevel > 0) {

        Intent intent = new Intent(ctx, LogService.class);
        intent1.putExtra("UPDATE_MAIN_ACTIVITY_VIEW", "UPDATE_MAIN_ACTIVITY_VIEW");
        ctx.startService(intent);
    }
}

質問に対するコメントからの更新です。コンテキストを開始するアクティビティから(コンストラクタのパラメータやメソッドのパラメータを介して)、必要な時点までカスケードします。