Как получить контекст активности в неактивном классе android?

у меня есть класс Activity, из которого я передаю некоторую информацию вспомогательному классу(неактивному). В вспомогательном классе я хочу использовать getSharedPreferences(). Но я не могу использовать его, поскольку он требует контекста активности.

вот мой код:

  class myActivity extends Activity
    {
    @Override
        protected void onCreate(Bundle savedInstanceState) 
        {

            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.home);


            Info = new Authenticate().execute(ContentString).get();
            ItemsStore.SetItems(Info);

        }

    }

class ItemsStore
{
  public void SetItems(Information info)
 {
  SharedPreferences  localSettings = mContext.getSharedPreferences("FileName", Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = localSettings.edit();
            editor.putString("Url", info.Url);
            editor.putString("Email", info.Email);
 }
}

есть идеи, как этого можно достичь?

4 ответов


попробуйте это:

class myActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {

        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home);


        Info = new Authenticate().execute(ContentString).get();
        ItemsStore.SetItems(Info, getApplicationContext());

    }

}

class ItemsStore
{
   public void SetItems(Information info, Context mContext)
   {
            SharedPreferences  localSettings = mContext.getSharedPreferences("FileName",
            Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = localSettings.edit();
            editor.putString("Url", info.Url);
            editor.putString("Email", info.Email);
   }
}

вместо создания утечек памяти (удерживая контекст действия в поле класса) вы можете попробовать это решение, потому что общие настройки не нуждаются в контексте действия, но ... любой контекст :) для длинных живых объектов вы должны использовать ApplicationContext.

создать класс приложения:

public class MySuperAppApplication extends Application {
    private static Application instance;

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }

    public static Context getContext() {
        return instance.getApplicationContext();
    }
}

зарегистрируйте его в manifest

<application
    ...
    android:name=".MySuperAppApplication" >
    ...
</application>

тогда вы можете сделать что-то вроде этого

public void persistItems(Information info) {
    Context context = MySuperAppApplication.getContext();
    SharedPreferences sharedPreferences = context.getSharedPreferences("urlPersistencePreferences", Context.MODE_PRIVATE);
    sharedPreferences.edit()
        .putString("Url", info.Url)
        .putString("Email", info.Email);
}

подпись метода выглядит лучше, потому что она делает не нужен внешний контекст. Это можно скрыть под некоторым интерфейсом. Вы также можете легко использовать его для внедрения зависимостей.

HTH


вам нужно передать контекст конструктору класса non activity

ItemsStore itemstore = new ItemStore(myActivity.this);
itemstore.SetItems(Info);

затем

Context mContext;
public ItemsStore (Context context)
{
       mContext =context;
}

Теперь mContext может использоваться как контекст действия.

Примечание: не сохраняйте длительные ссылки на контекст-активность (ссылка на активность должна иметь тот же жизненный цикл, что и сама активность)


напишите публичную функцию в своей деятельности. При создании экземпляра вспомогательного класса в классе Activity передайте контекст activity в конструкторе.

затем из вашего вспомогательного класса, используя контекст activity, вызовите функцию public в классе activity.