高级Android复习点上届遗留复习资料Word文档下载推荐.docx
《高级Android复习点上届遗留复习资料Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《高级Android复习点上届遗留复习资料Word文档下载推荐.docx(22页珍藏版)》请在冰豆网上搜索。
4.手势识别(AndroidGesture)是用来侦测、处理手势相关动作的技术。
Gesture大致可以分为两类:
一类是触摸屏手势,另一类是输入法手势。
•触摸屏手势比较简单,通常就是按下、抬起、滑动、翻页这几种。
Android系统为我们提供了手势识别工具GestureDetector,当我们接收到用户触摸消息时,将这个消息交给GestureDetector去加工,我们通过设置监听器获得GestureDetector处理后的手势。
•输入法手势就是在触摸屏上手绘一个形状,这个形状可以由一个或者多个笔画构成。
创建完成之后,系统会自动保存手势动作在mnt/sdcard/gestures里面。
把gestures文件复制到工程/res/raw下,就可以在项目里面使用这些手势了。
一.简答题:
1.XX地图应用
/*获取APIkey
(1)获取MapsAPIkey需要两样东西:
应用的signingcertificate和它的packagename。
(2)获取这个key之后,把它加在应用程序的AndroidManifest.xml文件里即可。
*/
(1)注册XX账号,并登录。
(有XX账号的话直接登录)
(2)申请Key
安全码的组成规则为:
Android签名证书的sha1值+“;
”+packagename(即:
数字签名+分号+包名)。
获取Android签名证书的sha1值,可以在eclipse中直接查看:
windows->
preferance->
android->
build。
包名是Android应用程序本身在AndroidManifest.xml中定义的名称:
(3)下载AndroidSDKv3.4.0
XX地图SDKv3.4.0为开发者提供了便捷的显示XX地图数据的接口,通过以下几步操作,即可在您的应用中使用XX地图数据。
第一步:
创建并配置工程
第二步:
在AndroidManifest中添加开发密钥、所需权限等信息
1)在application中添加开发密钥
2)添加所需权限
<
uses-permissionandroid:
name="
android.permission.GET_ACCOUNTS"
/>
android.permission.USE_CREDENTIALS"
第三步,在布局xml文件中添加地图控件
第四步,在应用程序创建时初始化SDK引用的Context全局变量
第五步,创建地图Activity,管理地图生命周期
2.Handler
android:
Handler概念理解与运用
android.os.Handler是AndroidSDK中处理定时操作的核心类。
通过Handler类,可以提交和处理一个Runnable对象。
这个对象的run方法可以立刻执行,也可以在指定时间之后执行(可以称为预约执行)。
handler类允许你发送消息和处理线程消息队列中的消息及runnable对象。
handler实例都是与一个线程和该线程的消息队列一起使用,一旦创建了一个新的handler实例,系统就把该实例与一个线程和该线程的消息队列捆绑起来,这将可以发送消息和runnable对象给该消息队列,并在消息队列出口处处理它们。
handler类有两种主要用途:
(1)、按照时间计划,在未来某时刻,对处理一个消息或执行某个runnable实例。
(2)、把一个对另外线程对象的操作请求放入消息队列中,从而避免线程间冲突。
Android在设计时引入了Handler消息机制,每一个消息发送到主线路的消息队列中,消息队列遵循先进先出原则,发送消息不会阻塞线程,而接收线程会阻塞线程。
Handler允许发送并处理Message消息,Message对象通过主线程的MessageQueue消息队列相关联的Message和Runnable对象进行存取。
每个Handler实例对Message消息发送和接收与对应主线程和主线程的消息队列有关。
当创建一个新的Handler时,Handler就属于当前主线程,主线程MessageQueue消息队列也同步创建,即Handler会绑定到创建该Handler的主线程/消息队列上。
然后,Handler就可以通过主线程的消息队列发送和接收Message消息对象了。
handler机制的原理
andriod提供了Handler和Looper来满足线程间的通信。
Handler先进先出原则。
Looper类用来管理特定线程内对象之间的消息交换(MessageExchange)。
1)Looper:
一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。
2)Handler:
你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;
或者接收Looper从MessageQueue取出)所送来的消息。
3)MessageQueue(消息队列):
用来存放线程放入的消息。
4)线程:
UIthread通常就是mainthread,而Android启动程序时会替它建立一个MessageQueue。
Handler的特性
1)Android里没有全局MessageQueue消息队列,每个Activity主线程都有一个独立的MessageQueue消息队列,消息队列采用先进先出原则。
不同APK应用不能通过Handler进行Message通信,同一个APK应用中可以通过Handler对象传递而进行Message通信。
2)每个Handler实例都会绑定到创建它的线程中(一般位于主线程,即Activity线程),但是Handler实例可以在任意线程中创建(可以在主线程或子线程中创建)
3)Handler发送消息使用MessageQueue消息队列,每个Message发送到消息队列里面;
发送消息采用异步方式,所以不会阻塞线程。
而接收线程则采用同步方式,所以会阻塞线程,所以当Handler处理完一个Message对象后才会去取下一下消息进行处理。
HANDLE(句柄)是Windows操作系统中的一个概念。
在Windows程序中,有各种各样的资源(窗口、图标、光标等),系统在创建这些资源时会为它们分配内存,并返回标示这些资源的标示号,即句柄。
句柄指的是一个核心对象在某一个进程中的唯一索引,而不是指针。
由于地址空间的限制,句柄所标识的内容对进程是不可见的,只能由操作系统通过进程句柄列表来进行维护。
句柄列表:
每个进程都要创建一个句柄列表,这些句柄指向各种系统资源,比如信号量,线程,和文件等,进程中的所有线程都可以访问这些资源。
3.传感器应用程序的开发分为以下几个步骤:
(1)调用Context.getSystemService(SENSOR_SERVICE)方法获取传感器管理服务。
(2)调用SensorManager的getDefaultSensor(inttype)方法,获取指定类型的传感器。
(3)在Activity的onResume()中,调用SensorManager的registerListener(SensorEventListenerlistener,Sensorsensor,intrate)方法注册监听。
(4)实现SensorEventListener接口中下列两个方法,监听并取得传感器Sensor的状态。
PublicabstractvoidonAccuracyChanged(Sensorsensor,intaccuracy)//监听传感器精度变化
publicabstractvoidonSensorChanged(SensorEventevent)
//监听传感器值变化
•方向传感器(Orientation)简称为O-sensor,主要感应方位的变化。
现在已经被SensorManager.getOrientation()所取代,我们可以通过磁力计MagneticField和加速度传感器Accelerometer来获得方位信息。
该传感器同样捕获三个参数,分别代表手机沿传感器坐标系的X轴、Y轴和Z轴转过的角度。
•磁力传感器(MagneticField)简称为M-sensor,该传感器主要读取的是磁场的变化,通过该传感器便可开发出指南针、罗盘等磁场应用。
磁场传感器读取的数据同样是空间坐标系三个方向的磁场值,其数据单位为uT,即微特斯拉。
接下来通过对之前方向传感器案例的更改,来完成磁场数据的读取。
•重力传感器(Gravity)简称GV-sensor,主要用于输出重力数据。
在地球上,重力数值为9.8,单位是m/s^2。
坐标系统与加速度传感器坐标系相同。
当设备复位时,重力传感器的输出与加速度传感器相同。
•加速度传感器(Accelerometer)简称G-sensor,主要用于感应设备的运动。
该传感器捕获三个参数,分别表示空间坐标系中X、Y、Z轴方向上的加速度减去重力加速度在相应轴上的分量,其单位均为m/s2。
•光传感器(Light),主要用来检测设备周围光线强度。
光强单位是勒克斯(lux),其物理意义是照射到单位面积上的光通量。
光传感器的开发与之前介绍过的各种传感器的开发步骤基本相同,只是监测的是SENSOR_LIGHT,即捕捉光的强度。
四.程序题
1.HttpURLConnection接口
创建一个项目,项目中包括四个Activity类,通过主Activity类的三个按钮和一个文本输入框分别跳转到另外三个Activity网页信息显示活动。
在每个跳转后的Activity活动的生命周期函数OnCreat()里,调用HttpURLConnection网络接口向服务发出请求,获取服务器返回信息。
(1)主activity
publicclassLabFourTestOneMainActivityextendsActivity{
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//StrictMode.setThreadPolicy(newStrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
//StrictMode.setVmPolicy(newStrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
Buttonb_One=(Button)findViewById(R.id.button1);
Buttonb_Two=(Button)findViewById(R.id.button2);
Buttonb_Three=(Button)findViewById(R.id.button3);
EditTexte_One=(EditText)findViewById(R.id.editText1);
b_One.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
//TODOAuto-generatedmethodstub
Intenti=newIntent(LabFourTestOneMainActivity.this,GetOneActivity.class);
LabFourTestOneMainActivity.this.startActivity(i);
}
});
b_Two.setOnClickListener(newView.OnClickListener(){
Intenti=newIntent(LabFourTestOneMainActivity.this,GetTwoActivity.class);
b_Three.setOnClickListener(newView.OnClickListener(){
Intenti=newIntent(LabFourTestOneMainActivity.this,PostOneActivity.class);
EditTexte_One=(EditText)findViewById(R.id.editText1);
Stringstr=e_One.getText().toString();
i.putExtra("
text"
"
"
+str);
}
publicbooleanonCreateOptionsMenu(Menumenu){
//Inflatethemenu;
thisaddsitemstotheactionbarifitispresent.
getMenuInflater().inflate(R.menu.activity_main,menu);
returntrue;
}
(2)跳转后的第一个Activity页面显示信息是通过Get方式请求服务器返回信息不携带参数
publicclassGetOneActivityextendsActivity{
Stringstr;
StringhttpUrl;
TextViewt_One;
Handlerh_One=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
//TODOAuto-generatedmethodstub
super.handleMessage(msg);
t_One.setText(msg.getData().toString());
}
};
//TODOAuto-generatedmethodstub
this.setContentView(R.layout.getone);
t_One=(TextView)findViewById(R.id.textView1);
t_One.setMovementMethod(ScrollingMovementMethod.getInstance());
httpUrl="
http:
//202.118.201.19:
80/softwareschool/index2.html"
;
newThread(newRunnable(){
publicvoidrun(){
StringresultData="
URLurl=null;
try{
url=newURL(httpUrl);
}catch(MalformedURLExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
if(url!
=null)
{
try{
HttpURLConnectionurlConn=(HttpURLConnection)url.openConnection();
InputStreamReaderin=newInputStreamReader(urlConn.getInputStream());
BufferedReaderbuffer=newBufferedReader(in);
StringinputLine=null;
while((inputLine=buffer.readLine())!
=null)
{
resultData+=inputLine+"
\n"
}
in.close();
urlConn.disconnect();
if(resultData!
Bundleb=newBundle();
b.putString("
megpost"
resultData);
Messagemeg=newMessage();
meg.setData(b);
h_One.sendMessage(meg);
else
Log.d("
test"
"
读取页面内容为空!
);
}
catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
else
Log.d("
url为空!
}).start();
(3)第二个Activity页面显示信息是通过Get方式携带参数请求服务器返回信息
publicclassGetTwoActivityextendsActivity{
super.onCreate(sa