Android - 最佳实践
在开发 Android 应用程序时,可以遵循一些最佳实践。这些实践由 Android 官方推荐,并会随着时间不断改进。
这些最佳实践包括交互设计特性、性能、安全与隐私、兼容性、测试、分发和变现提示等内容。它们已被归纳并列于下方。
最佳实践 - 用户输入
每个文本字段都有不同的用途。例如,有些文本字段用于输入文本,有些用于输入数字。如果是用于输入数字,那么当该文本字段获得焦点时,最好显示数字键盘。其语法如下。
<EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/editText" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" android:hint="User Name" android:layout_below="@+id/imageView" android:layout_alignLeft="@+id/imageView" android:layout_alignStart="@+id/imageView" android:numeric="integer" />
除此之外,如果您的字段用于输入密码,则必须显示密码提示,以便用户轻松记住密码。可以这样实现。
<EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/editText2" android:layout_alignLeft="@+id/editText" android:layout_alignStart="@+id/editText" android:hint="Pass Word" android:layout_below="@+id/editText" android:layout_alignRight="@+id/editText" android:layout_alignEnd="@+id/editText" android:password="true" />
最佳实践 - 后台任务
应用程序中有某些任务在后台运行。这些任务可能是从互联网获取数据、播放音乐等。推荐不要在 UI 线程中执行长时间等待的任务,而应在后台使用 service 或 AsyncTask 执行。
AsyncTask 与 Services 的比较
两者都用于执行后台任务,但 service 不受大多数用户界面生命周期事件的影响,因此在会关闭 AsyncTask 的情况下,service 仍能继续运行。
最佳实践 - 性能
您的应用程序性能应达到标准。但它不应仅在前台表现良好,而应在设备连接电源或充电时在后台表现出色。充电可能来自 USB 或线缆。
当设备正在充电时,推荐更新应用程序设置(如最大化刷新率),当设备连接电源时即可实现。可以这样操作。
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = context.registerReceiver(null, ifilter); // Are we charging / charged? Full or charging. // 我们正在充电/已充满?完全充满或正在充电。 int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1); // How are we charging? From AC or USB. // 我们如何充电?来自 AC 或 USB。 int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
最佳实践 - 安全与隐私
确保应用程序安全非常重要,不仅是应用程序本身,用户数据和应用程序数据也应得到保护。可以通过以下因素提升安全性。
优先使用内部存储而非外部存储来保存应用程序文件
尽可能使用 content providers
连接网络时使用 SSL
使用适当的权限来访问设备的不同功能
示例
下面的示例演示了开发 Android 应用程序时应遵循的一些最佳实践。它创建一个基本应用程序,允许您指定如何使用文本字段,并通过检查手机的充电状态来提升性能。
要实验这个示例,您需要在实际设备上运行。
| 步骤 | 描述 |
|---|---|
| 1 | 您将使用 Android Studio IDE 在包 com.example.sairamkrishna.myapplication 下创建一个 Android 应用程序。 |
| 2 | 修改 src/MainActivity.java 文件以添加代码 |
| 3 | 修改布局 XML 文件 res/layout/activity_main.xml,根据需要添加任何 GUI 组件。 |
| 4 | 运行应用程序,选择一个运行中的 Android 设备,将应用程序安装到该设备上并验证结果。 |
以下是 src/MainActivity.java 的内容
package com.example.sairamkrishna.myapplication;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends ActionBarActivity {
EditText ed1,ed2;
Button b1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ed1=(EditText)findViewById(R.id.editText);
ed2=(EditText)findViewById(R.id.editText2);
b1=(Button)findViewById(R.id.button);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = registerReceiver(null, ifilter);
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED,-1);
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
if(usbCharge){
Toast.makeText(getApplicationContext(),"Mobile is charging on USB",
Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getApplicationContext(),"Mobile is charging on AC",
Toast.LENGTH_LONG).show();
}
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
以下是 activity_main.xml 的内容
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView android:text="Bluetooth Example"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textview"
android:textSize="35dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:id="@+id/textView"
android:layout_below="@+id/textview"
android:layout_centerHorizontal="true"
android:textColor="#ff7aff24"
android:textSize="35dp" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView"
android:src="@drawable/abc"
android:layout_below="@+id/textView"
android:layout_centerHorizontal="true" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:hint="User Name"
android:layout_below="@+id/imageView"
android:layout_alignLeft="@+id/imageView"
android:layout_alignStart="@+id/imageView"
android:numeric="integer" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText2"
android:layout_alignLeft="@+id/editText"
android:layout_alignStart="@+id/editText"
android:hint="Pass Word"
android:layout_below="@+id/editText"
android:layout_alignRight="@+id/editText"
android:layout_alignEnd="@+id/editText"
android:password="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Check"
android:id="@+id/button"
android:layout_below="@+id/editText2"
android:layout_centerHorizontal="true" />
</RelativeLayout>
以下是 Strings.xml 的内容
<resources>
<string name="app_name">My Application</string>
</resources>
以下是 AndroidManifest.xml 的内容
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.sairamkrishna.myapplication" >
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.sairamkrishna.myapplication.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
让我们尝试运行您的应用程序。我假设您已将实际的 Android 移动设备连接到计算机。要从 Android Studio 运行应用,请打开项目的一个 activity 文件,然后点击工具栏中的 Run
图标。Android Studio 将显示以下图像。
上面的图像显示了应用程序的输出
现在,只需在用户名字段中输入文字,您将看到内置的 Android 字典建议开始出现。这在上图中显示。
现在您将看到密码字段。一旦您开始在字段中输入,它就会消失。上图中显示。
最后,只需将设备连接到 AC 电源线或 USB 线,然后按下充电检查按钮。以我的情况为例,我连接了 AC 电源,它显示以下消息。
