最佳实践:子类或发送意图?

时间:2012-09-11 08:54:35

标签: android android-intent

我有两项活动几乎做同样的事情。唯一不同的是要解析的URL。

什么是关于Android开发的最佳做法,子类只是设置URL或通过意图发送URL?

public SuperActivity extends Activity{
    protected String pageUrl;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        [...lots of stuff...]
        super.onCreate(savedInstanceState);
    }
}

public SubActivityOne extends SuperActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        pageUrl = "http://urlOne.com"
        super.onCreate(savedInstanceState);
    }
}

public SubActivityTwo extends SuperActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        pageUrl = "http://urlTwo.com"
        super.onCreate(savedInstanceState);
    }
}

public SuperActivity extends Activity{
    private String pageUrl;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Bundle extras = getIntent().getExtras(); 
        pageUrl = extras.getString("intent_key_url");
        [...lots of stuff...]
        super.onCreate(savedInstanceState);
    }
}

4 个答案:

答案 0 :(得分:3)

  • 如果您有多个活动,它们共享相似的功能(和/或变量/方法) - >去分类。
  • 如果您只需要从调用活动中传递值,请使用intents(或者Static

答案 1 :(得分:2)

在你的情况下,我会进行子类化,但与你的做法略有不同。在onCreate中放置一些代码并不是绝对需要时,这是危险的。 (您可能会在层次结构中迷失,而不是按正确的顺序调用您想要调用的内容)我会使用覆盖方法而不是变量。那样做:

public abstract SuperActivity extends Activity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        [...lots of stuff...]
        // instead of using pageUrl, use a method when you need it: pageUrl()
        super.onCreate(savedInstanceState);
    }

    protected abstract String pageUrl();
}

你的子活动看起来像:(这里只显示一个)

public SubActivityOne extends SuperActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    protected String pageUrl() {
        return "http://urlOne.com";
    }
}

意图方式也很好,但是如果你以后希望在子活动中添加更多差异,它可能会变得复杂。对于子类,它非常灵活。

答案 2 :(得分:1)

为避免重复代码(这主要是好事),请创建基本活动类(将其设为abstract)并将公共代码放在那里。然后让你的“真实”活动扩展基类。所以选项“A”就是这样。

答案 3 :(得分:1)

第三个选项是创建一个回调接口,并让你想要实现它的任何类。像“PageUrlProvider”

这样的东西
public interface PageUrlProvider
{
    String getPageURL();
}

然后具体实现

public MyActivity extends Activity implements PageUrlProvider 
{
    private String pageUrl ="http://example.com/";

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        String myURL = getPageURL();
        super.onCreate(savedInstanceState);
    }
    @Override
    public String getPageURL() 
    {
        return pageUrl;
    }

}

您选择哪个选项很大程度上取决于您要完成的任务。但是这个选项提供了很大的灵活性。