每个Activity的静态初始化程序(就像Fragment一样)

时间:2015-11-11 01:50:47

标签: android android-activity static-methods

我们鼓励在传递参数时,按Fragment使用静态初始值设定项(a.k.a。the newInstance() pattern)。在Activity的情况下,没有提到这种情况。每次我们要开始一项活动时,我们必须先创建一个Intent,如下所示:

public class FirstActivity extends Activity {
    ...
    Intent intent = new Intent(this, SecondActivity.class);
    startActivity(intent);
    ...
}

如果我们想传递一些参数,这会变得更加复杂,因为我们需要为每个参数命名,如下所示:

public class FirstActivity extends Activity {
    ...
    int age = 10;
    int count = 20;
    String message = "hello";

    Intent intent = new Intent(this, SecondActivity.class);
    intent.putExtra("Age", age);
    intent.putExtra("Count", count);
    intent.putExtra("Message", message);
    startActivity(intent);
    ...
}

在SecondActivity中我们应该使用相同的名称检索这些参数:

public class SecondActivity extends Activity {
    ...
    int mAge;
    int mCount;
    String mMessage;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        mAge = getIntent().getIntExtra("Age", 0);
        mCount = getIntent().getIntExtra("Count", 0);
        mMessage = getIntent().getStringExtra("Message");
    }
    ...
}

此外,我们使用了这些名称,"年龄","计数"和"消息"是硬编码的,容易出错。大多数情况下,我们使用一个名为IntentExtraKeys的辅助类,并使用该类中的名称,如下所示:

public class IntentExtraKeys{

    public static final String AGE_KEY = "age_key";
    public static final String COUNT_KEY = "count_key";
    public static final String MESSAGE_KEY = "message_key";
}

并在活动中:

public class FirstActivity extends Activity{

    ...
    intent.putExtra(IntentExtraKeys.AGE_KEY, age);
    ...
}

public class SecondActivity extends Activity{

    ...
    mAge = getIntent().getIntExtra(IntentExtraKeys.AGE_KEY, 0);
    ...
}

而不是这个,我们可以有类似下面的内容:

public class FirstActivity extends Activity{

    ....
    SecondActivity.startActivity(this, age, count, message);
    ...
}

public class SecondActivity extends Activity{
    ...
    private static final String AGE_KEY = "age_key";
    private static final String COUNT_KEY = "count_key";
    private static final String MESSAGE_KEY = "message_key";

    public static void startActivity(Context context, int age, int count, String message){

    Intent intent = new Intent(context, SecondActivity.class);
    intent.putExtra(AGE_KEY, age);
    intent.putExtra(COUNT_KEY, count);
    intent.putExtra(MESSAGE_KEY, message);
    context.startActivity(intent); 
    }
    ...
}

这样,每次我们想要开始活动时,我们都不会编写用于创建Intent的代码,如果我们要传递一些参数,我们就不需要给它们命名。只有我们开始的活动知道他们的名字,它看起来更清洁,就像在fragments中一样。

这是一个糟糕的设计吗?为什么这不常见?

2 个答案:

答案 0 :(得分:1)

静态初始化程序模式在片段中使用,因为即使您第一次自己实例化片段,默认构造函数必须存在,以便平台可以在重建活动时自行再次实例化它因为配置发生了变化。

另一方面,活动总是由系统实例化,它们不需要任何特殊的工厂方法或构造函数,以保持其作为意图导出的能力,供其他应用程序和系统本身使用;这就是静态初始化器对活动没有多大意义的原因。它们非常有效,如果你愿意,你可以使用它们,但它们可能会因为以各种稍微不同的方式执行相同功能的活动的自定义初始化代码而变得复杂,并且它们会产生错误的耦合感。

答案 1 :(得分:1)

对于片段

使用静态函数创建Fragment

有一些原因
  1. 有单点创建Fragment实例。这样可以确保多片段初始化具有相同的输入参数处理等等。

  2. 它可以帮助开发人员避免创建非静态嵌套片段。片段&活动必须是分离。

  3. 可以多次调用效用函数。例如:片段正在TabLayout,ViewPager中使用。

  4. 活动

    您可以像创建实用程序一样创建实用程序。没问题。很难说它是错误的代码或不常见的代码。

    如果您将使用多个函数或者Activity有输入参数。您可以像创建实用程序一样创建效用函数。