Лучшая практика передачи контекста в классы без активности?

Итак, мое первое основное приложение почти закодировано, и я делаю оптимизацию в своем коде. Приложение прекрасно работает, но я не уверен в том, как передать этот контекст другим классам. Я не хочу делать это неправильно. Я наткнулся на статьи и вопросы здесь, в Stackoverflow о контекстах, и это правильный способ передать его неактивным классам. Я также прочитал документацию, но, будучи финном, сложная технология говорит еще труднее понять.

Итак, простой вопрос. Правильно ли мой способ передачи моего основного контекста активности другим (вспомогательным) классам? Если нет, где я могу больше узнать о лучшей практике в этих ситуациях.

Например: MainActivity.java

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle sis){
        super(sis);
        new Helper(MyActivity.this).makeMyAppAwesome();
    }
}

Helper.java

public class Helper {
    Context context;
    Helper(Context ctx){
        this.context = ctx;
    }

    public void makeMyAppAwesome(){
        makeBaconAndEggsWithMeltedCheese(context);
    }
}

Это нормально? Было бы неплохо, если бы кто-то мог предоставить легко читаемую статью с примерами по этому вопросу.

Ответ 1

Вы можете сделать это, используя ContextWrapper, как описано здесь.

Например:

public class MyContextWrapper extends ContextWrapper {

    public MyContextWrapper(Context base) {
      super(base);
   }

    public void makeMyAppAwesome(){
        makeBaconAndEggsWithMeltedCheese(this);
    }
}

И вызовите класс non activity, как это из Activity

new MyContextWrapper(this);

Ответ 2

Вы также можете создать ссылку на статический экземпляр для вашего MainActivity, инициализированный в методе onCreate()

public class MainActivity extends AppCompatActivity {

    public static MainActivity mMainActivity;

    @Override
    private onCreate(Bundle savedInstanceState){

    //...

    mMainActivity = this;

    }
}

и вызовите контекст следующим образом:

MainActivity.mMainActivity;

или напишите метод getInstanceOf(), если он более четкий и/или вы предпочитаете использовать аксессор

MainActivity.getInstanceOf();

Эта стратегия может предоставить вам некоторую гибкость, если позже вы решите вызвать метод экземпляра, содержащийся в вашем основном действии, например:

MainActivity.mMainActivity.myInstanceMethod();

Просто предложение. Критика приветствуется и поощряется.