第一篇:安卓實驗報告
安卓實驗報告
班級:學(xué)號:姓名:
xxxxx
11111111
xxxx
實驗一:Activity生命周期的測試
一:實驗?zāi)康?/p>
掌握使用Eclipse開發(fā)Android應(yīng)用開發(fā)程序的方法; 掌握Android虛擬設(shè)備的創(chuàng)建方法; 了解Android的程序結(jié)構(gòu);
了解使用命令行創(chuàng)建Android程序方法;
了解Activity生命周期,理解Activity事件回調(diào),onRestoreInstanceState()和 onSaveInstanceState兩個函數(shù)的使用。
二:實驗設(shè)備
Eclipse 開發(fā)Android 應(yīng)用 Android虛擬設(shè)備(AVD)
三:實驗內(nèi)容
(1)正常啟動ActivityLife,然后單擊用戶界面的“結(jié)束程序”按鈕關(guān)閉程序。
(2)正常啟動ACtivityLife,然后通過“撥號鍵”啟動內(nèi)置的撥號程序,再通過“回 退建” 退出撥號程序,使ActivityLife重新顯示在屏幕中。
四:實驗核心代碼
package com.example.activitylife;
import android.app.Activity;import android.app.ActionBar;import android.app.Fragment;import android.os.Bundle;import android.util.Log;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.Button;import android.os.Build;
public class MainActivity extends Activity { private static String TAG=“LIFECYCLE”;@Override
protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.fragment_main);Log.i(TAG,“(1)onCreate()”);Button button =(Button)findViewById(R.id.btn_finish);button.setOnClickListener(new OnClickListener(){
public void onClick(View view){
// TODO Auto-generated method stub
finish();
} });}
@Override
protected void onStart(){ // TODO Auto-generated method stub
super.onStart();Log.i(TAG,“(2)onStart()”);} @Override
protected void onRestoreInstanceState(Bundle savedInstanceState){ // TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState);Log.i(TAG,“(3)onRestoreInstanceState()”);} @Override
protected void onResume(){ // TODO Auto-generated method stub
super.onResume();Log.i(TAG,“(4)onResume()”);} @Override
protected void onSaveInstanceState(Bundle outState){ // TODO Auto-generated method stub
super.onSaveInstanceState(outState);Log.i(TAG,“(5)onSaveInstanceState()”);} @Override
protected void onRestart(){ // TODO Auto-generated method stub
super.onRestart();Log.i(TAG,“(6)onRestart()”);} @Override
protected void onPause(){ // TODO Auto-generated method stub
super.onPause();Log.i(TAG,“(7)onPause()”);} @Override
protected void onStop(){ // TODO Auto-generated method stub
super.onStop();Log.i(TAG,“(8)onStop()”);} @Override
protected void onDestroy(){ // TODO Auto-generated method stub
super.onDestroy();Log.i(TAG,“(9)onDestroy()”);} } 五:運行結(jié)果截圖:
實驗二:用戶界面——自我介紹
一:實驗?zāi)康模?/p>
了解各種界面控件的使用方法;
掌握按鍵事件和觸摸事件的處理方法;
掌握radioButton和radioGroup的使用方法。
二:實驗設(shè)備
Eclipse 開發(fā)Android 應(yīng)用 Android虛擬設(shè)備(AVD)
三:實驗內(nèi)容
要求寫一個自我介紹的安卓應(yīng)用,包括姓名,性別,愛好,其中性別用radioButton選項編寫,點擊提交時,姓名,性別,愛好會在下面顯示出來。
四:實驗核心代碼:
public class MainActivity extends Activity { private EditText editText1;private EditText editText2;private EditText editText3;private TextView textView1;private TextView textView2;private TextView textView3;private RadioGroup radioGroup;private RadioButton radioButton1;private RadioButton radioButton2;private Button button;protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText1 =(EditText)findViewById(R.id.e1);
editText2 =(EditText)findViewById(R.id.e2);
textView1 =(TextView)findViewById(R.id.t1);
textView2 =(TextView)findViewById(R.id.t2);
textView3 =(TextView)findViewById(R.id.t3);
radioGroup =(RadioGroup)findViewById(R.id.RadioGroup1);
radioButton1 =(RadioButton)findViewById(R.id.RadioButton1);
radioButton2 =(RadioButton)findViewById(R.id.RadioButton2);
button =(Button)findViewById(R.id.button1);
radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener(){
public void onCheckedChanged(RadioGroup arg0, final int arg1){
button.setOnClickListener(new View.OnClickListener(){
public void onClick(View arg0){
String str = editText1.getText().toString().trim();
String str1 = editText2.getText().toString().trim();
textView1.setText(“姓名:”+str);
textView3.setText(“愛好:”+str1);
if(arg1 == R.id.RadioButton1)
textView2.setText(“性別:”+“男”);
else if(arg1 == R.id.RadioButton2)
textView2.setText(“性別:”+“女”);
}
});
}
});} } 五:運行結(jié)果截圖:
實驗三:不同界面的切換
一:實驗?zāi)康?/p>
掌握各種界面布局的特點和使用方法;
掌握選項菜單,子菜單和快捷菜單的使用方法。
二;實驗設(shè)備
Eclipse 開發(fā)Android 應(yīng)用 Android虛擬設(shè)備(AVD)
三;實驗內(nèi)容:
設(shè)計一個Tab標(biāo)簽頁,實現(xiàn)LinearLayout,RelativeLayout,AbsoluteLayout三種分頁面之間的切換,每個頁面的內(nèi)容包括用戶名和確定,取消兩個按鈕
四:實驗核心代碼: AndroidMainfest.xml:
public class MainActivity extends TabActivity { protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TabHost tabHost=getTabHost();LayoutInflater.from(this).inflate(R.layout.tab1,tabHost.getTabContentView(),true);LayoutInflater.from(this).inflate(R.layout.tab2,tabHost.getTabContentView(),true);LayoutInflater.from(this).inflate(R.layout.tab3,tabHost.getTabContentView(),true);tabHost.addTab(tabHost.newTabSpec(“TAB1”).setIndicator(“線性布局”).setContent(R.id.layout01));tabHost.addTab(tabHost.newTabSpec(“TAB1”).setIndicator(“絕對布局”).setContent(R.id.layout02));tabHost.addTab(tabHost.newTabSpec(“TAB1”).setIndicator(“相對布局”).setContent(R.id.layout03));} } Tab1,java public class Tab1 extends Activity { public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.tab1);} }
Tab2.java public class Tab2 extends Activity{ public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.tab2);} }
Tab3.java public class Tab3 extends Activity{ public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.tab3);} }
五:運行結(jié)果截圖:
實驗四:登陸界面和廣播消息
一:實驗?zāi)康?/p>
了解使用Intent進(jìn)行組件通信的原理; 了解Intent過濾器的原理與匹配機(jī)制;
掌握發(fā)送和接受廣播消息的方法。
二:實驗設(shè)備
Eclipse 開發(fā)Android 應(yīng)用 Android虛擬設(shè)備(AVD)
三:實驗內(nèi)容
先寫一個登陸界面,包括用戶名,密碼,點擊登陸時實現(xiàn)頁面的跳轉(zhuǎn)功能,在第二個頁面使用Intent發(fā)送消息,并調(diào)用sendBroadcast()函數(shù)把Intent攜帶的消息傳送出去,用BroadcastReceiver接受廣播消息,在頁面下方顯示廣播內(nèi)容。
四;實驗核心代碼:
public class MainActivity extends Activity { private Button button;@Override
protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button=(Button)findViewById(R.id.button1);button.setOnClickListener(new View.OnClickListener(){
public void onClick(View arg0){
Intent intent=new Intent(MainActivity.this,Second.class);
startActivity(intent);
} });} } public class Second extends Activity { private Button button2;private EditText editText;protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
Intent intent=getIntent();
editText=(EditText)findViewById(R.id.e1);
button2=(Button)findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener(){
public void onClick(View arg0){
Intent intent=new
Intent(“com.example.broadcasttest.MY_BROADCAST”);
intent.putExtra(“message”, editText.getText().toString());
sendBroadcast(intent);
}
});
}
public class MyBroadcastReceiver extends BroadcastReceiver{ public void onReceive(Context context, Intent intent){
String msg=intent.getStringExtra(“message”);
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();} } android:name=“.Second”>
五:運行結(jié)果截圖
實驗五:Service綁定實現(xiàn)數(shù)據(jù)運算
一:實驗?zāi)康?/p>
了解Service的原理和用途;
掌握本地服務(wù)的管理和方法; 掌握服務(wù)的隱式啟動和顯示啟動方法;
掌握遠(yuǎn)程服務(wù)的綁定和調(diào)用方法。
二:實驗設(shè)備
Eclipse 開發(fā)Android 應(yīng)用 Android虛擬設(shè)備(AVD)
三:實驗內(nèi)容
以綁定方式使用Service,獲取Service實例,當(dāng)點擊綁定服務(wù)時可以實現(xiàn)兩個數(shù)的求差和比較大小功能,并輸出結(jié)果,當(dāng)點擊取消綁定服務(wù)時,則無法運算。
四:實驗核心代碼
public class MathService extends Service{ private final IBinder mBinder=new LocalBinder();public class LocalBinder extends Binder{ MathService getService(){
return MathService.this;} } public IBinder onBind(Intent intent){ Toast.makeText(this, “本地綁定:MathService”,Toast.LENGTH_SHORT).show();return mBinder;}
public boolean onUnbind(Intent intent){ Toast.makeText(this, “取消本地綁定:MathService”, Toast.LENGTH_SHORT).show();return false;}
public long sub(long a,long b){ return a-b;}
public int compare(long a,long b){ if(a>b)return 1;else if(a==b)return 0;else return-1;
} }
public class MainActivity extends Activity { private MathService mathService;private Button button1;private Button button2;private Button button3;private Button button4;private EditText editText1;private EditText editText2;private EditText editText3;private boolean isBound=false;@Override
protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);editText1=(EditText)findViewById(R.id.e1);editText2=(EditText)findViewById(R.id.e2);editText3=(EditText)findViewById(R.id.e3);button1=(Button)findViewById(R.id.but1);button2=(Button)findViewById(R.id.but2);button3=(Button)findViewById(R.id.but3);button4=(Button)findViewById(R.id.but4);button1.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
if(!isBound){
final Intent serviceIntent=new Intent(MainActivity.this,MathService.class);
bindService(serviceIntent, mConnection, Context.BIND_AUTO_CREATE);
isBound=true;
}
}
});button4.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){ if(isBound){
isBound=false;unbindService(mConnection);
mathService=null;}
} });
button2.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
if(mathService==null){
editText3.setText(“未綁定服務(wù)”);
return;
}
String a = editText1.getText().toString();
long a1 = Long.parseLong(a);
String b = editText2.getText().toString();
long b1 = Long.parseLong(b);
long result=mathService.sub(a1, b1);
String msg=String.valueOf(a1)+“-”+String.valueOf(b)+
“=”+String.valueOf(result);
editText3.setText(msg);
} });
button3.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
if(mathService==null){
editText3.setText(“未綁定服務(wù)”);
return;
}
String a = editText1.getText().toString();
long a1 = Long.parseLong(a);
String b = editText2.getText().toString();
long b1 = Long.parseLong(b);
long result=mathService.compare(a1, b1);
if(result==1){
editText3.setText(a+“>”+b);
}
else if(result==0){
editText3.setText(a+“=”+b);
}
else {
editText3.setText(a+“<”+b);
}
} });} private ServiceConnection mConnection=new ServiceConnection(){
public void onServiceDisconnected(ComponentName arg0){
mathService=null;
}
public void onServiceConnected(ComponentName name, IBinder service){
mathService=((MathService.LocalBinder)service).getService();
} };}
實驗六:SQLite實現(xiàn)用戶的增刪改查
一:實驗?zāi)康?/p>
了解SQLite數(shù)據(jù)庫的特點和體系及結(jié)構(gòu);
掌握SQLite數(shù)據(jù)庫的建立和操作方法;
理解ContentProvide的用途和原理;
掌握ContentProvider的創(chuàng)建和使用方法。
二:實驗設(shè)備
Eclipse 開發(fā)Android 應(yīng)用 Android虛擬設(shè)備(AVD)
三:實驗內(nèi)容
使用SQlite數(shù)據(jù)庫實現(xiàn)用戶(包括:姓名,年齡,身高)的添加數(shù)據(jù),全部顯示,清除顯示,全部刪除,ID刪除,ID查詢,ID更新的功能。
四:實驗核心代碼
public class MainActivity extends ActionBarActivity { private EditText et_name;private EditText et_sex;private EditText et_department;private EditText et_id;private EditText et_salary;private MyOpenHelper oh;private SQLiteDatabase db;private TextView tv;private LinearLayout ll;@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
oh = new MyOpenHelper(MainActivity.this, “test.db”, null, 1);
db = oh.getWritableDatabase();
et_name =(EditText)findViewById(R.id.et_name);
et_sex =(EditText)findViewById(R.id.et_sex);
et_department =(EditText)findViewById(R.id.et_department);
et_salary =(EditText)findViewById(R.id.et_salary);
et_id =(EditText)findViewById(R.id.et_id);
ll =(LinearLayout)findViewById(R.id.ll);}
public void add(View v){
db = oh.getWritableDatabase();
String name=et_name.getText().toString();
String sex=et_sex.getText().toString();
String department=et_department.getText().toString();
String salary=et_salary.getText().toString();
ContentValues values=new ContentValues();
values.put(“name”,name);
values.put(“sex”, sex);
values.put(“department”,department);
values.put(“salary”, salary);
db.insert(“staff”, null, values);
tv=new TextView(MainActivity.this);
tv.setText(“添加成功”);
db.close();} public void show(View v){
db = oh.getWritableDatabase();
Cursor cursor=db.query(“staff”, null, null, null, null, null, null, null);
while(cursor.moveToNext()){
String id=cursor.getString(cursor.getColumnIndex(“_id”));
String name=cursor.getString(cursor.getColumnIndex(“name”));
String sex=cursor.getString(cursor.getColumnIndex(“sex”));
String department=cursor.getString(cursor.getColumnIndex(“department”));
String salary=cursor.getString(cursor.getColumnIndex(“salary”));
tv=new TextView(MainActivity.this);
tv.setText(“ID:”+id+“;”+“Name:”+name+“;”+“Sex:”+sex+“;”+“Department:”+department+“;”+“Salary”+salary);
ll.addView(tv);
}
db.close();} public void clear(View v){
ll.removeAllViews();} public void deleteAll(View v){
db = oh.getWritableDatabase();
db.delete(“staff”, null, null);
tv=new TextView(MainActivity.this);
tv.setText(“刪除成功”);
db.close();}
public void deleteById(View v){
db = oh.getWritableDatabase();
String id=et_id.getText().toString();
db.delete(“staff”, “_id=?”, new String[]{id});
db.close();
tv=new TextView(MainActivity.this);
tv.setText(“ID刪除成功”);} public void findById(View v){
db = oh.getWritableDatabase();
String id=et_id.getText().toString();
Cursor cursor=db.query(“staff”, null, “_id=?”, new String[]{id}, null, null, null, null);
while(cursor.moveToNext()){
id=cursor.getString(cursor.getColumnIndex(“_id”));
String name=cursor.getString(cursor.getColumnIndex(“name”));
String sex=cursor.getString(cursor.getColumnIndex(“sex”));
String department=cursor.getString(cursor.getColumnIndex(“department”));
String salary=cursor.getString(cursor.getColumnIndex(“salary”));
tv=new TextView(MainActivity.this);
tv.setText(id+“;”+name+“;”+sex+“;”+department+“;”+salary);
ll.addView(tv);
tv=new TextView(MainActivity.this);
tv.setText(“ID查詢成功”);
}
db.close();} public void updateById(View v){
db = oh.getWritableDatabase();
String id=et_id.getText().toString();
String name=et_name.getText().toString();
String sex=et_sex.getText().toString();
String department=et_department.getText().toString();
String salary=et_salary.getText().toString();
ContentValues values=new ContentValues();
values.put(“name”,name);
values.put(“sex”, sex);
values.put(“department”,department);
values.put(“salary”, salary);
db.update(“staff”, values, “_id=?”, new String[]{id});
tv=new TextView(MainActivity.this);
tv.setText(“更新ID成功”);
db.close();} }
public class MyOpenHelper extends SQLiteOpenHelper {
public MyOpenHelper(Context context, String name, CursorFactory factory,int version){
super(context, name, factory, version);}
@Override
public void onCreate(SQLiteDatabase db){
db.execSQL(“create table staff(_id integer primary key autoincrement,name text,sex text,department text,salary float)”);}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){} }
五:運行結(jié)果截圖
實驗七:天氣預(yù)報 一:實驗?zāi)康?/p>
了解位置服務(wù)的概念;
了解地圖密鑰的申請方法;
掌握獲取地理信息的方法;
二:實驗設(shè)備
Eclipse 開發(fā)Android 應(yīng)用 Android虛擬設(shè)備(AVD)
三:實驗內(nèi)容
寫一個項目,實現(xiàn)顯示天氣預(yù)報的用戶界面,顯示已發(fā)送SMS短信的用戶界面,不同地區(qū)天氣的轉(zhuǎn)換
四:實驗核心代碼
package com.example.weather;
import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLEncoder;import java.util.ArrayList;import java.util.List;
import net.sf.json.JSONArray;import net.sf.json.JSONObject;import android.app.Activity;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.os.Handler;import android.os.IBinder;import android.os.Message;import android.view.View;import android.widget.ArrayAdapter;import android.widget.EditText;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;
import com.zy.bean.Sms;import com.zy.bean.Weather;
public class MainActivity extends Activity { private MyConn conn = new MyConn();;private EditText et_city;private TextView tv_result;private ImageView iv_weather;private Handler handler;private Intent intent;private MyOpenHelper oh;private ServiceFunctions sFunctions;private MyArrayAdapter myArrayAdapter = null;private ListView lv;private int a = 1;private Weather weather;private List
@Override protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
oh = new MyOpenHelper(MainActivity.this, “weatherdemo.db”, null, 1);
// System.out.println(“數(shù)據(jù)庫創(chuàng)建完”);
et_city =(EditText)findViewById(R.id.et_city);
tv_result =(TextView)findViewById(R.id.tv_result);
iv_weather =(ImageView)findViewById(R.id.iv_weather);
lv =(ListView)findViewById(R.id.lv);
// System.out.println(“l(fā)v找到了”);
intent = new Intent(this, MyService.class);
startService(intent);
Toast.makeText(MainActivity.this, “服務(wù)啟動”, 0).show();
bindService(intent, conn, BIND_AUTO_CREATE);
Toast.makeText(MainActivity.this, “服務(wù)綁定”, 0).show();
handler = new Handler(new Handler.Callback(){
@Override
public boolean handleMessage(Message msg){
final Weather weather =(Weather)msg.obj;
tv_result.setText(weather.toString());
}
new Thread(new Runnable(){ @Override public void run(){
// TODO Auto-generated method stub
try {
URL url = new URL(weather.getDayPictureUrl());
HttpURLConnection con =(HttpURLConnection)url
.openConnection();
con.setRequestMethod(“GET”);
if(con.getResponseCode()== 200){
final Bitmap bitmap = BitmapFactory
.decodeStream(con.getInputStream());
runOnUiThread(new Runnable(){
}
@Override
public void run(){
// TODO Auto-generated method stub
iv_weather.setImageBitmap(bitmap);
}
});}
} catch(Exception e){
// TODO Auto-generated catch block e.printStackTrace();}
}).start();
return false;} });class MyConn implements ServiceConnection {
@Override public void onServiceConnected(ComponentName name, IBinder service){ sFunctions =(ServiceFunctions)service;} @Override public void onServiceDisconnected(ComponentName name){
} } class MyArrayAdapter extends ArrayAdapter
} public MyArrayAdapter(Context context, int resource,int textViewResourceId, List
sFunctions.insertInfo(weather, oh);
a++;} else {
sFunctions.updateInfoById(“1”, weather, oh);} Toast.makeText(MainActivity.this, “保存天氣信息成功”, 0).show();} public void show(View view){ smsList = sFunctions.findAll(oh);if(smsList.size()> 0){
List
for(Sms sms : smsList){
String s = sms.toString();
sList.add(s);
}
if(sList.size()> 0){
myArrayAdapter = new MyArrayAdapter(MainActivity.this,R.layout.second, R.id.tv_show, sList);
lv.setAdapter(myArrayAdapter);
} } }
public void getWeather(View view){
new Thread(new Runnable(){
String city = et_city.getText().toString();
@Override
public void run(){
try {
URL url = new URL(“http://api.map.baidu.com/telematics/v3/weather?location=”
+ URLEncoder.encode(city)
+ “&output=json&ak=QLZmpAbwFlWreQ28kLVgvKEC”);
HttpURLConnection con =(HttpURLConnection)url
.openConnection();
con.setRequestMethod(“GET”);
int code = con.getResponseCode();
if(code == 200){
BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
JSONObject json = JSONObject.fromObject(reader
.readLine());
// System.out.println(obj.toString());
JSONArray array = json.getJSONArray(“results”);
JSONObject obj = array.getJSONObject(0);
JSONObject weather_data = obj.getJSONArray(“weather_data”).getJSONObject(0);
weather = new Weather(obj.getString(“currentCity”), obj
.getString(“pm25”), weather_data
.getString(“date”), weather_data
.getString(“weather”), weather_data
.getString(“wind”), weather_data
.getString(“temperature”), weather_data
.getString(“dayPictureUrl”), weather_data
.getString(“nightPictureUrl”));
Message msg = new Message();
msg.obj = weather;
handler.sendMessage(msg);
}
} catch(Exception e){
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();} }
package com.example.weather;
import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;
public class MyOpenHelper extends SQLiteOpenHelper {
public MyOpenHelper(Context context, String name, CursorFactory factory,int version){
super(context, name, factory, version);}
@Override public void onCreate(SQLiteDatabase db){
db.execSQL(“create table sms(_id integer primary key autoincrement,sms_sender text,sms_body text,sms_receive_time text,return_result text)”);
db.execSQL(“create table weatherinfo(_id integer primary key autoincrement,info text)”);}
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
} }
package com.example.weather;
import java.util.List;
import android.app.Service;import android.content.Intent;import android.content.ServiceConnection;import android.os.Binder;import android.os.IBinder;
import com.zy.bean.Sms;import com.zy.bean.Weather;
public class MyService extends Service { private ISmsDaoImpl daoImpl;private MyBinder myBinder = new MyBinder();
@Override public IBinder onBind(Intent intent){
return myBinder;}
@Override public void unbindService(ServiceConnection conn){
super.unbindService(conn);}
class MyBinder extends Binder implements ServiceFunctions{
public long insertSms(Sms sms,MyOpenHelper oh){
return MyService.this.insertSms(sms,oh);
}
public List
return MyService.this.findAll(oh);
}
public long insertInfo(Weather w,MyOpenHelper oh){
return MyService.this.insertInfo(w,oh);
}
public int updateInfoById(String id, Weather w,MyOpenHelper oh){
return MyService.this.updateInfoById(id, w,oh);
} }
public long insertSms(Sms sms,MyOpenHelper oh){
daoImpl=new ISmsDaoImpl(oh);
long id = daoImpl.insertSms(sms);
return id;}
public List
daoImpl=new ISmsDaoImpl(oh);
List
return smsList;}
public long insertInfo(Weather w,MyOpenHelper oh){
daoImpl=new ISmsDaoImpl(oh);
long id = daoImpl.insertInfo(w);
return id;}
public int updateInfoById(String id, Weather w,MyOpenHelper oh){
daoImpl=new ISmsDaoImpl(oh);
int num = daoImpl.updateInfoById(id, w);
return num;} } 五:運行結(jié)果截圖
第二篇:安卓學(xué)習(xí)心得
Android學(xué)習(xí)心得
-----093380117
計算機(jī)應(yīng)用(1)
張峰
1.關(guān)于Activity
1.在一個Activity中使用多個View
如果把Activity看作MVC中的Control?它負(fù)責(zé)管理UI和接受事件(包括用戶的輸入),雖然說一個Activity通常對應(yīng)一個屏幕,但事實上,我們是可以只用一個Activity管理多個不同的View來實現(xiàn)簡單的邏輯。首先,我們增加一個新的資源描述layout/second.xml。
除了一個“Hello中國”以外,增加一個按鈕可以返回前一個界面。然后,在代碼中我們要為helloTwo增加兩個方法,setViewOneCommand和setViewTwoCommand,分別處理一下在不同界面時,從資源里加載組件并為組件綁定一個事件處理器最后,我們需要在onCreate的時候,也就是啟動后的main界面上設(shè)置一下按鈕事件處理器。2.還是回到正道上,多個Activity之間的跳轉(zhuǎn)
Android中提供一個叫Intent的類來實現(xiàn)屏幕之間的跳轉(zhuǎn),按文檔的說法,似乎他們也建議采用這種方法,Intent的用法比較復(fù)雜,現(xiàn)在我先看看它最簡單的用法。
這里的跳轉(zhuǎn)功能用Intent來操作,它的最簡單用法就是用函數(shù)setClass()設(shè)置跳轉(zhuǎn)前后兩個Activity類的實例,然后調(diào)用Activity自己的startActivity(intent)即可。最后一句finish()表示將當(dāng)前Activity關(guān)掉(如果不關(guān)掉會如何?你可以自己試一下看效果,事實上有時我們是不需要關(guān)掉當(dāng)前Activity的)。
然后,我們同樣弄一個Activity類HelloThreeB,代碼與前面的差不多,只是將setClass的兩個參數(shù)反一下,這樣就可以簡單地實現(xiàn)在兩個Activity界面中來回切換的功能了。
2.關(guān)于 Intent的使用
Intent分為兩大類,顯性的(Explicit)和隱性的(Implicit)。一般來說,intent要定位事件的目的地,無外乎需要以下幾個信息: 1.種類(category),比如我們常見的 LAUNCHER_CATEGORY 就是表示這是一類應(yīng)用程序。
2.類型(type),在前面的例子中沒用過,表示數(shù)據(jù)的類型,這是隱性Intent定位目標(biāo)的重要依據(jù)。
3.組件(component),前面的例子中用的是setClass,不過也可以用setComponent來設(shè)置intent跳轉(zhuǎn)的前后兩個類實例。4.附加數(shù)據(jù)(extras),在ContentURI之外還可以附加一些信息,它是Bundle類型的對象。
其實,如果是在一個應(yīng)用內(nèi)部,這種隱性的intent實在有點別扭,個人覺得,這種松藕合的實現(xiàn)方法,只適用于那些較大的系統(tǒng)或者多個不同的應(yīng)用之間的調(diào)用,可手機(jī)上又有什么“較大”的系統(tǒng)呢?無非是可以與不同來源的多個應(yīng)用之間方便地互操作而已,那么會是什么樣的場景呢?比如,給QQ好友發(fā)送gmail郵件,用GoogleMap查找QQ好友所在的位置?看上去挺不錯的。
關(guān)于這個ContentProvider,其實還有話說,它主要是的那些看似數(shù)據(jù)庫操作的方法我們都沒真正去實現(xiàn)呢。不過今天就到這里了,等下回再去研究吧。
3.關(guān)于ListActivity
準(zhǔn)備一個List對象并借助Adapter就可以構(gòu)造出一個列表。重載onListItemClick方法可以響應(yīng)選擇事件,利用第一個參數(shù)可以訪問到這個ListView實例以得到選中的條目信息。這里有一點要說明的,就是如果更簡單的話,其實連那個setContentView都可以不要了,Android也會自動幫我們構(gòu)造出一個全屏的列表。但是本例中我們需要一個TextView來顯示選中的條目,所以我們需要一個layout.mainb描述一下這個列表窗口。
這里需要注意的是那個ListView的ID,是系統(tǒng)自定義的android:list,不是我們隨便取的,否則系統(tǒng)會說找不到它想要的listview了。然后,在這個listview之外,我們又增加了一個TextView,用來顯示選中的條目。
再來說說這里用到的ArrayAdapter,它的構(gòu)造函數(shù)中第二個參數(shù)是一個資源ID,ArrayAdapter的API文檔中說是要求用一個包含TextView的layout文件,平臺用它來顯示每個選擇條目的樣式,這里的取值是R.layout.list_row,所以,我們還有一個list_row.xml文件來描述這個布局,相當(dāng)簡單。
從ArrayAdapter上溯到BaseAdapter,發(fā)現(xiàn)還有幾個同源的Adapter也應(yīng)該可以使用,象SimpleAdapter和CursorAdapter,還是做個例子來實驗一下吧。
然后,在HelloTwoB中的onCreate函數(shù)中,修改代碼,有幾個不同:items的元素是HashMap實例,這是一點變化,然后構(gòu)造函數(shù)除了要求items以外,還要求提供一個string[]來說明用hash表中的哪個字段顯示在列表中,而后是一個資源ID的數(shù)組。
因為單純的CursorAdapter是抽象類,所以我用的是它的子類SimpleCursorAdapter,很好理解,先用ContentResolver查詢通訊簿得到一個游標(biāo),然后告訴SimpleCursorAdapter要用其中的People.NAME作為顯示項來構(gòu)造出一個adapter即可。4.關(guān)于Dialog
注意到android.app包下除了Dialog(可用于制作復(fù)雜的對話框)以外,還包括了幾個系統(tǒng)定義好的對話框類,如DatePickerDialog、TimePickerDialog及AlertDialog。
其中AlertDialog我上回用過一次,基本上就那樣子了,今天看看另外兩個對話框的使用吧。
很簡單的,無非是需要一個OnDateSetListener接口的實現(xiàn)而已,在它里面的dateSet方法中就可以得到選擇的日期了。而TimePickerDialog與DatePickerDialog使用如出一轍。
看看另一個ProgressDialog的用法吧,這個類與AlertDialog一樣包含了多個static的方法,所以使用起來是非常方便的。比如說,如果我們需要用它來表示一個長時間的操作。
5.關(guān)于Service和Notification
大略地看了一下android.app下的Service類,覺得它與Activity非常相似,只是要注意幾個地方:
1.生命周期,Service的從onCreate()->onStart(int,Bundle)->onDestroy()顯得更為簡單。但是它的onStart是帶參數(shù)的,第一個ID可用來標(biāo)識這個service,第二個參數(shù)顯示是用來傳遞數(shù)據(jù)的了。比較Activity,傳遞數(shù)據(jù)的Bundle是在onCreate就帶進(jìn)入的。
2.Service的啟動由Context.startService開始,其實Activity或者Service都是Context的派生類。結(jié)束于Context.stopService()或者它自己的stopSelf()。
3.Service還有一個與Activity不一樣的是它可以由另一個Context去綁定一個已存在的Service。就是這個方法Context.bindService(),被綁定的Service要求是已經(jīng)onCreate了但可以沒有onStart。在Service類中有個抽象方法getBinder()可以得到這個IBinder對象。關(guān)于這方面的細(xì)節(jié),以后再看,這里只做個記錄罷。
4.與Service有關(guān)的還有一個安全的問題,可以在AndroidManifest.xml中用
6.GridView與ImageView
簡單一點吧,就瞧瞧那個Grid的效果,Android提供了一個GridView,不過從APIDemo中看來,它似乎與PC上的GRID差別還是挺大的,更像那個IconView的感覺。不知道Android中如何實現(xiàn)表格界面?雖然在移動終端上,表格一般不會有誰使用,大家似乎更傾向于使用ListView,而Android對于ListView則有更簡單的實現(xiàn)ListActivity。
很簡單,只要重載幾個方法就可以了,關(guān)鍵是那個getView方法,它負(fù)責(zé)構(gòu)建出每個單元格中的對象實例。這里我們構(gòu)造的是一個ImageView實例。
然后就是同樣的將這個Adapter賦給GridView即可,大家可以看看效果,注意在做這個例子前,先放幾個小圖片到res/drawable目錄下,buildproject一下就可以得到那個R.drawable.a了(這里的a是圖像文件名,如a.png)。
在getView方法中我們使用了ImageView類,這又是一個widget。除了上面用到的幾個方法以外,還有以下幾個方法值得注意: 與圖像來源有關(guān)的方法,我們只用了資源文件的方式。
還是習(xí)慣性跑題了,其實,我是想通過我對這個類的無數(shù)次Debugger跟進(jìn),說說它的多線程異步處理的解決策略的。他的基本策略如下: 1.當(dāng)你實例化一個AsyncQueryHandler類時(包括其子類...),它會單件構(gòu)造一個線程(后面會詳述...),這個線程里面會構(gòu)建一個消息循環(huán)。
2.獲得該消息循環(huán)的指針,用它做參數(shù)實例化另一個Handler類,該類為內(nèi)部類。至此,就有了兩個線程,各自有一個Handler來處理消息。3.當(dāng)調(diào)用onXXX的時候,在XXX函數(shù)內(nèi)部會將請求封裝成一個內(nèi)部的參數(shù)類,將其作為消息的參數(shù),將此消息發(fā)送至另一個線程。4.在該線程的Handler中,接受該消息,并分析傳入的參數(shù),用初始化時傳入的ContentResolver進(jìn)行XXX操作,并返回Cursor或其他返回值。
5.構(gòu)造一個消息,將上述返回值以及其他相關(guān)內(nèi)容綁定在該消息上,發(fā)送回主線程。
6.主線程默認(rèn)的AsyncQueryHandler類的handleMessage方法(可自定義,但由于都是內(nèi)部類,基本沒有意義...)會分析該消息,并轉(zhuǎn)發(fā)給對應(yīng)的onXXXComplete方法。
7.用戶重寫的onXXXComplete方法開始工作。
這就是它偷偷摸摸做過的事情,基本還是很好理解的。我唯一好奇的是它的線程管理方式,我猜測他是用的單件模式。第一個AsyncQueryHandler的實例化會導(dǎo)致創(chuàng)建一個線程,從此該線程成為不死老處男,所有的ContentResolver相關(guān)的工作,都由該線程統(tǒng)一完成。個人覺得這種解決方式很贊。本來這個線程的生命周期就很難估量,并且,當(dāng)你有一個ContentProvider的請求的時候,判斷你會做更多的類似操作并不過分。就算錯了,花費的也只是一個不死的線程(與進(jìn)程同生死共存亡...),換來的卻是簡單的生命周期管理和無數(shù)次線程生死開銷的節(jié)約。同時另外一個很重要的問題,他并會涉及到單件中數(shù)據(jù)同步的問題,每個類都有各自的Handler類,彼此互不干擾,分發(fā)可以分別進(jìn)行。當(dāng)多個數(shù)據(jù)請求的時候,在同一個ContentResolver上進(jìn)行的可能微乎其微,這就避免了堵塞??偠灾?,這套解決辦法和Android的整體設(shè)計算是天作之合了。
所以建議,如果你有什么非ContentProvider操作,卻需要異步多線程執(zhí)行的話,模擬一套,是個不錯的策略,當(dāng)然,具體情況具體分析,生搬硬套是學(xué)不好馬列主義的。
7.顯示控件使用
Android的界面顯示同樣也是基于控件的。通常是用View(包括ViewGroup)控件配上XML的樣式來做的。具體細(xì)節(jié)不想說了,可以參考 Samples里的ApiDemos/View,和View的Doc,以及Implementing a UI這篇Doc。其他還有很多,感覺算是SDK講述的最多的內(nèi)容。
從控件的使用上,和網(wǎng)頁的設(shè)計類似,盡量用parent_width之類的抽象長度,用Theme來做風(fēng)格,抽取所有的字串等信息做本地化設(shè)計。相關(guān)內(nèi)容參看Implementing a UI就好。
一類比較重要的是數(shù)據(jù)綁定控件。如果做過ASP.Net會從中看到很多類似的地方。一個支持?jǐn)?shù)據(jù)綁定的控件,比如ListView??梢酝ㄟ^一個 ListAdapter綁定到一個數(shù)據(jù)源上。ListAdapter是一個抽象類,主要的實現(xiàn)類包括SimpleAdapter和 SimpleCursorAdapter。前者是綁定一個靜態(tài)的Array,后者是綁定一個動態(tài)的Cursor。Cursor前面說過,是一個指向數(shù)據(jù)源的隨機(jī)迭代器,將View綁定到Cursor通常要設(shè)置這樣幾個參數(shù)。一個是每一行的樣式,稱作Row Layout,其實就是一個普通的Layout的XML文件。還有就是一個列和現(xiàn)實控件的對應(yīng)關(guān)系。那個控件顯示哪個列的值,這是需要配置的。為了定制一個良好的數(shù)據(jù)顯示控件,最簡單你可以定制很PP的Row Layout,復(fù)雜一點就是可以重載綁定控件View,或者是適配器ListAdapter。如果是一個數(shù)據(jù)顯示密集的應(yīng)用,且你對UI有些追求,這個工作估計是必不可少的。
一個主要用于顯示數(shù)據(jù)內(nèi)容的Activity,可以選擇派生自ListActivity。它提供了一個具有ListView 的Layout,還有simple_list_item_1, simple_list_item_2, two_line_list_item等默認(rèn)的Row Layout,還有一些比較不錯的API,和可供響應(yīng)選擇Item的事件??梢詽M足你比較基礎(chǔ)的需求。如果你覺得只有一個ListView的界面太突兀,你可以為這個ListActivity指定一個Layout,需要注意的是,你需要提供一個id為@android:id/list的ListView控件,避免Activity在內(nèi)部偷偷尋找該控件的時候失敗。
除了這些要求,做好UI還有注意易用性和效率??旖萱I是一個比較不錯的選擇,在 Activity中調(diào)用setDefaultkeyMode(SHORTCUT_DEFAULT_KEYS),可以開啟快捷鍵模式,然后你可以將菜單綁定到指定快捷鍵上就OK了。個人覺得Tip也是一個比較重要的東西,但目前觀察看來,這個東西只能夠自己提供了。界面的動態(tài)性有時候是不可避免的,比如說菜單就是一個需要經(jīng)常根據(jù)光標(biāo)位置提供不同的選項。這個東西Android很人道的考慮到了,你可以參看NodeList這個Sample。它采取的應(yīng)該是一個靜態(tài)模擬動態(tài)的方式,這樣有助于提高速度。你也可以利用ViewInflate,動態(tài)從一個XML創(chuàng)建一個控件。成本據(jù)Doc說很大,不到萬不得已不要使用。
8.Intent消息傳遞
在前面寫Android的ContentProvider時候,可以看到那是基于觀察者模式的一個消息傳遞方法。每一個Cursor、ContentResolver做為一個小的注冊中心,相關(guān)觀察者可以在這個中心注冊,更新消息由注冊中心分發(fā)給各個觀察者。而在MFC或Winform中,都會形成一個消息網(wǎng),讓消息在網(wǎng)中流動,被各節(jié)點使用、吃掉或者在出口死掉。
相比之下,我個人覺得基于Intent的Android核心消息傳遞機(jī)制是有所不同的。它應(yīng)該會有一個全局性的注冊中心,這個注冊中心是隱性的,整個Android系統(tǒng)中就那么一個。所有的消息接收者,都被隱形的注冊到這個中心。包括Activity,Service和IntentReceiver。其實說隱形注冊是不確切的,所有注冊都還是我們手動告訴注冊中心的,只是與傳統(tǒng)的方式不一樣,我們通常不是通過代碼,而是通過配置文件來做。在應(yīng)用的Manifest中,我們會為一些Activity或Service添加上Intent-filter,或在配置文件中添加
當(dāng)程序有一個消息希望發(fā)出去的時候,它需要將消息封裝成一個Intent,并發(fā)送。這時候,應(yīng)該是有一個統(tǒng)一的中心(恩,有可能Android底層實現(xiàn)的時候不是,但簡單這樣看是沒問題的...)接受到這個消息,并對它進(jìn)行解析、判定消息類型(這個步驟降低了耦合...),然后檢查注冊了相匹配的filter或receiver,并創(chuàng)建或喚醒接收者,將消息分發(fā)給它。這樣做有很多好處。雖然這種傳遞有的時候不如點對點的傳遞快(這有些需要速度的地方,我們看到Android會通過直接通信來做),但有時候又因為它只經(jīng)過一跳(姑且這么叫吧...),比復(fù)雜的流動又要更快。更重要的是,它耦合性低,在手機(jī)平臺這種程序組件多變的條件下使用十分適合。并且它可以很容易實現(xiàn)消息的精確或模糊匹配,彈性很大。(我個人曾想在開發(fā)一個C++二次平臺的時候引入這樣的機(jī)制,但在C++中,建立一套完整的數(shù)據(jù)marshal機(jī)制不容易,相比之下,用java來做會簡單很多...)
恩,廢話說了很多,具體講講Android中Intent的使用。當(dāng)你有一個消息需要傳遞,如果你明確知道你需要哪個Activity或者其他Class來響應(yīng)的話,你可以指定這個類來接受該消息,這被稱為顯性發(fā)送。你需要將Intent的class屬性設(shè)置成目標(biāo)。這種情況很常見,比如startActivity的時候,會清楚當(dāng)前Activity完了應(yīng)該是哪個Activity,那就明確的發(fā)送這個消息。
但是,有的時候你并不確定你的消息是需要具體哪個類來執(zhí)行,而只是知道接收者該符合哪些條件。比如你只需要有一個接收者能顯示用戶所選的數(shù)據(jù),而不想制定某個具體的方法,這時候你就需要用到隱形發(fā)送(傳統(tǒng)上,我們可能會考慮用多態(tài),但顯然這種方式更為靈活...)。在Android中,你可以為Intent指定一個action,表示你這個指令需要處理的事情。系統(tǒng)為我們定義了很多Action類型,這些類型使系統(tǒng)與我們通信的語言(比如在Activity里面加一個Main的filter,該activity就會做成該應(yīng)用的入口點),當(dāng)然你也可以用于你自己的應(yīng)用之間的通信(同樣當(dāng)然,也可以自定義...)。強(qiáng)烈建議,在自己程序接收或發(fā)出一個系統(tǒng)action的時候,要名副其實。比如你響應(yīng)一個view動作,做的確實edit的勾當(dāng),你發(fā)送一個pick消息,其實你想讓別人做edit的事,這樣都會造成混亂。當(dāng)然只有Action有時候是不夠的,在Android中我們還可以指定catalog信息和type/data信息,比如所有的顯示數(shù)據(jù)的Activity,可能都會響應(yīng)View action。但很多與我們需要顯示的數(shù)據(jù)類型不一樣,可以加一個type信息,明確的指出我們需要顯示的數(shù)據(jù)類型,甚至還可以加上一個catalog信息,指明只有你只有按的是“中鍵”并發(fā)出這樣的消息才響應(yīng)。從上面可以看出,Android的Intent可以添加上class, action, data/type, catalog等消息,注冊中心會根據(jù)這些信息幫你找到符合的接收者。其中class是點對點的指示,一旦指明,其他信息都被忽略。Intent中還可以添加key/value的數(shù)據(jù),發(fā)送方和接收方需要保持統(tǒng)一的key信息和value類型信息,這種數(shù)據(jù)的marshal在java里做,是不費什么力氣的。
Android的Intent發(fā)送,可以分成單播和廣播兩種。廣播的接收者是所有注冊了的符合條件的IntentReceiver。在單播的情況下,即使有很多符合條件的接收者,也只要有一個出來處理這個消息就好(恩,個人看法,沒找到確切條款或抉擇的算法,本來想實驗一下,沒來得及...),這樣的情況很容易理解,當(dāng)你需要修改某個數(shù)據(jù)的時候,你肯定不會希望有十個編輯器輪流讓你來處理。當(dāng)廣播不是這樣,一個receiver沒有辦法阻止其他receiver進(jìn)行對廣播事件的處理。這種情況也很容易理解,比如時鐘改變了,鬧鐘、備忘錄等很多程序都需要分別進(jìn)行處理。在自己的程序的使用中,應(yīng)該分清楚區(qū)別,合理的使用。
9.ContentProvider數(shù)據(jù)模型
數(shù)據(jù)庫操作
從我目前掌握的知識來看,SQLite比較輕量(沒有存儲過程之類的繁雜手段),用起來也比較簡單。實例化一個SQLiteDatabase類對象,通過它的APIs可以搞定大部分的操作。從sample中看,Android中對db的使用有一種比較簡單的模式,即派生一個 ContentProviderDatabaseHelper類來進(jìn)行SQLiteDatabase對象實例的獲取工作?;旧?,ContentProviderDatabaseHelper類扮演了一個singleton的角色,提供單一的實例化入口點,并屏蔽了數(shù)據(jù)庫創(chuàng)建、打開升級等細(xì)節(jié)。在ContentProvider中只需要調(diào)用ContentProviderDatabaseHelper的openDatabase方法獲取SQLiteDatabase的實例就好,而不需要進(jìn)行數(shù)據(jù)庫狀態(tài)的判斷。URI 像進(jìn)行數(shù)據(jù)庫操作需要用SQL一樣,對ContentProivder進(jìn)行增刪改查等操作都是通過一種特定模式的URI來進(jìn)行的(ig:content: //provider/item/id),URI的能力與URL類似,具體細(xì)節(jié)可以查看SDK。建立自己的ContentProvider,只需要派生 ContentProivder類并實現(xiàn)insert, delete, update等抽象函數(shù)即可。在這些接口中比較特殊的是getType(uri)。根據(jù)傳入的uri,該方法按照MIME格式返回一個字符串(==!沒聽過的詭異格式...)唯一標(biāo)識該uri的類型。所謂uri的類型,就是描述這個uri所進(jìn)行的操作的種類,比如content://xx/a與 content://xx/a/1不是一個類型(前者是多值操作,后者是單值),但content://xx/a/1和content://xx/a/2 就會是一個類型(只是id號不同而已)。
在ContentProvider通常都會實例化一個ContentURIPraser來輔助解析和操作傳入的URI。你需要事先(在static域內(nèi))為該ContentURIPraser建立一個uri的語法樹,之后就可以簡單調(diào)用 ContentURIPraser類的相關(guān)方法進(jìn)行uri類型判斷(match方法),獲取加載在uri中的參數(shù)等操作。但我看來,這只是在使用上簡化了相關(guān)操作(不然就需要自己做人肉解析了...),但并沒有改變類型判定的模式。你依然需要用switch...case...對uri的類型進(jìn)行判斷,并進(jìn)行相關(guān)后續(xù)的操作。從模式來看,這樣無疑是具有強(qiáng)烈的壞味道,類似的switch...case...代碼要出現(xiàn)N此,每次一個 ContentProvider做uri類型的增減都會需要遍歷修改每一個switch...case...,當(dāng)然,如果你使用模式(策略模式...)進(jìn)行改造對手機(jī)程序來說無疑是崩潰似的(類型膨脹,效率降低...),所以,只能是忍一忍了(恩,還好不會擴(kuò)散到別的類中,維護(hù)性上不會有殺人性的麻煩...)。增刪改查
ContentProvider 和所有數(shù)據(jù)源一樣,向外提供增刪改查操作接口,這些都是基于uri的指令。進(jìn)行insert操作的時候,你需要傳入一個uri和 ContentValues。uri的作用基本就限于指明增減條目的類型(從數(shù)據(jù)庫層面來看就是table名),ContentValues是一個 key/value表的封裝,提供方便的API進(jìn)行插入數(shù)據(jù)類型和數(shù)據(jù)值的設(shè)置和獲取。在數(shù)據(jù)庫層面上來看,這應(yīng)該是column name與value的對應(yīng)。但為了屏蔽ContentProvider用戶涉及到具體數(shù)據(jù)庫的細(xì)節(jié),在Android的示例中,用了一個小小的模式。它為每一個表建一個基于BaseColumn類的派生類(其實完全可以不派生自BaseColumn,特別當(dāng)你的表不基于默認(rèn)的自動id做主鍵的時候),這個類通常包括一個描述該表的ContentURI對象和形如 public static final TITLE = “title”這樣的column到類數(shù)據(jù)的對應(yīng)。從改變上角度來看,你可以修改column的名字而不需要更改用戶上層代碼,增加了靈活性。insert方法如果成功會返回一個uri,該uri會在原有的uri基礎(chǔ)上增加有一個row id。對于為什么使用row id而不是key id我想破了腦袋。到最后,我發(fā)現(xiàn)我傻了,因為ContentProvider不一定需要使用數(shù)據(jù)庫,使用數(shù)據(jù)庫對應(yīng)的表也可以沒有主鍵,只有row id,才能在任何底層介質(zhì)下做索引標(biāo)識。
但,基于row id在刪除和修改操作是會造成一定的混亂。刪除和修改操作類似。刪除操作需要傳入一個uri,一個where字串,一組where的參數(shù)(做條件判定...),而修改操作會多一個ContentValues做更新值。著兩個操作的uri都支持在末尾添加一個row id。于是混亂就出現(xiàn)了。當(dāng)在where參數(shù)中指明了key id,而在uri中提供了row id,并且row id和key id所指函數(shù)不一致的時候,你聽誰的?示例代碼中的做法是完全無視row id(無語...),如此野蠻的方式我估計也只能在示例中出現(xiàn),在實際中該如何用,恩,我也不知道。幸運的是,我看了下上層對 ContentProvider的刪除操作,其實都不會直接進(jìn)行,而是通過調(diào)用Cursor的delete方法進(jìn)行,在這前提下,我想Cursor會處理好這些東西吧。
最后一個操作是查詢操作,可以想見,查詢的參數(shù)是最多的,包括uri和一組條件參數(shù)。條件參數(shù)類型和標(biāo)準(zhǔn)的sql類似,包括 sort, projection 之類的。從這些參數(shù)到sql語句的生成,可以尋求QueryBuilder類的幫助,它提供了一組操作接口,簡化了參數(shù)到sql的生成工作,哪怕你不懂 sql都完全沒有問題(這話說的我自己都覺得有點懸...)。查詢返回一個Cursor。Cursor是一個支持隨機(jī)讀寫的指針,不僅如此,它還提供了方便的刪除和修改的API,是上層對ContentProvider進(jìn)行操作一個重要對象,需要仔細(xì)掌握(Cursor還可以綁定到view上,直接送顯,并與用戶進(jìn)行交互,真是程序越往上,封裝越好,工作越機(jī)械沒有復(fù)雜性了...)。數(shù)據(jù)模型
在與界面打交道的Cursor、ContentResolver等數(shù)據(jù)操作層中,大量采用觀察者模式建立數(shù)據(jù)層與顯示層的聯(lián)系。一個顯示層的視圖,可以做成某一種觀察者注冊到Cursor或ContentResolver等數(shù)據(jù)中間層中,在實現(xiàn)底層ContentProvider中,我們需要特別注意在對數(shù)據(jù)進(jìn)行修改操作(包括增刪改...)后,調(diào)用相應(yīng)類型的notify函數(shù),幫助表層對象進(jìn)行刷新(還有一種刷新方式是從一個view發(fā)起的)??梢钥吹?Android的整體數(shù)據(jù)顯示框架有點像MVC的方式。Cursor、ContentResolver相當(dāng)于控制層,數(shù)據(jù)層和顯示層的交互通過控制層來掌管,而且控制層很穩(wěn)定不需要特別定制,通常工作只在定制數(shù)據(jù)層和顯示層空間,還是比較方便和清晰的。
10.學(xué)習(xí)感想
通過這學(xué)期對安卓的學(xué)習(xí),大概了解了以上一些知識,對安卓有了初步的了解,這幾個月給我的東西我想用有形的和無形的兩部分概敘,形的當(dāng)然就是技術(shù)水平的長進(jìn),雖然其中肯定有很多的不足,相信慢慢會體會到。
第三篇:安卓實習(xí)報告
通信與電子信息專業(yè)實訓(xùn)報告
項目名稱:基于android的游戲開發(fā)
班 級 10通信1班
姓 名
學(xué) 號
指導(dǎo)教師
成 績
實訓(xùn)時間:年月日—
目錄
一、實訓(xùn)目的及其意義............................................3 1.1、目的及意義..............................................3 1.2、研究現(xiàn)狀................................................3
二、實訓(xùn)主要任務(wù)、重點及難點....................................4 2.1、任務(wù)....................................................4 2.2、重點內(nèi)容及實現(xiàn)途徑......................................4
三、實訓(xùn)具體內(nèi)容及完成的主要工作................................5 3.1、認(rèn)識基礎(chǔ)開發(fā)............................................6 3.2、了解數(shù)據(jù)存儲............................................6 3.3、總體實訓(xùn)過程............................................7
四、實際遇到的困難,解決問題的方法和措施........................8
(一)、所遇問題.................................................8
(二)、解決方法與措施...........................................9
五、心得體會....................................................9
一、實訓(xùn)目的及其意義 1.1、目的及意義 了解現(xiàn)階段互聯(lián)網(wǎng)發(fā)展主流,了解移動互聯(lián)網(wǎng),認(rèn)識移動互聯(lián)網(wǎng)的發(fā)展與展望,認(rèn)識android,了解基于android的應(yīng)用軟件開發(fā)方法及其商業(yè)流程。把理論與實際結(jié)合,通過對理論知識的理解,領(lǐng)悟從而運用到生活實際鞏固所學(xué)的知識,提高對實際生活的認(rèn)識,積累經(jīng)驗。使學(xué)生在此期間能夠初次體會到實際生產(chǎn)中的種種技能與經(jīng)驗,完成一項項目鍛煉獨立思考及團(tuán)隊合作能力。使學(xué)生們進(jìn)一步加深對所學(xué)知識的理解,理論聯(lián)系實際,鞏固所學(xué)有關(guān)計算機(jī)基礎(chǔ)理論知識和基本技能,學(xué)習(xí)有關(guān)計算機(jī)最新技術(shù)方面的應(yīng)用,增強(qiáng)學(xué)生對計算機(jī)在社會生活,社會生產(chǎn)中應(yīng)用的感性認(rèn)識,深入了解計算機(jī)在各個領(lǐng)域中的應(yīng)用狀況。生產(chǎn)實習(xí)是學(xué)校教學(xué)的重要補(bǔ)充部分,是區(qū)別于普通學(xué)校教育的一個顯著特征,是教育教學(xué)體系中的一個不可缺少的重要組成部分和不可替代的重要環(huán)節(jié)。它是與今后的職業(yè)生活最直接聯(lián)系的,學(xué)生在生產(chǎn)實習(xí)過程中將完成學(xué)習(xí)到就業(yè)的過渡,因此生產(chǎn)實習(xí)是培養(yǎng)技能型人才,實現(xiàn)培養(yǎng)目標(biāo)的主要途徑。它不僅是校內(nèi)教學(xué)的延續(xù),而且是校內(nèi)教學(xué)的總結(jié)。生產(chǎn)實習(xí)一方面鞏固了書本上學(xué)到的理論知識,另一方面,可獲得在書本上不易了解和不易學(xué)到的生產(chǎn)現(xiàn)場的實際知識,使我們在實踐中得到提高實訓(xùn)環(huán)節(jié)對于提高學(xué)生的綜合能力和全面素質(zhì)具有重要意義。1.2、研究現(xiàn)狀 android 是google開發(fā)的基于linux平臺的開源手機(jī)操作系統(tǒng)。它包括操作系統(tǒng)、用戶界面和應(yīng)用程序 —— 移動電話工作所需的全部軟件,而且不存在任何以往阻礙移動產(chǎn)業(yè)創(chuàng)新的專有權(quán)障礙。google與開放手機(jī)聯(lián)盟合作開發(fā)了 android,這個聯(lián)盟由包括中國移動、摩托羅拉、高通、宏達(dá)電和 t-mobile 在內(nèi)的 30 多家技術(shù)和無線應(yīng)用的領(lǐng)軍企業(yè)組成。google通過與運營商、設(shè)備制造商、開發(fā)商和其他有關(guān)各方結(jié)成深層次的合作伙伴關(guān)系,希望借助建立標(biāo)準(zhǔn)化、開放式的移動電話軟件平臺,在移動產(chǎn)業(yè)內(nèi)形成一個開放式的生態(tài)系統(tǒng)。android主要使用于移動設(shè)備,如智能手機(jī)和平板電腦,由google公司和開放手機(jī)聯(lián)盟領(lǐng)導(dǎo)及開發(fā)。尚未有統(tǒng)一中文名稱,中國大陸地區(qū)較多人使用“安卓”或“安致”。android操作系統(tǒng)最初由andy rubin開發(fā),主要支持手機(jī)。2005年8月由google收購注資。2007年11月,google與84家硬件制造商、軟件開發(fā)商及電信營運商組建開放手機(jī)聯(lián)盟共同研發(fā)改良android系統(tǒng)。隨后google以apache開源許可證的授權(quán)方式,發(fā)布了android的源代碼。第一部android智能手機(jī)發(fā)布于2008年10月。android逐漸擴(kuò)展到平板電腦及其他領(lǐng)域上,如電視、數(shù)碼相機(jī)、游戲機(jī)等。2011年第一季度,android在全球的市場份額首次超過塞班系統(tǒng),躍居全球第一。2012年11月數(shù)據(jù)顯示,android占據(jù)全球智能手機(jī)操作系統(tǒng)市場76%的份額,中國市場占有率為90%。目前基于android的移動終端上的軟件應(yīng)用開發(fā)很火熱,android平臺的開發(fā)已越來越強(qiáng)大。android是一種以linux為基礎(chǔ)的開放源碼操作系統(tǒng),主要使用于便攜設(shè)備。android操作系統(tǒng)最初由andy rubin創(chuàng)辦,最初只支持手機(jī)。2005年由google收購注資,并拉攏多家制造商組成開放手機(jī)聯(lián)盟(open handset alliance)開發(fā)改良,逐漸擴(kuò)展到到平板電腦及其他領(lǐng)域上。
二、實訓(xùn)主要任務(wù)、重點及難點 2.1、任務(wù)
認(rèn)識移動互聯(lián)網(wǎng),了解移動互聯(lián)網(wǎng)的開發(fā),認(rèn)識及了解android,在給定時間內(nèi)完成基于android平臺的游戲項目的開發(fā),實現(xiàn)預(yù)想游戲效果,熟悉項目開發(fā)的商業(yè)流程,給出游戲全套文檔及代碼。
2.2、重點內(nèi)容及實現(xiàn)途徑 2.2.1、重點內(nèi)容:熟悉游戲開發(fā)代碼,了解項目流程,對android游戲開發(fā)有基本了解。2.2.2、實現(xiàn)途徑:
所需運行硬件環(huán)境:
安卓系統(tǒng)2.2以上 3.5寸以上移動設(shè)備
軟件開發(fā)環(huán)境的配置:
(1)配置java程序開發(fā)環(huán)境
(2)安裝并漢化eclipse(jdk)(3)android sdk的安裝
(4)adt的安裝及配置
(5)android模擬器的配置
(6)office2003以上版本的軟件(繪圖visio)然后運用eclipse完成項目代碼的編寫,運行與調(diào)試; 最終在實體終端上進(jìn)行測試,最終完成項目
三、實訓(xùn)具體內(nèi)容及完成的主要工作
實訓(xùn)前期,有老師給我們講解了現(xiàn)階段移動互聯(lián)網(wǎng)的發(fā)展,了解移動互聯(lián)網(wǎng)的發(fā)展主流,說明了現(xiàn)階段移動互聯(lián)的發(fā)展重要性。老師著重給我們講解了android的發(fā)展,以及現(xiàn)階段移動互聯(lián)中android所扮演的角色。接下來我們將針對基于android的游戲開發(fā)進(jìn)行學(xué)習(xí),由于時間的原因,我們主要了解了一下游戲開發(fā)的基本項目流程,具體的操作將在實訓(xùn)過程中一一講解驗證。
接下來老師為我們講解了實訓(xùn)的具體內(nèi)容,對于一個游戲開發(fā)項目,首先我們需要進(jìn)行游戲開發(fā)的前期準(zhǔn)備,主要是游戲開發(fā)環(huán)境的配置,以及團(tuán)隊開發(fā)過程中的任務(wù)分配,之后緊張的游戲項目開發(fā)拉開了帷幕。在第一天我們主要學(xué)習(xí)了eclipse軟件的使用,包括游戲工程的創(chuàng)建等等。并且針對eclipse中的 android項目結(jié)構(gòu)進(jìn)行了講解:android項目結(jié)構(gòu):src/ java原代碼存放目錄 gen/ 自動生成目錄 gen 目錄中存放所有由android開發(fā)工具自動生成的文件。目錄中最重要的就是r.java文件。這個文件由android開發(fā)工具自動產(chǎn)生的。res/ 資源(resource)目錄 在這個目錄中我們可以存放應(yīng)用使用到的各種資源,如xml界面文件,圖片或數(shù)據(jù)。assets資源目錄android除了提供/res目錄存放資源文件外,在/assets目錄也可以存放資源文件。androidmanifest.xml 項目清單文件。篇二:android實習(xí)報告
實習(xí)報告
實習(xí)目的:
生產(chǎn)實習(xí)是計算機(jī)科學(xué)與技術(shù)專業(yè)重要的實踐性教學(xué)活動,其目的是使學(xué)生們進(jìn)一步加深對所學(xué)知識的理解,理論聯(lián)系實際,鞏固所學(xué)有關(guān)計算機(jī)基礎(chǔ)理論知識和基本技能,學(xué)習(xí)有關(guān)計算機(jī)最新技術(shù)方面的應(yīng)用,增強(qiáng)學(xué)生對計算機(jī)在社會生活,社會生產(chǎn)中應(yīng)用的感性認(rèn)識,深入了解計算機(jī)在各個領(lǐng)域中的應(yīng)用狀況,學(xué)生在實習(xí)的同時,進(jìn)行一定的社會實踐與調(diào)查活動,對于提高學(xué)生的綜合能力和全面素質(zhì)具有重要意義。
實習(xí)內(nèi)容: android主要有四大組件,分別為:activity 活動、service 服務(wù)、broadcast receivers 廣播接受者、content provider 內(nèi)容提供者。還有上激活組件intent。1.activity activity就是一個用戶可以直接接觸并看到的窗口,當(dāng)新建一個android project后可以
看到在工程文件下的src中有一個已建好的java類firstactivity,系統(tǒng)也會自動為他配備一個布局文件main.xml,并在androidmanifest中對此activity進(jìn)行注冊。
用戶想要自己創(chuàng)建一個activity,首先創(chuàng)建一個java類繼承自activity,可以為他配備一個布局文件用來顯示activity創(chuàng)建后的布局。最后在主配置文件manifest.xml中對創(chuàng)建的activity進(jìn)行注冊,這一步是必不可少的,沒有注冊activity無法運行。在manifest.xml中會有許多的activity,但系統(tǒng)一次只能運行一個activity,因此必須修選定一個最先運行的activity。在注冊activity是加入
/files目錄,如: /data/data/cn.itcast.action/files/itcast.txt,通過點擊eclipse菜單“window”-“show view”-“other”,在對話窗口中展開android文件夾,選擇下面的file explorer視圖,然后在file explorer視圖中展開/data/data/
/files目錄就可以看到該文件。openfileoutput()方法的第二參數(shù)用于指定操作模式,有四種模式android有一套自己的安全模型,當(dāng)應(yīng)用程序(.apk)在安裝時系統(tǒng)就會分配給他一個userid,當(dāng)該應(yīng)用要去訪問其他資源比如文件的時候,就需要userid匹配。默認(rèn)情況下,任何應(yīng)用創(chuàng)建的文件,sharedpreferences,數(shù)據(jù)庫都應(yīng)該是私有的(位于/data/data/
/files),其他程序無法訪問。除非在創(chuàng)建時指定了context.mode_world_readable或者context.mode_world_writeable,只有這樣其他程序才能正確訪問。
實習(xí)流程: 2月18——2月27日,老師對于android開發(fā)進(jìn)行了詳細(xì)的講解,其內(nèi)容包括:android 的背景介紹,發(fā)展過程,自身的優(yōu)勢與不足.android的控件、布局、activity、service等一系列基礎(chǔ)知識,對整個android的開發(fā)有了大致的了解 2月28日——3月2日: 學(xué)生自己開發(fā)android 3gabs項目,老師答疑及驗收
實習(xí)心得:
時間過的飛快,半個月的實習(xí)就要結(jié)束了,在這次實習(xí)中我們不僅學(xué)習(xí)了相關(guān)的專業(yè)知識而且讓我對android系統(tǒng)又有了一個更加深入的了解,它也是我們計算機(jī)專業(yè)的一個新的方向并且發(fā)展很迅速,為了今后的發(fā)展我們還需不斷努力學(xué)習(xí)!我國的信息產(chǎn)業(yè)還很落后,隨著社會的發(fā)展和國家的支持,手機(jī)上網(wǎng)是社會發(fā)展的趨勢,到時候手機(jī)上網(wǎng)將無處不在!之前我對android系統(tǒng)的了解之停留在應(yīng)用的層次上,對于更深層次的了解是很少的,通過這次實習(xí),讓我對android系統(tǒng)有了一個更深層次的了解,同時它頁使我意識到無論朝哪個方向發(fā)展,主要還是要扎實深刻地學(xué)習(xí),同時也得不斷努力探索!it業(yè)發(fā)展速度一直都是相當(dāng)驚人的,不想被社會淘汰,我們就得必須不斷地學(xué)習(xí),現(xiàn)在的社會不再是一勞永逸,其他行業(yè)也是如此,我們必須不斷地拿知識來武裝自己,不然被淘汰那是肯定的!現(xiàn)在就業(yè)難原因其實在于競爭的家具,為了在競爭中得到成功,我們必須時時刻刻學(xué)習(xí),還學(xué)到了很多做人做事的道理,不僅懂得了要想在計算機(jī)這一行立足必須具備扎實的技術(shù)理論知識,還必須學(xué)會與人溝通,合作的能力,同時更懂得了嘗試的重要性,很多事情不是聽說是困難的它就是困難的,只有親自去做親自去體會才知道,其實它并沒有那么困難,這就是實踐的重要性!無論做什么事情都必須要堅持,只有堅持下去,才會成功!事在人為,就怕不做!我們不能怕失敗,關(guān)鍵是要從失敗中總結(jié)經(jīng)驗,帶著勇氣,帶著自信,堅持不懈,踏踏實實。這一次的實習(xí)是短暫的,但我收獲良多?;仡櫼郧八哌^的路,太多的無奈和迷茫,這次實習(xí)就像是我人生道路上的航標(biāo),為我指明了前景的方向,是我對自己的前途充滿了信心,我不僅知道了在人生的岔道口更適合朝哪個方向前進(jìn)!更知道了在今后的道路上怎么去武裝自己!
實習(xí)結(jié)果:篇三:android生產(chǎn)實習(xí)報告
生產(chǎn)實習(xí)報告
一 實習(xí)目地
生產(chǎn)實習(xí)是把理論與實際結(jié)合,通過對理論知識的理解,領(lǐng)悟從而運用到生活實際,鞏固所學(xué)的知識,提高對實際生活的認(rèn)識,積累經(jīng)驗。同時生產(chǎn)實習(xí)也是大學(xué)生以學(xué)生身份到工作者身份的一個重要過度階段。在此期間,學(xué)生能夠初次體會到實際生產(chǎn)中的種種技能與經(jīng)驗。完成一項項項目,能體現(xiàn)出獨立思考能力。android生產(chǎn)實習(xí)對目前應(yīng)用現(xiàn)狀進(jìn)行了分析與比較,進(jìn)而研究分析了android平臺的系統(tǒng)架構(gòu)和組件模型,在此基礎(chǔ)上,基于android平臺設(shè)計和開發(fā),實現(xiàn)對android編程的理解與應(yīng)用,特別是在對于控件的應(yīng)用產(chǎn)生很深的理解。android平臺是目前最普遍的手機(jī)應(yīng)用平臺,android實習(xí)可以讓我們與時代最新最廣泛的軟件開發(fā)聯(lián)系起來,鍛煉我們的學(xué)習(xí)能力,并且讓我們可以更加人性化,清晰的為用戶考慮。
二 實習(xí)內(nèi)容
此次實習(xí)是對android的簡單的應(yīng)用與開發(fā),也是對android各個控件的學(xué)習(xí)與實踐。在java的環(huán)境中對界面,應(yīng)用進(jìn)行編程。本次實習(xí)重點完成了安卓開發(fā)計算器、安卓開發(fā)學(xué)生注冊界面、安卓開發(fā)音樂播放器和安卓開發(fā)游戲連連看這四個項目。
做學(xué)生注冊界面的時候?qū)W習(xí)了linearlayout,tablelayout, absolutelayout, relativelayout四種布局,分別為線型布局,表格布局,絕對布局和相對布局,并知道了如何通過這四種布局的相互嵌套來使程序的界面更加的友好,更加的讓用戶接受。并簡單的了解了安卓目錄下src,gen,res等文件夾中的文件在項目中的作用,學(xué)習(xí)了切換界面的類intent。
然后學(xué)習(xí)了button,textview,seekbar等android開發(fā)的控件,并且將這些控件都運用到了所作的學(xué)生注冊界面中。
做音樂播放器時學(xué)習(xí)了關(guān)于音樂文件的調(diào)用,也學(xué)習(xí)了在主文件main.java中先創(chuàng)建多媒體對象后,然后通過sd卡的文件路徑來創(chuàng)建一個播放資源,然后在創(chuàng)建按鈕對象,同時添加6個按鈕對象創(chuàng)造各自的偵聽方法,我們用listactivity來布局播放界面,用imagebutton來實現(xiàn)播放器的開始,暫停的操作。最后在開發(fā)連連看游戲時,將前面所學(xué)的知識進(jìn)行綜合與加深,也學(xué)習(xí)到了新的函數(shù)與控件,該游戲主要包括classgameview(游戲視類,處理游戲中出現(xiàn)的情況,包括界面生成,算法等)classgameactivity(處理游戲中的消息提示),classstartactivity(游戲菜單設(shè)計),classsetactivity(菜單中游戲難度設(shè)定)這些類。比如用random函數(shù)來對連連看進(jìn)行重排列,還有用menu對游戲里的功能進(jìn)行操作,還有用之前學(xué)到關(guān)于多媒體對象的調(diào)用將連連看游戲進(jìn)行配樂。并且選用了網(wǎng)格對游戲界面進(jìn)行了規(guī)劃,以及對于相同圖片的的消去,必須滿足情況:1,圖片相同;2,兩個圖片之間必須沒有障礙物,可以用若干個垂直的直線連接起來;3,連接兩個圖片的直線線段的轉(zhuǎn)折點不超過兩個(連接線由x軸和y軸 的平行線組成,即無拐點,一個拐點,兩個拐點)。
三 實習(xí)流程
此次對android應(yīng)用與開發(fā)的實習(xí)分為以下幾個階段。
首先,由老師帶領(lǐng)我們對android以及開發(fā)軟件eclimpse進(jìn)行了一個大概的了解與操作,并且對開發(fā)語言基礎(chǔ)java的基礎(chǔ)知識和編程思想進(jìn)行了一次簡單的復(fù)習(xí)與加深。
然后老師開始帶領(lǐng)我們學(xué)習(xí)android界面的開發(fā),并且告訴我們?nèi)绾慰梢詫⒔缑姹M量做得美觀與方便,告訴我們作為程序的開發(fā)人員要為用戶考慮,在這一階段,我們開始試著學(xué)習(xí)和操作android的簡單控件,包括textview,button等。
接著我們開始自己開發(fā)計算器,第一次將自己學(xué)到的控件進(jìn)行組合搭配,并且開始學(xué)會怎么去監(jiān)聽按鈕,通過對安卓常用類的學(xué)習(xí),我們完成了計算器的常用功能。然而,對于計算機(jī)功能的實現(xiàn),我感覺自己還沒有辦法做到自己想到的所有功能這讓我對android更加滿興趣的學(xué)習(xí)下去。
當(dāng)初步接觸到了控件的開發(fā)與搭配后,我們開始開發(fā)學(xué)生注冊界面,并且將所輸入的信息反應(yīng)到下一個界面中,在做這個的時候,我們又新學(xué)習(xí)了seekbar,checkbox等控件,讓我們進(jìn)一步學(xué)習(xí)了android中的常用控件。
然后是對音樂播放器的開發(fā),此階段我開始真正的接觸到了生活中自己經(jīng)常用到的軟件的開發(fā),并且也讓我第一次感覺到需要將自己開發(fā)的軟件做的美觀,于是我們開始學(xué)會調(diào)用背景圖片,調(diào)用歌曲,并且學(xué)習(xí)了radiobutton控件,以及播放器中對音樂的下跳,循環(huán)播放等功能的學(xué)習(xí)與實現(xiàn)。
最后是開發(fā)游戲“連連看”,在此之前老師先向我們介紹了對于圖片的處理等相關(guān)知識。
對于連連看,我們很熟悉,也明白其中的游戲規(guī)則;然而把它們用計算機(jī)語言展示出來卻比用文字語言展示出來要難上很多。因此這個項目也是用時最多的一個項目,期間融合了算法設(shè)計以及之前幾個項目所學(xué)的知識。雖然在參考資料
下,完成了項目;但是也存在很多不足。當(dāng)然也有自己特點的地方,比如添加了成功幾步就獎勵時間,比如游戲的配備音樂,以及音樂的開關(guān)按鈕。
四 實習(xí)心得
通過這三個星期的畢業(yè)實習(xí),我學(xué)到了很多關(guān)于android系統(tǒng)的技術(shù)知識,雖然實習(xí)的時間短暫但我仍舊收獲很多。首先,在每一天我認(rèn)識了新的控件及相關(guān)的使用;其次,我們了解android系統(tǒng)的歷史和今后的發(fā)展以及相關(guān)android系統(tǒng)的總體構(gòu)成,然后,我們學(xué)會了android編譯系統(tǒng)的搭建,以及在這個環(huán)境下編寫代碼,最后制作了簡單的音樂播放器以及連連看游戲等軟件;在這個過程中,我真正的了解到了理論與實際相結(jié)合的必要性以及獨立思考的重要性。
生成實習(xí)是為將來打基礎(chǔ)的重要階段,珍惜自己每一個工作的機(jī)會,不論什么人,什么學(xué)歷,從事什么工作,好好的表現(xiàn)、展示自己的能力,不要錯過好的機(jī)遇。沒有一件事情是輕輕松松的,但每一件事都是讓人成長的,經(jīng)歷一段過程,喜悅或是艱辛,盡管經(jīng)歷的方式不盡相同,但它的結(jié)果是相同的,我們都會因涉事而成長。通過這次實習(xí),開闊了我的視野。這次的實習(xí)初步為我解開了安卓的神秘面紗,對于腦海中的那個可望而不可即,可玩兒不可解的安卓平臺初步走入了它的神秘世界;既感到興奮又感到驚奇,更感到壓力,方知知識海洋的廣大,學(xué)員任重道遠(yuǎn)。這次實習(xí)讓我看清自己需要什么,同時也讓我吸取了許多學(xué)習(xí)以及和人相處的經(jīng)驗,這將對我以后踏足社會,謀生立業(yè)有很好的借鑒和幫助作用。今后,我會珍惜這些寶貴的經(jīng)驗,在人生的旅途中勇往直前,迎接時代的挑戰(zhàn)。篇四:安卓實訓(xùn)報告
實習(xí)報告書
專 業(yè) 計算機(jī)科學(xué)與技術(shù) 系 別
報告題目
安卓
報告人 班
級
指導(dǎo)教師
帶隊教師 實習(xí)時間 實習(xí)地點
教務(wù)處監(jiān)制 篇五:安卓記事本實習(xí)報告 android記事本的設(shè)計與實現(xiàn) ——sqlite數(shù)據(jù)庫的設(shè)計和操作
學(xué)生姓名: 指導(dǎo)老師:
摘 要: 隨著智能手機(jī)的快速普及,智能手機(jī)操作系統(tǒng)市場風(fēng)生水起。android的最大特點是其開放性體系架構(gòu),不僅具有非常好的開發(fā)、調(diào)試環(huán)境,而且還支持各種可擴(kuò)展的用戶體驗,包括豐富的圖形組件、多媒體支持功能以及強(qiáng)大的瀏覽器。
本文主要介紹了一款android記事本sqlite數(shù)據(jù)庫模塊的設(shè)計與實現(xiàn)。根據(jù)人們?nèi)粘I畹男枰?,該記事本的?nèi)容包括運用sqlite封裝好的方法對數(shù)據(jù)進(jìn)行添加、刪除、修改、更新和密碼進(jìn)入等功能,并且將查詢到的數(shù)據(jù)傳遞給activity,具有一定的實用性。關(guān)鍵詞: 記事本;android;手勢密碼;sqlite;activity design and implementation of android notepad — design and operation of the sqlite database student name: advisor: this paper describes the design and implementation of an android notepad sqlite database module.according to the needs of daily life, including the contents of the notepad good way to use sqlite package data to add, delete, modify, update and password to access other functions, and query the data is passed to the activity, has a certain practicality.keywords notepad;android;gesture password;sqlite;activity 目錄 目錄.....................................................................................................................................................................3 1.引言...............................................................................................................................................................4 1.1 項目背景..............................................................................................................................................4 1.2 項目意義..............................................................................................................................................4 1.3 系統(tǒng)可行性分析..................................................................................................................................5 1.4 系統(tǒng)主要任務(wù)....................................................................................................................................5 2.系統(tǒng)方案設(shè)計.................................................................................................................................................6 2.1 搭建android開發(fā)平臺.....................................................................................................................6 2.2 sqlite數(shù)據(jù)庫簡介............................................................................................................................7 2.3 總體方案設(shè)計...................................................................................................................................10 3.系統(tǒng)軟件開發(fā)環(huán)境.......................................................................................................................................10 3.1 windows開發(fā)環(huán)境...........................................................................................................................10 3.2 java集成開發(fā)環(huán)境eclipse...........................................................................................................11 3.3 adt plugin for eclipse...............................................................................................................11 4.程序設(shè)計.......................................................................................................................................................12 4.1 程序詳細(xì)設(shè)計...................................................................................................................................12 4.2 程序運行及效果截圖.......................................................................................................................13 4.3 對sqlite數(shù)據(jù)庫增刪改查代碼實現(xiàn).............................................................................................18 5.工作總結(jié)與展望...........................................................................................................................................23 參考文獻(xiàn)...........................................................................................................................................................24 1.引言
1.1 項目背景 window操作系統(tǒng)的誕生成就了微軟帝國,同時也造就了pc時代的繁榮,然而如今,以android和iphone手機(jī)為代表的智能移動設(shè)備的發(fā)明與互聯(lián)網(wǎng)云技術(shù)的興起卻敲響了pc時代的喪鐘!這也預(yù)示著移動互聯(lián)網(wǎng)時代(3g)已經(jīng)來臨。在這個互聯(lián)網(wǎng)繁榮的時代,有一顆超新星,以它獨特性能優(yōu)勢與人性化的ui設(shè)計使它在短短的幾年迅速的占領(lǐng)了智能移動設(shè)備的市場份額,它就是google的android!這也意味著google在移動互聯(lián)網(wǎng)時代開始搶跑并領(lǐng)跑。
通過調(diào)查顯示,大部分消費者都會使用手機(jī)記事本功能。隨著手機(jī)記事本功能的不斷加強(qiáng)與完善,手機(jī)記事本對于人們的意義,已不僅僅像一般記事簿一樣簡單記錄,而是向著更個性化人性化的方向發(fā)展。android[1]系統(tǒng)是開源的,它以迅猛的姿勢已經(jīng)占領(lǐng)了全球一半多的市場。記事本在生活和工作也日益凸顯出它的重要性,它能更好地幫助人們更好地管理自己的工作和生活,極大的方便了人們的生活。因其開源,我們可以在之上開發(fā)安卓記事本軟件,同時這也符合廣大的市場需求。1.2 項目意義 近幾年來隨著3g技術(shù)成熟和智能手機(jī)的不斷普及,移動應(yīng)用的需求與日俱增,移動應(yīng)用開發(fā)成為當(dāng)下最熱門的技術(shù)之一。在google和android手機(jī)聯(lián)盟的共同推動下,android在眾多移動應(yīng)用開發(fā)平臺中脫穎而出。android是一個真正意義上的開源智能手機(jī)操作系統(tǒng),該系統(tǒng)一經(jīng)推出立即受到全球移動設(shè)備廠商和開發(fā)者的熱捧。
我們都知道,無論是產(chǎn)品還是技術(shù),商業(yè)應(yīng)用都是它最大的發(fā)展動力。安卓如此受到廠商與開發(fā)者的青睞,它的前景是一片光明的。國內(nèi)對于安卓這方面的市場還沒有完全開發(fā)出來。只要我們努力學(xué)習(xí)安卓,對理想,對生活都會有很大的補(bǔ)益。因此,開發(fā)這樣一套很簡單的記事本軟件對我們來講是一件很有必要的事情,在下面的各章中我們將以開發(fā)安卓記事本軟件為例,談?wù)勂溟_發(fā)過程和所涉及到的問題及解決方法。1.3 系統(tǒng)可行性分析 1.3.1 課題調(diào)研
(1)與實踐活動和相關(guān)的文件和資料由作者本人網(wǎng)絡(luò)查找,以及老師幫助。
(2)具有遇到問題,具有獨立思考,耐心鉆研,向老師虛心求教的良好態(tài)度。
(3)關(guān)于技術(shù)方面的難題,跟指導(dǎo)老師面談。1.3.2 可行性分析
(1)技術(shù)可行性:本項目僅需要一臺裝有eclipse及配置好android開發(fā)環(huán)境的計算機(jī)即可,對計算機(jī)本身有一定的要求,它可以使用windows xp及其以上版本,mac os,linux等操作系統(tǒng)。
(2)經(jīng)濟(jì)可行性:由于本軟件開發(fā)只有三個人,三臺電腦就行,基本不需要太大的成本.在經(jīng)濟(jì)上完全可行。
(3)操作可行性:界面設(shè)計時充分考慮用戶的習(xí)慣以及手機(jī)方面的局限性,程序必須要很簡單;本程序只涉及到開發(fā)環(huán)境配置,安卓組件的熟悉,以及安卓平臺上的數(shù)據(jù)存儲。并沒有太大的難度,所以,該項目完全有可操作性。1.4 系統(tǒng)主要任務(wù)(1)設(shè)計實現(xiàn)”添加新記事”,”編輯內(nèi)容”,”刪除當(dāng)前記事”這三個主要的功能模塊。(2)分析并解決實現(xiàn)中的若干技術(shù)問題,像組件的選擇以及保存方式的選擇。(3)進(jìn)行測試并分析結(jié)果。
當(dāng)然記事本的基本功能,建立新文件、修改現(xiàn)有文件、刪除文件、查看已建立文件等功能是首先必須完成的??梢跃帉憙?nèi)容,編輯及刪除,讓記事的方式多樣化。記事本軟件的界面設(shè)計力求簡潔,給人清爽的感覺,讓圖標(biāo)及按鈕以協(xié)調(diào)的布局呈現(xiàn)出了,菜單功能要相對簡單,讓用戶操作方便,從而讓用戶體會到此款軟件的實用。因為上述操作涉及到的數(shù)據(jù)量不大,所以將數(shù)據(jù)庫定為安卓系統(tǒng)自帶的sqlite數(shù)據(jù)庫[3],所以這就要求我們要實現(xiàn)在sqlite數(shù)據(jù)庫上面的增刪改查。不少人希望自己記事本上面的內(nèi)容不被被人查看,所以要以設(shè)置密碼的形式來實現(xiàn)保密。鑒于各種各樣的密碼實現(xiàn)方式,我們選擇了用戶體驗最好的手勢解鎖方式。以及采用了更加友好的時間顯示方式,讓用戶在使用過程中更加的舒服方便。記事本軟件要內(nèi)存占用適中,cpu占用也是適中,這樣讓軟件運行順暢。
第四篇:安卓課程設(shè)計報告
安 卓 課 程 設(shè) 計
班 級 09級計算機(jī)二班
學(xué) 號 20097923 姓 名 郭丹
目錄
第1章
安卓應(yīng)用程序開發(fā)背景..........................................................3 §1.1開發(fā)背景...................................................................................3 §1.2開發(fā)環(huán)境...................................................................................4 第2章 第3章 §3.1 §3.2 §3.3 第4章
安卓應(yīng)用程序開發(fā)理論與方法..............................................4 “計算器”應(yīng)用程序的設(shè)計與實現(xiàn).......................................6 擬解決的問題及目標(biāo).............................................................6 總體設(shè)計................................................................................7 詳細(xì)設(shè)計與編碼實現(xiàn).............................................................7 總結(jié).......................................................................................17 2
第1章
安卓應(yīng)用程序開發(fā)背景
§1.1開發(fā)背景
1.智能手機(jī)的市場
(1)功能多樣化的智能手機(jī)挑戰(zhàn)全球PC出貨量
移動互聯(lián)網(wǎng)時代的來臨,直接促進(jìn)了搭載智能操作系統(tǒng)、具有強(qiáng)大擴(kuò)展性的智能手機(jī)、平板電腦等移動終端產(chǎn)業(yè)的蓬勃發(fā)展。來自美國最大的風(fēng)險投資機(jī)構(gòu)KPCB的數(shù)據(jù)顯示,全球智能手機(jī)出貨量正在以遠(yuǎn)高于臺式電腦、筆記本電腦出貨量的速度快速增長,該機(jī)構(gòu)預(yù)計2011年全球智能手機(jī)出貨量將達(dá)到4.13億,超過臺式電腦與筆記本電腦出貨量的總和。
(2)智能手機(jī)的用戶使用數(shù)量正在高速增長。據(jù)市場調(diào)研機(jī)構(gòu)Gartner信息,2011年全球智能手機(jī)的總出貨量將會達(dá)到4.68億部,相比2010年實現(xiàn)了57.7%的增長,而谷歌Android操作系統(tǒng)將會在今年之內(nèi)成為全球最大的智能手機(jī)操作系統(tǒng)。另外,全球市場調(diào)研機(jī)構(gòu)IDC預(yù)計未來5年中國手機(jī)市場上,智能手機(jī)替代傳統(tǒng)功能手機(jī)的趨勢將日益明顯,未來5年中國智能手機(jī)市場復(fù)合增長率將達(dá)到34.1%,人們對IT設(shè)備智能化的向往是這一增長率能夠?qū)崿F(xiàn)的主要因素,并且與其他國家相比,中國智能手機(jī)市場的發(fā)展空間更加廣闊。(3)操作系統(tǒng)格局預(yù)測:Android有望成為智能手機(jī)市場主導(dǎo)力量
搭載Android操作系統(tǒng)的智能手機(jī)目前已經(jīng)成為市場上最炙手可熱的智能產(chǎn)品。來自美國市場研究機(jī)構(gòu)Gartner的數(shù)據(jù)顯示,Android操作系統(tǒng)所占的市場份額從2008年的0.5%急劇增長到2011年的15.94%。開放的源代碼和零成本已經(jīng)讓Android在全世界范圍內(nèi)受到青睞并迅速獲得了主要手機(jī)廠商和數(shù)百萬軟件開發(fā)者的支持,Gartner預(yù)計,未來Android系統(tǒng)的市場份額有望超過其他操作系統(tǒng),從而成為全球第一大智能手機(jī)操作系統(tǒng)。2.安卓手機(jī)介紹
安卓手機(jī)指的是用Android操作系統(tǒng)的手機(jī)。安卓(Android)是基于Linux內(nèi)核的操作系統(tǒng),是Google公司在2007年11月5日公布的手機(jī)操作系統(tǒng)。
同樣都是手機(jī)上面用的智能系統(tǒng),安卓的系統(tǒng)是新生系統(tǒng),界面更為華麗,開源性更強(qiáng),當(dāng)然因為是新生系統(tǒng),所以在第三方軟件方面暫時還不太多。因此,安卓應(yīng)用程序的需求還是很迫切的。3.軟件人才需求
據(jù)業(yè)內(nèi)統(tǒng)計,目前國內(nèi)的Android研發(fā)人才缺口至少30萬。由于目前Android技術(shù)較新,無論是相關(guān)書籍、培訓(xùn)還是大學(xué)教育,都處于初級階段,因此Android人才短期將供不應(yīng)求。從長期來看,隨著各種移動應(yīng)用和手機(jī)游戲等內(nèi)容需求日益增加,也將激勵大中小型手機(jī)應(yīng)用開發(fā)商加大對Android應(yīng)用的開發(fā)力度,因此Android人才的就業(yè)前景也非常廣泛。
綜上所述,在這樣的背景下,安卓有很強(qiáng)的生命力。同時,作為一個新生的系統(tǒng),其應(yīng)用程序目前并不多,安卓應(yīng)用程序的需求還是很迫切的,安卓研發(fā)人才的缺口還很大。這些都促進(jìn)了我們學(xué)習(xí)開發(fā)安卓應(yīng)用程序。
§1.2開發(fā)環(huán)境
安卓應(yīng)用程序開發(fā)環(huán)境如下:
①JDK 5 or JDK 6(JRE alone is not sufficient)②Eclipse 3.3(Europa), 3.4(Ganymede)③Android SDK ④ADT 0.8.0 ⑤Eclipse安裝ADT 插件
第2章
安卓應(yīng)用程序開發(fā)理論與方法
1、Activity的相關(guān)知識
簡單理解Activity 代表一個用戶所能看到的屏幕,Activity 主要是處理一個應(yīng)用的整體性工作。Activity是最基本的Android 應(yīng)用程序組件,應(yīng)用程序中,一個活動通常就是一個單獨的屏幕。每一個活動都被實現(xiàn)為一個獨立的類,并且從活動基類中繼承而來,活動類將會顯示由視圖控件組成的用戶接口,并對事件做出響應(yīng)。大多數(shù)的應(yīng)用是由多個屏幕顯示組成,因而要用到多個Activity。(1)Activity的相關(guān)方法及相關(guān)函數(shù): A、void onCreate(Bundle)首次啟動時調(diào)用,接受參數(shù):Null or savedInstanceState(保存的以前某些狀態(tài)信息)B、void onStart()說明了將要顯示給用戶的活動
C、void onRestart()將處于停止?fàn)顟B(tài)的活動重新顯示給用戶 D、void onResume()用戶可以開始與活動進(jìn)行交互時調(diào)用。如動畫播放和音樂播放。E、void onPause()活動將要進(jìn)入后臺運行時調(diào)用。(此時前臺啟動了另一個活動)F、void onStop()不需要某個活動了,就調(diào)用 G、void onDestroy()銷毀活動
(2)多個Activity之間的跳轉(zhuǎn):
通過Intent類實現(xiàn)屏幕之間的跳轉(zhuǎn)(包括沒有參數(shù)關(guān)系和需要傳遞參數(shù)兩種情況)。
(3)兩個Activity之間進(jìn)行數(shù)據(jù)交換: startActivity()只有Intent一個參數(shù)。
public void startSubActivity(Intent intent, int requestCode)(requestCode:用來標(biāo)識某一個調(diào)用,一般定義一個常量。)
傳過去:函數(shù)原型為: public Intent setData(ContentURI data)然后,參數(shù)帶到新的Activity后,同樣用Activity.getIntent()函數(shù)可得到當(dāng)前過來的Intent對象,然后用getData()就取到參數(shù)了。傳回來:函數(shù)原型為: public final void setResult(int resultCode, String data)
2、Intent的相關(guān)知識 Intent 是描述應(yīng)用想要做什么。Android 使用了Intent 這個特殊類,實現(xiàn)在屏幕與屏幕之間移動。Intent 數(shù)據(jù)結(jié)構(gòu)兩個最重要的部分是動作和動作對應(yīng)的數(shù)據(jù)。Intent類綁定一次操作,它負(fù)責(zé)攜帶這次操作所需要的數(shù)據(jù)以及操作的類型等。
3、Layout 用于用戶界面設(shè)計。包含AbsoluteLayout,F(xiàn)rameLayout,GridView,LinearLayout,ListLayout,RadioGroup,TableLayout等等。
在本程序中用到的有:(1)線性布局LinearLayout 垂直:android:orientation=“vertical“ 水平:android:orientation=”horizontal“(2)相對布局RelativeLayout 讓子元素指定它們相對于其他元素的位置(通過ID 來指定)或相對于父布局對象。在RelativeLayout布局里的控件包含豐富的排列屬性: Layout above:控件在指定控件的上方
Layout below:控件在指定控件的下方 Layout to left of??
第3章
“計算器”應(yīng)用程序的設(shè)計與實現(xiàn)
§3.1 擬解決的問題及目標(biāo)
本計算器程序要解決日常生活中常見的基本數(shù)據(jù)計算問題,程序要實現(xiàn)的目標(biāo)有如下幾個:
(1)要實現(xiàn)基本的加、減、乘、除四則運算。
(2)可以實現(xiàn)在前一步計算結(jié)果上繼續(xù)作加、減、乘、除,即連加、減、乘、除。
(3)有清空功能,即清除所有數(shù)據(jù),重新開始計算。
(4)可實現(xiàn)基本的三角函數(shù)的計算,如:正弦,余弦,正切,余切。(5)可實現(xiàn)一些特殊運算,如:平方,立方,開方,求對數(shù)等。
§3.2 總體設(shè)計
1、系統(tǒng)的軟件結(jié)構(gòu)圖
計算器基本加減乘除運算三角函數(shù)運算其他運算加減乘法法法除法正弦余弦正余切切平方立方開方對數(shù) 圖3-1
2、功能的操作流程
首先用戶根據(jù)自己的實際需要選擇計算的類型,然后進(jìn)入不同的計算類型,再進(jìn)行要執(zhí)行的運算,輸入數(shù)據(jù),選擇運算符號,即可得到結(jié)果。
§3.3 詳細(xì)設(shè)計與編碼實現(xiàn)
1、功能選擇界面
圖3-2為系統(tǒng)主界面。用戶可以根據(jù)需要點擊不同按鈕進(jìn)入不同功能的子界面。亦可以點擊退出按鈕退出本程序。
圖3-2
本界面用LinearLayout來布局,主要用到的控件是Button。頁面的跳轉(zhuǎn)是通過intent來是實現(xiàn)的。跳轉(zhuǎn)的主要代碼如下: public void onClick(View v)
{
Button btn=(Button)v;switch(btn.getId()){ case R.id.button1: Intent intent=new Intent();intent.setClass(mycalActivity.this, secondactivity.class);startActivity(intent);break;
case R.id.button2: Intent intent=new Intent();intent.setClass(mycalActivity.this, thirdactivity.class);
startActivity(intent);break;
case R.id.button3: Intent intent=new Intent();intent.setClass(mycalActivity.this, forthactivity.class);startActivity(intent);break;
case R.id.button4: finish();
}
2、基本加減乘除界面
圖3-3為加基本減乘除界面。用戶在文本框中輸入?yún)⒓舆\算的數(shù)據(jù),并點擊要進(jìn)行的運算符號,然后點擊等號之后,將在等號下方顯示結(jié)果處顯示出計算結(jié)果。點擊clear按鈕,可以將兩個文本框中的內(nèi)容以及顯示的結(jié)果一起清空,用戶可以輸入新的數(shù)據(jù)計算。
在文本框中輸入時可以用圖右側(cè)的硬鍵盤,或者是手機(jī)自帶的軟鍵盤。
圖3-3
示例如下:
(1)用戶要計算1.23+2.16.在文本框1中輸入1.23,點擊“+”,再在文本框2中輸入2.16,點擊“=”,就可以顯示出計算結(jié)果3.39.如下:
圖3-4
(2)計算1-0.32,如圖3-5 圖3-5
(3)計算3.24*0.25,如圖3-6所示。
圖3-6
4)計算55/4,結(jié)果為13.75.如下圖所示:(圖3-7
(5)計算1/6.如下圖所示。由圖3-8可以看出,當(dāng)除不盡時本計算器保留到8位小數(shù),并且最后一位采用了四舍五入的方法,比較科學(xué)、準(zhǔn)確。
圖3-8(6)點擊clear之后全部清空:
圖3-9
具體的實現(xiàn):主要的思路是,用戶先輸?shù)谝粋€數(shù),然后點擊運算符號,在程序中監(jiān)聽按鈕的點擊,如果點擊了+、--、*、/中某一按鈕,這時,就取editText1中的值,通過myeditText1= editText1.getText().toString()實現(xiàn),為了參與運算,需要把字符串類型轉(zhuǎn)換為浮點型,并將其值賦給變量a,代碼為a=Float.parseFloat(myeditText1);用flag的不同值記錄用戶點擊的不同的運算按鈕。當(dāng)用戶點擊“=”時,就將editText2中的內(nèi)容取出,也同樣轉(zhuǎn)化為數(shù)值,并用b記錄,然后判斷flag的值即可知道對應(yīng)應(yīng)采取哪種計算,進(jìn)而算出最終結(jié)果,并用textView1顯示出計算結(jié)果?!扒蹇铡钡膶崿F(xiàn)是使對應(yīng)控件的內(nèi)容取空即可。核心代碼如下:
private OnClickListener listener=new OnClickListener(){
String myeditText1;String myeditText2;float a=0;int flag=0;
float b=0;float result;public void onClick(View v){
Button btn=(Button)v;switch(btn.getId()){ case R.id.button1: myeditText1= editText1.getText().toString();
flag=1;
break;case R.id.button2:
myeditText1= editText1.getText().toString();
a=Float.parseFloat(myeditText1);
flag=2;break;case R.id.button3:
myeditText1= editText1.getText().toString();
a=Float.parseFloat(myeditText1);
flag=3;break;case R.id.button4:
myeditText1= editText1.getText().toString();
a=Float.parseFloat(myeditText1);
flag=4;break;case R.id.button5:
myeditText2= editText2.getText().toString();b=Float.parseFloat(myeditText2);
a=Float.parseFloat(myeditText1);
};
}
if(flag==1)result = a+b;
else if(flag==2)result = a-b;else if(flag==3)result = a*b;
else
result=a/b;
String s = ”顯示結(jié)果: “;s += result;
textView1.setText(s);break;case R.id.button6:
} editText1.setText(”“);editText2.setText(”“);textView1.setText(”顯示結(jié)果:");break;
3、三角函數(shù)運算界面
圖3-10為三角函數(shù)運算界面。用戶在文本框中輸入?yún)⑴c計算的數(shù)據(jù),然后選擇點擊要進(jìn)行的運算類型,這時在顯示結(jié)果處就會顯示計算結(jié)果。例如,要計算sin30度,先在文本框中輸入30,然后點擊sin按鈕,這時就會顯示結(jié)果為0.5.同理,可進(jìn)行其他計算。
圖3-10
4、其他運算界面
圖3-11為其他運算界面,目前可實現(xiàn)平方、立方、開方、求以10為底的對數(shù)四種運算,由于時間有限,這個界面目前功能并不完善,暫時實現(xiàn)四種運算,不過,基于本計算器程序的設(shè)計理念,本界面主要實現(xiàn)一些其他運算,包括一些特殊運算。在今后,這個界面可以修改和擴(kuò)充,以至擁有更加完善豐富的計算功能。在現(xiàn)有的界面上的操作流程如下:用戶在文本框中輸入要進(jìn)行運算的數(shù)據(jù),然后選擇點擊運算按鈕,即可顯示運算結(jié)果。如輸入0.5,點擊平方,即顯示結(jié)果0.25,操作方便。
圖3-11
第4章
總結(jié)
在本次安卓應(yīng)用程序開發(fā)之中,我收獲很多,現(xiàn)總結(jié)如下:
安卓設(shè)計開發(fā)過程初期,我打算設(shè)計制作一個計算器。但是,剛開始并不能預(yù)測難度,不知道在短期內(nèi)能否很好的完成,于是我的想法是,先實現(xiàn)基本的加、減、乘、除四則運算,然后在此基礎(chǔ)上進(jìn)一步完善豐富其運算功能。首先遇到的問題便是要不要做一個數(shù)字鍵盤。剛開始也試著做了一個鍵盤,是用button做的,需要很好的布局,但是每當(dāng)擴(kuò)充一種功能時,為了使界面整體美觀,甚至都要重新設(shè)計,很麻煩。后來候突然想到手機(jī)有硬鍵盤,也有自帶的軟鍵盤,何不運算的時候直接調(diào)出已有的軟鍵盤?這樣,根本沒有什么必要自己做鍵盤了,而只需做出運算的按鈕即可了。由于當(dāng)時的目標(biāo)只是實現(xiàn)加減乘除,因此設(shè)計的界面是用兩個文本框輸入兩個數(shù)據(jù),然后有+、-、*、/四個按鈕供選擇,又加一個“=”按鈕用于觸發(fā)顯示結(jié)果。界面很簡單,使用很方便。然后就是才用合適的算法來實現(xiàn)功能。經(jīng)過思考和多次修改,最后確定了一種比較簡明的算法實現(xiàn)。
基本加減乘除功能已經(jīng)實現(xiàn),但是計算器的功能過于簡單了,接下來便是擴(kuò)充功能。我首先想到的是需要能實現(xiàn)三角函數(shù)運算,常見的平方、開方等運算。但是我遇到了困難。由于剛開始設(shè)計的加減乘除運算都是二元運算,因此界面設(shè)計的是在兩個文本框中輸入兩個數(shù),但是三角函數(shù)計算,平方開方計算都是一元運算,參加運算的數(shù)據(jù)都只有一個,因而,在原界面上直接擴(kuò)充并不合適,兩個文本框成了擴(kuò)充的限制。后來經(jīng)過思考,決定將這些擴(kuò)充的功能做到別的界面上,與已有的界面相獨立,重新設(shè)計,這樣只需將運算分類,再做一個功能選擇的界面,點擊不同的運算類別進(jìn)入不同的運算界面即可,這樣這個問題便得到了很好的解決。但是這次設(shè)計卻給了我很大的教訓(xùn),開發(fā)應(yīng)用軟件的初期設(shè)計很重要,不僅要實現(xiàn)現(xiàn)在的目標(biāo),還要考慮以后能否進(jìn)行功能擴(kuò)充,設(shè)計要便于以后的功能擴(kuò)充,否則,到后來需要擴(kuò)充時遇到困難,甚至要推翻已有的設(shè)計,花費很大的代價。另外,由于時間緊迫,三角函數(shù)界面和其他運算界面的功能并不十分完善,只是一些基本的運算,初步體現(xiàn)出了設(shè)計的思想,今后還可以進(jìn)行進(jìn)一步的擴(kuò)充,以完善其功能。
在本次開發(fā)過程中,我對開發(fā)環(huán)境進(jìn)一步的熟悉,基本上可以熟練運用這個 環(huán)境,也基本掌握了安卓的開發(fā)方法及基本流程。在本次開發(fā)過程中,主要用到的知識有Activity的使用,在程序中用到了多個窗口,因而需創(chuàng)建多個Activity。還用到了Intent,主要是用于多個Activity之間的跳轉(zhuǎn),對Intent的作用和用法有了更進(jìn)一步的熟悉。在本次程序設(shè)計中,我也對用戶界面設(shè)計有了更進(jìn)一步的掌握,熟練運用Layout,本次用到的主要是LinearLayout和RelativeLayout。
開發(fā)期間,我學(xué)會了有目的的去學(xué)習(xí)一些將要用到的東西,仔細(xì)地考慮工作流程的規(guī)律和步驟,充分利用手中的開發(fā)工具,利用其所具備的功能,盡量使自己的開發(fā)在代碼上實現(xiàn)少而精確、讓用戶能夠盡量簡單地進(jìn)行操作。但是在檢測過程中,還是出現(xiàn)了很多的不足之處,這些都是要在今后的工作中需要努力改進(jìn)和完善的。
在這次程序開發(fā)設(shè)計中,我也難免會遇到不少困難,這主要是由于我對所用的開發(fā)環(huán)境并不是很熟悉,開發(fā)軟件的經(jīng)驗不足。安卓開發(fā)用的語言是java,但是我對java的學(xué)習(xí)并不多,這次開發(fā)對我來說可以算是一個全新的嘗試,整個開發(fā)過程并不是很順利,卻使我從中充分體會到學(xué)習(xí)的快樂,開發(fā)的程序也在一步步得到完善。這次程序開發(fā)由于個人水平及時間有限等原因,只能完成一些基本的功能,好多設(shè)想并未完全實現(xiàn),這不能不說是個遺憾,后期仍需努力。
第五篇:安卓 課程學(xué)習(xí)心得
心得體會
學(xué)號: 姓名: 班級:
一開始接觸 Android 是從自己的手機(jī)開始的,覺得它很酷,是我喜歡的風(fēng)格,然后我就通過了一些網(wǎng)絡(luò)渠道去了解Android。在選課的時候發(fā)現(xiàn)有這個課程,于是我就報名了。剛開始接觸 Android開發(fā)時感覺到它很有意思,在界面開發(fā)上和 web 也可以形成了相通的架構(gòu),更加方便,視覺上也是非常的酷。Android作為新興的手機(jī)操作系統(tǒng),適應(yīng)潮流的發(fā)展,在一定程度上迎合了現(xiàn)代人們最求效率和最求完美的心態(tài),再加上的它的先進(jìn)之處,所以 Android 的發(fā)展很快,Android 的應(yīng)用資源也越來越廣泛,現(xiàn)在的 Android 正在快速形成一個只能手機(jī)王國,給人們提供日常娛樂和辦公的平臺,無論在哪些方面,Android 的表現(xiàn)總是能夠讓人滿意,它正在快速地占領(lǐng)手機(jī)終端,未來的智能手機(jī)領(lǐng)域?qū)⑹?Android 的天下,越來越多的人選用 Android平臺的手機(jī)。如果說追求蘋果是因為蘋果的高端與美感,那么追求 Android 則是因為它的先進(jìn)性開源性,也正是因為 Android 這些吸引人們矚目的特點,才會有越來越多的人對 Android 充滿激情,Android 的發(fā)展也才能這樣的迅猛,所以在這里要先謝謝 Goolge,以及那些充滿激情的開發(fā)者們。首先在界面上,我們同樣可以通過不同布局進(jìn)行設(shè)計非??岬慕缑?,這些界面可以通過 include 進(jìn)行引入,我們可以通過一些公用的方法寫個 BaseActivity 這個基類,通過繼承方式比較不錯的實現(xiàn)了 Activity 的界面,因為這樣你可以 Header(頭部)和 Footer(尾部)進(jìn)行處理一些觸發(fā)事件或者特效等。布局模式以相對模式為主,線線布局模式可以在比較簡單的 include 進(jìn)行完成,最重要的一點就是:我們可以自己通過重寫方法或者通過實現(xiàn) View 或者 Layout 等類進(jìn)行擴(kuò)充項目需要的布局(或者控件),在學(xué)習(xí)界面中,Android 為我們提供了很好的類似反射機(jī)制,通過 Layout 文件夾下的配置文件,可以快速的形成界面,在配置文件可以設(shè)置屬性或者樣式都是很快捷方便。對比較特殊的界面也可以通過處理嵌入到指定的界面,同樣可以通過java 代碼直接創(chuàng)建View 進(jìn)行添加,不過這種方式比較復(fù)雜。對一些點擊、選中、按鍵等處理的事件,界面之間的 跳轉(zhuǎn) Intent 管理,通過 Bundle 對數(shù)據(jù)在界面之間進(jìn)行傳輸。其次在手機(jī)交互式通信服務(wù)中,學(xué)習(xí)了 Android 手機(jī)之間進(jìn)行短信發(fā)送、廣播、對廣播的監(jiān)聽、服務(wù)等。
這次的課程我們主要學(xué)習(xí)了航班系統(tǒng)的設(shè)計,首先我們要建立航班查詢:旅客就可通過網(wǎng)絡(luò)訪問該系統(tǒng)客戶端網(wǎng)址,可根據(jù)旅客提供的出發(fā)時間、出發(fā)地點和目的地、艙位要求等,查詢滿足旅客要求的航班。通過檢索可得到航班的相關(guān)信息,從而可以方便旅客訂票并掌握所需信息,同時可減少工作人員的工作量。
第二,我們要建立旅客訂票:旅客將訂票的相關(guān)信息通過工作人員輸入系統(tǒng)客戶端??蛻舳藢⒙每偷挠喥毙畔⑼ㄟ^網(wǎng)絡(luò)傳送給服務(wù)端,服務(wù)端根據(jù)接收到的信息由航班安排系統(tǒng)為旅客安排座位并返回相應(yīng)的確認(rèn)信息給該客戶端。訂票信息生成后,存入相應(yīng)的存儲區(qū)域,并對數(shù)據(jù)庫進(jìn)行數(shù)據(jù)提交??蛻舳舜蛴∪∑眴渭皫谓o旅客,旅客在登機(jī)前,經(jīng)信息核審后,即可領(lǐng)取機(jī)票登機(jī)。
第三,航班信息管理:航空公司可將所有航班的信息存入數(shù)據(jù)庫,方便用戶對航班基本信息查詢,相 關(guān)工作人員可根據(jù)公司要求,經(jīng)系統(tǒng)身份認(rèn)證后登錄并對航班信息進(jìn)行修改等操作,從而使 航班信息便于管理。
第四:航班安排:從客戶端接收到旅客的訂票信息,該系統(tǒng)可在短時間內(nèi)處理旅客航班問題。將 訂票信息送往數(shù)據(jù)庫并更新,客戶端的航班查詢信息也同步更新。節(jié)省時間的同時,也能讓 旅客得到最新的航班信息。
第五,售票管理:旅客不僅可在各客戶端進(jìn)行機(jī)票預(yù)定,也可直接在機(jī)場的售票處購票,購票信息由系統(tǒng)提交到數(shù)據(jù)庫進(jìn)行管理更新。
第六,退票管理:機(jī)票有效期內(nèi),旅客若需退票,可在退票處進(jìn)行退票。退票信息,由工作人員輸入系統(tǒng),系統(tǒng)對訂票信息或售票信息進(jìn)行刪除更新。
第七,票銷售情況核算:因為航空公司機(jī)票銷售量大,而航空公司為了公司的經(jīng)營,有需要在一定的時 間階段了解公司機(jī)票的銷售情況。而龐大的數(shù)據(jù)量通過人工來完成,似乎不太現(xiàn)實,而該系 統(tǒng)可幫助航空公司進(jìn)行售票情況的核算。
這個課程緊跟住了現(xiàn)代科技的發(fā)展,讓我們在第一時間和先進(jìn)的科學(xué)技術(shù)做了一個親密的接觸,這樣的課程能夠點燃我們對某一個新興領(lǐng)域的激情,這算是一個啟蒙,讓我們對 Android 先有了一個大概的了解,這個課程不一定能讓我們很好的掌握 Android 的理念或者開發(fā),但是能夠讓我們對 Android 產(chǎn)生濃厚的興趣,讓我們?nèi)计鹛剿鰽ndroid 的欲望,我想這樣就已經(jīng)足夠了。