如何在不违反 DRY 原则的情况下从多个活动开始一个 Activity?

How to start One Activity from Multiple Activities without violating the DRY Principle?

我正在开发一个 Android 应用程序,其中一些 Activity 可能从多个 Activity 开始,我知道如何使用 Intents 在 Activity 之间移动。我只是在为如何在不违反 DRY(不要重复自己)原则的情况下编写代码而苦苦挣扎。

代码如下所示,其中重复了从两个不同活动开始相同 Activity 的代码:

MainActivity.java开始SignInActivity.java

public class MainActivity extends AppCompatActivity {
private Button mSignUpButton;
private Button mSignInButton;

@Override
protected void onCreate(Bundle savedInstanceState) {
    setTheme(R.style.AppTheme_MainActivity);

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mSignUpButton = findViewById(R.id.sign_up_button);
    mSignInButton = findViewById(R.id.sign_in_button);

    mSignUpButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startSignUp();
        }
    });
    mSignInButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startSignIn();
        }
    });
}

private void startSignUp() {
    Intent signUpIntent = new Intent(this, SignUpActivity.class);
    startActivity(signUpIntent);
}

private void startSignIn() {
    Intent signInIntent = new Intent(this, SignInActivity.class);
    startActivity(signInIntent);
    }    
}

SignUpActivity.java开始SignInActivity.java

public class SignUpActivity extends AppCompatActivity {
private Button mSignInButton;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sign_up);

    mSignInButton = findViewById(R.id.sign_in_button);
    mSignInButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startSignIn();
        }
    });
}

private void startSignIn() {
    Intent signInIntent = new Intent(this, SignInActivity.class);
    startActivity(signInIntent);
    }
}

首先-不要崇拜DRY。这是一个经验法则,好的编程并不是全部。

其次-通常我为此所做的是

class SignInIntent extends Activity {
    public static Intent createIntent(Context context, parameters) {
        Intent intent = new Intent(context, SignInIntent.class);
        //Pass parameters here
        return intent;
    }
}

class SomeOtherActivity extends Activity {
    public void someFunc() {
        startActivity(SignInIntent.createIntent(this, params);
    }
}

我通常有 return 一个意图,而不是只是启动 activity 以防他们出于某种原因想要等待。通过这种方式,您还可以在 SignInActivity 中保留有关需要哪些参数及其名称的所有知识。

我对 DRY 原则一无所知,但是在阅读此 answer 时,我了解了 DRY 原则背后的想法,在考虑您的问题解决方案时,我得到了创建 util class 的想法具有在您想要的活动之间导航的方法:

public class NavigationUtils{
public static void navigate(Context source, Class<?> destination){
            Intent intent = new Intent(source, destination);
            source.startActivity(intent);
        }
}

希望这个回答对您有所帮助。

一个好的考虑是让 BaseActivity 包含常用函数。

public class BaseActivity extends AppCompatActivity { 


public void startActivity(Class<?> mClass, Bundle extras){
    Intent intent = new Intent(this, mClass);
    intent.putExtras(extras);
    startActivity(intent);
}

public void startActivity(Class<?> mClass){
    Intent intent = new Intent(this, mClass);
    startActivity(intent);
}
}

public class SignUpActivity extends BaseActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sign_up);

    mSignInButton = findViewById(R.id.sign_in_button);
    mSignInButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(SignInActivity.class);
        }
    });
  }
}