Как получить контекст моей деятельности?


Я действительно не понимаю, как все это работает на самом деле, так что если у меня есть какой-то класс A что нужен контекст класс B которая расширяет Activity, как мне получить этот контекст?

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

7 56

7 ответов:

можно использовать Application класс (публичный класс В android.пакет приложений), то есть:

базовый класс для тех, кому необходимо поддерживать глобальное состояние приложения. Вы можете предоставить свою собственную реализацию, указав ее имя в своем AndroidManifest.тег XML, который приведет к тому, что класс чтобы быть создан для вас, когда процесс для вашего приложение / пакет создается.

использовать этот класс:

public class App extends Application {

    private static Context mContext;

    public static Context getContext() {
        return mContext;
    }

    public static void setContext(Context mContext) {
        this.mContext = mContext;
    }

    ...

}

In ваш манифест:

<application
        android:icon="..."
        android:label="..."
        android:name="com.example.yourmainpackagename.App" >
                       class that extends Application ^^^

В Упражнении B:

public class B extends Activity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sampleactivitylayout);

        App.setContext(this);
                  ...
        }
...
}

в:

Context c = App.getContext();

Примечание:

обычно нет необходимости в применении подкласс. В большинстве ситуаций, статические синглеты могут обеспечить такую же функциональность в более модульном путь. Если ваш синглтон нуждается в глобальном контексте (например, для регистрации приемники широковещания), функция для того чтобы получить его можно дать а Контекст, который внутренне использует контекст.getApplicationContext (), когда сначала строим синглтон.

Ок, я приведу небольшой пример о том, как сделать то, что вы просите

public class ClassB extends Activity
{

 ClassA A1 = new ClassA(this); // for activity context

 ClassA A2 = new ClassA(getApplicationContext());  // for application context. 

}

самый лучший и простой способ получить контекст деятельности ставит .this после названия действия. Например: если имя вашего действия SecondActivity, его контекст будет SecondActivity.this

вы передаете контекст классу B в его конструкторе и убедитесь, что вы передаете getApplicationContext () вместо activityContext ()

вы можете создать конструктор с помощью параметра Context класса A, то вы можете использовать этот контекст.

контексте c;

а(контекст){ этот.с=контекст }

из действия B вы создаете объект класса A, используя этот конструктор и передавая getApplicationContext ().

Если вам нужен контекст A в B, вам нужно передать его в B, и вы можете сделать это, передав Activity a в качестве параметра, как предлагали другие. Я не вижу большой проблемы в том, что многие экземпляры A имеют свои собственные указатели на B, не уверен, что это будет даже так много накладных расходов.

но если это проблема, возможность состоит в том, чтобы сохранить указатель на A как своего рода глобальный, доступный из Application класс, как предложил @hasanghaforian. На самом деле, в зависимости от для чего вам нужен контекст, вы даже можете использовать контекст .

Я бы предложил чтение в этой статье о контексте, чтобы лучше понять, какой контекст вам нужен.

в Котлине будет:

activity?.applicationContext?.let {
         it//<- you context
        }