Как получить контекст моей деятельности?
Я действительно не понимаю, как все это работает на самом деле, так что если у меня есть какой-то класс A
что нужен контекст класс B
которая расширяет Activity
, как мне получить этот контекст?
Я ищу более эффективный способ, чем предоставление контекста в качестве параметра классу A
конструктор. Например, если класс A
будет иметь миллионы экземпляров, то мы в конечном итоге будет иметь миллионы избыточных указатель на Context
в то время как мы должны быть в состоянии как-то иметь только один где-то и функцию геттера...
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. На самом деле, в зависимости от для чего вам нужен контекст, вы даже можете использовать контекст .Я бы предложил чтение в этой статье о контексте, чтобы лучше понять, какой контекст вам нужен.