2011-01-18 1 views
4

Есть ли какой-либо способ в android для перехвата вызовов метода активности (только стандартные, например, onStart. OnCreate)? У меня есть много функциональных возможностей, которые должны присутствовать в каждом действии в моем приложении, и (поскольку он использует различные типы действий (Список, Предпочтения)), единственный способ сделать это - создать мои пользовательские расширения для каждого класса активности, которая сосет :(Активность перехватчика

PS Я использую roboguice, но так как Dalvik не поддерживает генерацию кода во время выполнения, я предполагаю, что это не поможет.

PSS Я думал об использовании AspectJ, но это слишком много это связано с трудностями, так как для этого требуется множество осложнений (ant's build.xml и весь этот мусор)

ответ

2

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

class MyActivityDelegate { 
    MyActivityDelegate(Activity a) {} 

    public void onCreate(Bundle savedInstanceState) {} 
    public void onDestroy() {} 
} 

class MyActivity extends ListActivity { 
    MyActivityDelegate commonStuff; 

    public MyActivity() { 
     commonStuff = MyActivityDelegate(this); 
    } 

    public onCreate(Bundle savedInstanceState) { 
     commonStuff.onCreate(savedInstanceState); 
     // ... 
    } 
} 

Это минимализирует хлопоты и факторизует все распространенные методы и членов вашей деятельности. Другой способ сделать это состоит в subclasse всех XXXActivty классов API по :(

+0

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

5

roboguice 1.1.1 релиза включает в себя некоторые базовую поддержку событий для компонентов, вводимых в контекст см. http://code.google.com/p/roboguice/wiki/Events для получения дополнительной информации.

Для примера :..

@ContextScoped 
public class MyObserver { 
    void handleOnCreate(@Observes OnCreatedEvent e) { 
    Log.i("MyTag", "onCreated"); 
    } 
} 

public class MyActivity extends RoboActivity { 
    @Inject MyObserver observer; // injecting the component here will cause auto-wiring of the handleOnCreate method in the component. 

    protected void onCreate(Bundle state) { 
    super.onCreate(state); /* observer.handleOnCreate() will be invoked here */ 
    } 
}