Как получить свой контекст активности?
Я действительно не понимаю, как все это работает, поэтому, если у меня есть класс A
, которому нужен контекст класса B
, который расширяет Activity
, как мне получить этот контекст
Я ищу более эффективный способ, дающий контекст как параметр конструктору class A
, так как для exsmple, если класс A
будет иметь миллионы экземпляров, тогда мы получим миллионы избыточных указатель на Context
, в то время как мы должны как-то иметь только одну и функцию геттера...
Ответы
Ответ 1
Вы можете использовать класс Application
(открытый класс в пакете android.application), то есть:
Базовый класс для тех, кто должен поддерживать глобальное состояние приложения. Вы можете предоставить свою собственную реализацию, указав ее имя в своем Тег 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;
}
...
}
В вашем манифесте:
<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);
...
}
...
}
В классе A:
Context c = App.getContext();
Примечание:
Как правило, нет необходимости в подклассе Application. В большинстве случаев, статические синглеты могут обеспечивать такую же функциональность в более модульной путь. Если ваш singleton нуждается в глобальном контексте (например, для регистрации широковещательные приемники), функция для ее получения может быть предоставлена Контекст, который внутренне использует Context.getApplicationContext(), когда сначала построим синглтон.
Ответ 2
Хорошо, я приведу небольшой пример того, как делать то, что вы просите
public class ClassB extends Activity
{
ClassA A1 = new ClassA(this); // for activity context
ClassA A2 = new ClassA(getApplicationContext()); // for application context.
}
Ответ 3
Лучшим и легким способом получить контекст активности является размещение .this
после имени Activity. Например: если ваше имя активности SecondActivity
, его контекст будет SecondActivity.this
Ответ 4
вы передаете контекст классу B в его конструкторе и убедитесь, что вы передаете getApplicationContext() вместо ActivityContext()
Ответ 5
Вы можете создать конструктор, используя параметр Context класса A, тогда вы можете использовать этот контекст.
Контекст c;
A (контекстный контекст) {
this.c = контекст
}
Из операции B вы создаете объект класса A с помощью этого конструктора и передаете getApplicationContext().
Ответ 6
Если вам нужен контекст A в B, вам нужно передать его в B, и вы можете это сделать, передав параметр Activity A как другой. Я не вижу большой проблемы с тем, что многие экземпляры A имеют свои собственные указатели на B, не уверен, что это будет даже большая часть накладных расходов.
Но если это проблема, существует возможность сохранить указатель на A как своего рода глобальный, avariable класса Application
, как предложил @hasanghaforian. Фактически, в зависимости от того, для чего вам нужен контекст, вы могли бы даже использовать контекст Application
.
Я бы предложил прочитать эту статью о контексте, чтобы лучше понять, какой контекст вам нужен.