这是我的第一个项目,一个适用于基于Android的设备的Flashlight应用程序:

public class main extends Activity
{
    private static final byte MENU_EXIT = 0, MENU_ABOUT = 1;
    private static boolean FlashlightState;
    private static long BackPressed;
    private static ImageView Lamp;
    private Flashlight FLASHLIGHT = null;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.main);
        super.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        FlashlightState = false;
        Lamp = (ImageView) findViewById(R.id.imgVw_Lamp);
        FLASHLIGHT = new Flashlight(this.getApplicationContext());

        if (Flashlight.hasFlashlight) FLASHLIGHT.Open();

        Lamp.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View arg0)
            {
                Lamp.setEnabled(false);

                if (getSystemService(VIBRATOR_SERVICE) != null)
                {
                    AudioManager VibratorState = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
                    if (VibratorState.getRingerMode() != AudioManager.RINGER_MODE_SILENT)
                    {
                        Vibrator Switch = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                        Switch.vibrate(50);
                    }
                    VibratorState = null;
                }

                if (!FlashlightState) turnOnFlashlight();
                else turnOffFlashlight();

                Lamp.setEnabled(true);
                return;
            }
        });

        return;
    }

    @Override
    protected void onStart()
    {
        super.onStart();
        BackPressed = 0;

        if (Flashlight.hasFlashlight) FLASHLIGHT.Open();

        return;
    }

    @Override
    protected void onPause()
    {
        super.onPause();
        this.turnOffFlashlight();
        BackPressed = 0;

        if (Flashlight.hasFlashlight) FLASHLIGHT.Close();

        return;
    }

    @Override
    public void onBackPressed()
    {
        if ((BackPressed + 2000) > System.currentTimeMillis())
        {
            finish();
            this.onDestroy();
        }
        else
        {
            Toast.makeText(getApplicationContext(), getString(R.string.Exit_Message), Toast.LENGTH_SHORT).show();
            BackPressed = System.currentTimeMillis();
        }

        return;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        menu.add(Menu.NONE, MENU_EXIT, Menu.NONE, getString(R.string.Exit)).setIcon(android.R.drawable.ic_menu_close_clear_cancel);
        menu.add(Menu.NONE, MENU_ABOUT, Menu.NONE, getString(R.string.About)).setIcon(android.R.drawable.ic_menu_info_details);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        switch (item.getItemId())
        {
            case MENU_EXIT:
                finish();
                this.onDestroy();
            break;
            case MENU_ABOUT:
                this.showAboutBox();
            break;
        }

        return super.onOptionsItemSelected(item);
    }

    private final void showAboutBox()
    {
        AlertDialog.Builder AboutBox = new AlertDialog.Builder(this);
        AboutBox.setTitle(getString(R.string.About));
        AboutBox.setIcon(android.R.drawable.ic_dialog_info);
        AboutBox.setMessage("Name:\nVisionlight\n\nDescription:\nFlashlight application for Android based devices.\n\nVersion:\n1.0.0\n\nLanguages:\nEnglish/International, Persian, Arabic\n\nPlatform:\nAndroid +2.2.x(Froyo)\n\nPermissions:\nCamera, Flashlight, Vibrate, Wake Lock.\n\nUses-feature:\nCamera [NR], Flashlight [NR].\n\nProducer/Developer:\nYousha Aleayoub(Y.P.Y)\n\nLicense:\nBSD\n\nContact:\nYousha.A@Hotmail.com\n\nLink:\nhttp://yousha.blog.ir/");

        AboutBox.setNeutralButton(getString(R.string.Ok), new DialogInterface.OnClickListener()
        {
            @Override
            public void onClick(DialogInterface dialog, int which)
            {
                dialog.dismiss();
            }
        });

        AboutBox.create().show();
        return;
    }

    @Override
    protected void onDestroy()
    {
        super.onDestroy();
        this.turnOffFlashlight();

        if (Flashlight.hasFlashlight) FLASHLIGHT.Close();

        FLASHLIGHT = null;
        android.os.Process.killProcess(android.os.Process.myPid());
        return;
    }

    private final void turnOnFlashlight()
    {
        FlashlightState = true;
        Lamp.setImageResource(R.drawable.lamp_on);

        if (Flashlight.hasFlashlight)
        {
            FLASHLIGHT.On();
        }
        else
        {
            WindowManager.LayoutParams Layout = getWindow().getAttributes();
            Layout.screenBrightness = 1F;
            getWindow().setAttributes(Layout);
            findViewById(R.id.lnrLyt_Main).setBackgroundColor(Color.WHITE);
        }

        return;
    }

    private final void turnOffFlashlight()
    {
        FlashlightState = false;
        Lamp.setImageResource(R.drawable.lamp_off);

        if (Flashlight.hasFlashlight) FLASHLIGHT.Off();
        else findViewById(R.id.lnrLyt_Main).setBackgroundColor(Color.BLACK);

        return;
    }
}


