硬件限制带来的设计考虑:
开发要假设网络情况糟糕的情况,可以把模拟器的在run configuration选项卡中选择target找到Network Speed设置为EDGE模式
考虑用户环境:
行为得当:当应用程序不可见时,暂停UI更新和网络查找,后台运行使用Service,没有额外的UI开销
流畅的从后台切换到前台:可以通过保存程序的状态并把更新放入队列保障这点
合理:决不能抢占注意力,或打断用户当前的活动。当程序不在前台时可以使用Toast或者通知提示用户关注
呈现一致的用户界面
快速响应:
Android通过下面两个条件来确定响应性:
- 应用程序必须在5秒内对任何用户动作做出响应
- 一个BroadcastReceiver必须在10秒内从它的onReceive方法返回
最有可能导致没有响应错误的原因是:网络查找、复杂计算、文件I/O。有很多方法保证这些动作不会超过响应条件,比如服务,工作线程等。
实战例子todoItem
layout文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<EditText
android:id="@+id/myEditText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="New To Do Item"
/>
<ListView
android:id="@+id/myListView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
java文件:
package com.example.todo_list;
import java.util.ArrayList;
import android.os.Bundle;
import android.app.Activity;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView myListView = (ListView)findViewById(R.id.myListView);
final EditText myEditText = (EditText)findViewById(R.id.myEditText);
final ArrayList<String> todoItems = new ArrayList<String>();
final ArrayAdapter<String> aa;
aa = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, todoItems);
myListView.setAdapter(aa);
myEditText.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if(event.getAction() == KeyEvent.ACTION_DOWN){
todoItems.add(0, myEditText.getText().toString());
aa.notifyDataSetChanged();
myEditText.setText("");
return true;
}
return false;
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}