Android: повторное использование одного и того же объекта View в разных действиях (дело касается рекламных баннеров)

Я хочу повторно использовать один и тот же объект представления (а не класс представления, или файл xml, я имею в виду объект в памяти) в разных действиях.

Я почти сделал это. Дело в том, конечно, в контексте.

Я попытался использовать контекст приложения. Это почти сработало, но затем, когда я нажимаю на представление, я передаю между различными действиями, и пытаюсь запустить с него другое приложение (или ссылку), оно разбилось. (Я не помню точного сбоя, но я его выкопаю, если понадобится).

Я попытался с некоторой активностью, что я не прочь утечка один раз и предоставление его как контекста. Это сработало, на самом деле все сработало, пока я не стал получать странные исключения в ViewFlipper.

Мой вопрос в том, действительно ли это повторное использование, и как сделать это стабильным? У вас есть опыт?

Спасибо ДАЛЬШЕ заранее, Дэн

Я помню, что вы можете позволить себе утечка 1 активности, поскольку это единственное решение, которое я знаю: объявите статическое представление, скажем, myAdView в вашем первом действии (в котором вы запрашиваете объявление). Теперь вы можете рекламировать и удалять этот myAdView во всех транзакциях. Ofcource вам придется поддерживать отдельные LinearLayouts для рекламы ur в отдельных действиях, где мы добавим / удалим myAdView, например. Предположим, что вы переходите от действия A к B, а затем в A onPause удалите myAdView:

private LinearLayout layoutAd; layoutAd = (LinearLayout) findViewById(R.id.layout_ad); // from A's xml protected void onPause() { super.onPause(); layoutAd.removeView(FirstActivity.adBannerView); } 

И в B onResume добавьте тот же (FirstActivity) myAdView:

 private LinearLayout layoutAd; layoutAd = (LinearLayout) findViewById(R.id.layout_ad); // from B's xml protected void onResume() { super.onResume(); layoutAd.addView(FirstActivity.adBannerView); } 

Надеюсь, это решит вашу проблему в некоторой степени.

Почему вы не используете Фрагменты?

http://developer.android.com/guide/topics/fundamentals/fragments.html

Я думаю, что ваш прецедент подходит для этого.

Это действительно невозможно в том виде, который вы задаете. Представления в действии должны быть раздуты во время загрузки, копирование / ссылка на них в памяти вряд ли будет работать так, как вы этого хотите.

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

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

Обновить:

Поскольку вы раскрыли цель этого вопроса (перехватывая рекламу из сторонней библиотеки), я предлагаю вам сначала связаться с компанией и проверить условия использования. Если они разрешают использовать их службу, минуя код «Вид», они могут предоставить вам API более низкого уровня для отображения объявлений по своему усмотрению.

Если такое использование не разрешено, учитывайте тот факт, что они могут заблокировать ваш аккаунт (и удерживать платеж) за неправильное использование.

Если вы все еще хотите пойти дальше: НЕ ПРОПУСКИТЕ шаблоны Android UI, чтобы сделать эту работу. Извлеките изображения объявлений со сторонней библиотеки на стороне сервера (например, создайте простой хостинг Java Webapp с хранилищем кешей и REST API) и покажите объявления в своем приложении Android из этой службы «человек в середине». Однако я, конечно, не одобряю этот метод.

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

Я в том же случае, что и Данаил. Дело не в том, чтобы взломать рекламного провайдера, но если вы хотите показать баннер с помощью различных видов деятельности, лучше всего рекламировать рекламу, чтобы не перезагружать ее каждый раз, когда вы меняете активность, потому что вы делаете больше показов, поэтому вы CTR (Click Through Ratio) будет уменьшаться. Вы предпочтете перезагрузить баннер с установленным вами временем, независимо от изменений активности.

Я думаю, что правильный способ сделать это будет, как говорит NeTeInStEiN, использовать фрагменты. У вас может быть уникальная деятельность, состоящая из разных фрагментов. В одном из фрагментов, например внизу, у вас будет баннер, и вы загрузите его на самом деле один раз. Затем на большей площади наверху (скажем, мы на телефоне) вы поместите разные фрагменты, по одному за раз, что будет соответствовать вашим существующим действиям. Когда вы обычно «изменяете» действие, теперь вы просто измените «основной» фрагмент, но фрагмент баннера останется там неизменным.

Основная и большая проблема об этом подходе заключается в том, что вам нужно создать приложение таким образом с самого начала, потому что изменение модели приложения от нескольких видов деятельности до одного действия с несколькими фрагментами – это довольно большое изменение кода …:. (

Поэтому я понимаю, что для затрат на реализацию можно попытаться «переносить» представление из одного вида деятельности в другое. Но, как я видел в других ответах, это действительно не рекомендуется и неприятный способ …

Если вы хотите, чтобы переменная использовалась в нескольких действиях, лучше всего использовать их в отдельном классе (можно назвать константами или MyVars) в качестве статической переменной и использовать их в любом действии, которое вы хотите, как Constants.SavedVar или MyVars.SavedVar, как показано ниже, является примером кода.

 public class MyStaticVars { public static Context myContext; } // First Activity where you want to save a specific context MyStaticVars.myContext = ContextToBeSaved; // Any Other Activity where you want to reuse that context priviousContext = MyStaticVars.myContext;