抽象类去除活动中的冗余代码

时间:2015-12-29 19:15:09

标签: java android oop android-activity abstract-class

我创建了一个抽象类来防止我的每个活动中出现冗余代码。

public abstract class MyGeneralizedActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }

        @Override
        public void attachBaseContext(Context newBase) {
            super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
        }
      //...
 }

这样做我很好:

public class MyActivity extends MyGeneralizedActivity{...}

但是现在我必须从MyActivity扩展FragmentActivity。这意味着我不能再从MyGeneralizedActivity延伸。

现在我想知道是否有可能建立一个通用的抽象结构来扩展我的所有活动。

修改
只需从MyGeneralizedActivity延长FragmentActivity即可解决我的问题。例如TabActivity会导致同样的问题。

更新
对于那些可能有兴趣在Android中解决同样问题的人,我找到了一个简单的解决方法。存在Application类,除其他外,还提供接口ActivityLifecycleCallbacks。它完全符合我的需要,允许我们拦截并为所有活动的重要事件添加一些价值。

您所要做的就是扩展Android Application类,并创建一个实现ActivityLifecycleCallbacks的私有类。
不要忘记在AndroidManifests文件中添加/重命名您的应用程序:

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

4 个答案:

答案 0 :(得分:1)

由于FragmentActivityMyGeneralizedActivity都是类而不是接口,因此无法创建属于两者的子类型的类型。

Java限制您使用单一继承,因此如果您依赖于分享两个类中包含的实现,那么您最好的选择就是依赖于组合。

例如:

public class MyActivity extends Activity { 
  FragmentActivity fragmentActivity;
  MyGeneralizedActivity myGeneralizedActivity;

  public MyActivity(FragmentActivity fragmentActivity, MyGeneralizedActivity myGeneralizedActivity) {
    this.fragmentActivity = fragmentActivity;
    this.myGeneralizedActivity = myGeneralizedActivity;
  }


  @Override
  protected void onCreate(Bundle savedInstanceState) {
    this.fragmentActivity.onCreate(savedInstanceState);
    this.myGeneralizedActivity.onCreate(savedInstanceState);
    //...
  }

  @Overridepublic void attachBaseContext(Context newBase) {
    this.fragmentActivity.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
    this.myGeneralizedActivity.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
    //...
  }

}

答案 1 :(得分:1)

这似乎是Decorator Pattern的一个问题。

意图

  • 动态地将附加职责附加到对象。装饰器为子类化提供了灵活的替代方法,以扩展功能。
  • 通过递归包装来对客户端指定的核心对象进行修饰。
  • 包装礼物,将其放入盒子中,然后包好盒子。

问题

您希望在运行时向各个对象添加行为或状态。继承是不可行的,因为它是静态的并且适用于整个类。

结构

规范形式: Decorator Pattern Diagram

特别考虑你的情况,因为Android API没有为Activity定义一个界面,我们可以跳过一些官僚主义,只是以(不是那么)快速和肮脏的方式来做:

abstract public class ActivityDecorator extends Activity {
    protected Activity original;

    public MyAcitvityDecorator(Activity original) {
        this.original = original;
    }

    protected void onCreate(Bundle savedInstanceState) {
        this.original.onCreate(savedInstanceState);
    }

    /* ... Because there is no better way of doing it in Java, you should do
     * this for every method in the Activity class: delegate the execution of 
     * the method to the original activity object.
     * Yes, there is A LOT of methods!
}

然后你必须创建一个具体的装饰器并覆盖到期方法:

class MyActivityDecorator extends ActivityDecorator {
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            this.original.onCreate(savedInstanceState);
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }

        @Override
        public void attachBaseContext(Context newBase) {
            this.original.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
        }
}

然后你可以像这样使用它:

Activity myActivity = new MyActivityDecorator(new Activity());

由于MyAcitvityDecoratorActivity的一个实例,因此您可以无缝地传递它。

您甚至可以链接装饰器并更改原始Activity对象,如下所示:

Activity myActivity = new MyActivityDecorator(
    new AnotherActivityDecorator(
        new TabActivity()
    )
);

答案 2 :(得分:0)

FragmentActivity source codeFragmentActivity扩展Activity课程。我想你应该试试看。

  

祝你好运。

答案 3 :(得分:0)

如果使用Java 8,您可以使用默认方法创建接口。然后,您可以通过这种方式实现多个接口并获得所需的结果。

详情请参阅:Interface with default methods vs Abstract class in Java 8