您怎么看?有任何改进建议吗?

#1 楼

使用驼峰式作为您的变量名。 for if else语句
在您的代码中使用:
        if (!FlashlightState) turnOnFlashlight();
        else turnOffFlashlight();

更合适的方法是:
if(!FlashlightState) {
  turnOnFlashlight();
} else {
  turnOffFlashlight();
}

如果您绝对想省略花括号,请省略它们仅单陈述“仅当”子句。如:
public boolean MyBoolean
使用killProcess是一个坏习惯。 (改为销毁所有活动)。
如果要退出某个应用程序,只需确保该应用程序中的所有活动都是public boolean myBoolean'ed。
如果要退出某个活动,请使用if(bool) doSomething(); //No else statements,这将调用关于您的活动。您应该让操作系统尽可能地处理活动的生命周期。假设您只有一个活动应用程序,则调用finish();应该会破坏您应用程序中的唯一活动,从而在第一次机会时将其退出。最后有语句finish();。这是完全多余的,没有用。
私有方法声明中的冗余final关键字
您的私有方法将不会被覆盖或其他任何东西,它们不需要final关键字。
onDestroy() :子类不能覆盖此方法
finish();:子类不能覆盖此方法
return;:子类不能覆盖此方法,子类也不能覆盖此方法(冗余)

可选:
重构您的打开和关闭功能。
您当前调用两个不同的功能,它们的功能大致相同,具体取决于您是否打开或关闭手电筒。 />代替以下内容:
        if (!FlashlightState) turnOnFlashlight();
        else turnOffFlashlight();

您可以执行以下操作:
toggleFlashLight();

在手电筒中您可以执行以下操作:
private void toggleFlashLight() {

  FlashlightState = !FlashlightState;

  if(FlashlightState) {
    //Turn it on;
  } else {
    //Turn it off;
  }
}

还有其他十二种设计方法。 (您想在哪里实际转换布尔值,等等。但这只是一个例子)

#2 楼

这是@ZeroStatic已经说过的内容。


这些可变的静态变量令人深感不安:


private static boolean FlashlightState;
private static long BackPressed;
private static ImageView Lamp;



为什么这些是静态的?您是否打算同时运行此活动的多个实例?做什么的?我建议将所有这些都设为非静态。


这是关于什么的内容:


AudioManager VibratorState = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
// ...
VibratorState = null;



首先,您呼叫音频服务VibratorState,这完全是一种误导,然后为什么将其设置为null?是否有文档推荐这种做法?如果不是,则可以合理地假设该变量将被正常垃圾回收。


这是毫无意义的:


finish();
this.onDestroy();



调用finish()就足够了,框架将调用onDestroy


不建议在Android应用的Java代码中包含这样的文本:


    AboutBox.setMessage("Name:\nVisionlight\n\nDescription:\nFlashlight application for Android based devices.\n\nVersion:\n1.0.0\n\nPlatform:\nAndroid +2.2.x(Froyo)\n\nPermissions:\nCamera, Flashlight, Vibrate, Wake Lock.\n\nUses-feature:\nCamera [NR], Flashlight [NR].\n\nProducer/Developer:\nYousha Aleayoub(Y.P.Y)\n\nLicense:\nBSD\n\nContact:\nYousha.A@Hotmail.com\n\nLink:\nhttp://yousha.blog.ir/");



这属于strings.xml

此外,通常不要在代码中放入如此长的行。尽可能使行短到适合窗口内。您可以轻松地将其分解为4,而无需向右滚动太多就可以更容易阅读。


使用CamelCase作为类名。但是,main还有一个更大的问题,它没有说明有关该类的任何信息。常见的约定是将活动命名为SomethingActivity,因此在您的情况下FlashlightActivity是一个明显的选择。


仅将所有大写字母用于静态常量,所以不要使用:


private Flashlight FLASHLIGHT = null;



应为:

private Flashlight flashlight = null;


评论


\ $ \ begingroup \ $
为什么将它们设为非静态
\ $ \ endgroup \ $
–Ruchir Baronia
16-3-29在22:56