4

我正在学习并热爱 Java 和 Android,但还有很长的路要走。我认为这是一个最佳实践问题。在我的 Android 活动中,我有 6 个课程。其中有几个正在调用我从另一个类中复制的方法。当我可以从另一个类中调用它们时,重复这些方法似乎是多余的。我也认为在一个类中维护它们会更容易。(可能是主要活动?)我的问题是:从多个类调用相同方法的最佳实践是什么?例如,假设我的课程是:

主活动 GameSelector Game1Home Game1

我有一些在每个班级都相同的方法。让我们称它们为 getPrefs() 和 setPrefs()。我不会将任何东西传入或传出它们。他们应该去哪个班级,我如何从另一个班级打电话给他们?

编辑 - 感谢一些非常有用的答案,我有一个功能齐全的配置类,我的其他 6 个类看起来更干净!这将非常容易维护,并且我在制作过程中学到了一些很棒的建议。我在这里发布我完成的课程,以防它可以帮助其他人。您可以像这样从其他类中调用方法:

Configurations.getPrefs(this);

并引用您在配置文件中定义为全局的静态变量,如下所示:

Configurations.buttonClicked.start();

配置.java:

public class Configurations extends Activity {
static MediaPlayer buttonClicked;
static MediaPlayer instructionsAudio;
static MediaPlayer messageAudio;
static MediaPlayer correctNum_sound;
static MediaPlayer incNuma_sound;
static MediaPlayer incNumb_sound;
static String storeChildsName;
static String storeRequestedRange;
static String storeVoiceChoice;
static Intent i;


public static void setupPrefs(final Activity a) {
    ImageButton settingsClicked = ((ImageButton) a.findViewById(R.id.prefButton));
    settingsClicked.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                ImageView settingsClicked = ((ImageView) a.findViewById(R.id.prefButton));
                    settingsClicked.setImageResource(R.drawable.settings_button_clicked);
                buttonClicked = MediaPlayer.create(a, R.raw.click);
                    buttonClicked.start();

                    Intent settingsActivity = new Intent(a.getBaseContext(),
                                    Preferences.class);
                    a.startActivity(settingsActivity);
            }
    });
}
public static void getPrefs(final Activity a) {
    // Get the xml/preferences.xml preferences
    SharedPreferences prefs = PreferenceManager
                    .getDefaultSharedPreferences(a.getBaseContext());
    storeChildsName = prefs.getString("editTextPref",
                    "Friend");
    storeRequestedRange = prefs.getString("listPref", "3");
    storeVoiceChoice = prefs.getString("voices", "1");
}

public static void setupMusicToggle(final Activity a) {
    i=new Intent(a, MyMusicService.class);
       final ToggleButton togglebutton =(ToggleButton)a.findViewById(R.id.music_toggle);
      togglebutton.setOnClickListener(new OnClickListener() {  
          public void onClick(View v) {   
              // Perform action on clicks    
              if (togglebutton.isChecked()) {   
                  Toast.makeText(a, "Music on.", Toast.LENGTH_SHORT).show();  
                  a.startService(i);  
              } else {   
                  a.stopService(i);
                  Toast.makeText(a, "Music off.", Toast.LENGTH_SHORT).show(); 
                      }    }}); 
}

public static void returnHome(View view, Activity a) {
    ImageView homeClicked = (ImageView) a.findViewById(R.id.home);
    homeClicked.setImageResource(R.drawable.homebuttonclicked);
    buttonClicked = MediaPlayer.create(a, R.raw.click);
    buttonClicked.start();
    Intent intent = new Intent(a, GameSelector.class);
    a.startActivity(intent);
}

public static void releaseMP(Activity a) {
    if (buttonClicked != null) {
        buttonClicked.stop();
        buttonClicked.release();}
        if (instructionsAudio != null) {
            instructionsAudio.stop();
            instructionsAudio.release();}
        if (messageAudio != null) {
            messageAudio.stop();
            messageAudio.release();
        }
        if (correctNum_sound != null){
            correctNum_sound.stop();
            correctNum_sound.release();
        }
        if (incNuma_sound != null) {
            incNumb_sound.stop();
            incNuma_sound.release();
        }
        if (incNumb_sound !=null) {
            incNumb_sound.stop();
            incNumb_sound.release();
        }
}

public static boolean isMyServiceRunning(Activity a) {
    ActivityManager manager = (ActivityManager) a.getSystemService(Context.ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if (MyMusicService.class.getName().equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;
}

}

希望这对某人有帮助,就像对我有帮助一样!

PS - 如果您发现此代码有任何改进空间,请分享!我有很多东西要学=)

4

4 回答 4

7

有几种方法可以共享代码 - 你可以通过

  1. 定义一个“助手”类,并将你的static方法添加到它,
  2. 定义一个基类(通常是一个抽象基类)并将你的方法添加到它,
  3. 定义一个非静态类,并在每个需要共享代码的类中嵌入该类的实例;类还可以共享对公共实例的引用。

很难说哪种方法更合适,但从方法名称看来,您计划获取和设置首选项。在这种情况下,带有共享实例的#1 或#3 通常是最合适的。

于 2013-08-13T02:15:26.877 回答
1

这取决于每种方法的作用。顾名思义,getPrefs()看起来像是设置某种偏好。在这种情况下,我个人所做的是创建一个类Configuration并创建一个所有类共享的单例实例。

Android 与通常的 Java 略有不同。
在“通常的”Java 中,实例化对象,引用它们,然后调用它们的方法。
在 Android 中,您的大多数方法都定义在ActivityFragmentDialogFragment等中,并且您无法控制实例化它们。那些定义的方法只能在它们自己内部调用,除非声明static

所以,检查你的设计,看看这些方法做了什么,并检查你是否可以用它们制作一个不同的类 :)
希望它有所帮助。

于 2013-08-13T02:14:45.187 回答
1

这完全取决于您定义的类和方法的唯一目的。

如果您需要在许多活动中使用太多方法,那么一种选择是;

  1. 定义一个单独的辅助类并在那里实现这些方法。将它们包含在您所需的所有课程中。
  2. 继承或接口将是第二种选择。
于 2013-08-13T02:17:08.563 回答
1

我所做的是创建一个Activity扩展 Android API 的Activity类(或支持库的FragmentActivity类)的抽象类:

public abstract class Activity extends android.app.Activity { //or extends FragmentActivity
//put your common stuff here
}

类似的建议会要求您为此类命名BaseActivity,但我更喜欢这个名称,Activity因为它与 Android 系统同步。

我所有的活动都将从这个抽象类扩展:

//GameActivity.java
public class GameActivity extends Activity {
}

//OptionsActivity.java
public class OptionsActivity extends Activity {
}

我还将这个抽象Activity类(和其他一些好东西)保存在一个库项目中,这样我就可以为所有常见的东西提供一个单一的基础,而我所有的其他项目都会简单地将它包含为一个库(Project Properties > Android > Libraries > Add) . 但当然,您的开发需求可能与此模型不同。

Java 开发的额外提示:

  • 始终从最严格的访问修饰符 ( private) 开始,当您需要更多访问权限时更改为更宽松的访问修饰符(默认 > protected> public)。
  • 如果一个方法不使用任何非静态的东西,一定要让它成为一个static方法。这样,您不必实例化对象只是为了调用其类中的方法。
  • 除非您确定需要直接访问并且不会引入错误机会,否则对成员字段使用 getter 和 setter。
  • 当您需要显示原始类型 ( )java.lang.Integer的“未知”或“无效”状态时,请使用包装类。int
于 2013-08-13T02:59:54.543 回答