安卓课程内容复习



1. 安卓编程的四大组件是哪些?
  • Activity:显示用户界面并可以响应用户操作的程序(显示界面
  • Service:一种没有界面、在后台运行的程序(后台运行
  • Content Provider:提供给其他应用程序访问数据库的一种方法(数据通信
  • Broadcast Receiver:一种Intent广播的侦听器。如果应用程序侦听到与预设的过滤标准匹配的Intent广播,就会立即进行响应(广播通知

01ppt 第7页

2. dp、sp和px有什么异同点?
  • dp:与设备无关的像素(device independent pixels),随着密度变化,对应的像素数量也会变化。
  • sp:与缩放无关的像素(scaled -independent pixels),受用户字体大小影响,常用于设置字体大小,当文字尺寸是“正常”时1sp=1dp。
  • px:对应屏幕上的实际像素点(Pixels)。

01ppt 第16页

3. layout_width有哪些取值?
  • wrap_content:填充内容
  • match_parent:匹配父布局
  • 具体像素值

01ppt 第20页

4. padding和layout_margin的作用是什么?
  • padding:内容与控件边界之间保留的空白
  • margin:边界之外的空白

01ppt 第19页

5. layout_weight的作用是什么?有哪些取值?
  • layout_weight:根据父控件的余留空白按比例进行分配。
  • layout_weight的取值可以是大于或等于0的数。

01ppt 第23页

6. gravity的作用是什么?有哪些取值?

gravity用于控件内容的对齐。
gravity的取值包括top, bottom, left, right, center, center_vertical, center_horizontal, fill, fill_vertical, fill_horizontal, clip_vertical, clip_horizontal(fill增大控件,直到把内容填满控件;clip剪切掉超出部分),默认值取top|left

01ppt 第28页

7. tileMode的作用是什么?

tileMode用于设置bitmap的平铺模式。tileMode有以下取值:

  • repeat:重复铺满整个背景。
  • mirror:重复铺满整个背景,且相邻两排成镜像对称。
  • clamp:尺寸大小设置成该bitmap。
  • disable:禁用平铺模式,效果等同于直接将图片设置成背景。

8. android:textSize="10sp"是什么意思?

表示将文字大小设置为10sp。
此外,也可以动态调用控件的方法setTextSize()来设置文字大小,默认单位是px,如果需要设置单位为sp则是setTextSize(TypedValue.COMPLEX_UNIT_SP, 10)。

01ppt 第24页

9. CheckedTextView只是TextView和CheckBox的组合吗?它的作用是什么?

CheckedTextView不只是TextView和CheckBox的组合。RadioButton和CheckBox都是选项框在前,文字在后;而CheckedTextView是文字在前,选项框在后。根据其checkMark属性的不同取值可以实现不同的选项框样式:

  • “?android:attr/listChoiceIndicatorSingle”:选项框为单选样式;
  • “?android:attr/listChoiceIndicatorMultiple”:选项框为多选样式;
  • 如果取值为自定义的selector布局,可实现自定义的选项框样式

01ppt 第42页,取值参考:

10. 阅读下面代码:
Button btn = (Button)findViewById(R.id.button);
btn.setOnClickListener(new Button.OnClickListener(){
	@Override
	public void onClick(View vw){
		…
	}
});
其中,new Button.OnClickListener(){}的作用是什么?@Override可以不加,加上@Override与不加的区别?

new Button.OnClickListener(){}的作用是创建一个按键点击监听器的匿名对象,以响应按键点击事件。
加上@Override与不加的区别在于:

  • 在加@Override的情况下,说明子类要覆盖基类的方法,基类必须存在与子类方法完成一致的方法,否则会报错(找不到被Override的方法)。
  • 在不加@Override注解的情况下,当基类存在与子类方法完全一致的方法则实现覆盖;否则是视为一个新的方法来使用。

11. 阅读下面这段程序:
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, cities);
lv = (ListView)findViewById(R.id.listView);
lv.setAdapter(adapter);
说明每条语句的作用。
  1. 创建ArrayAdapter对象,数据项cities与显示项android.R.layout.simple_list_item_multiple_choice是一一映射的关系。
  2. 获取ListView对象。
  3. 调用ListView对象的setAdapter方法绑定Adapter进行显示。

02ppt 第5页

12. 阅读下面程序:
LinearLayout ll = (LinearLayout)findViewById(R.id.activity_main);
for(int i = 0; i < 16; i++) {
	TextView myTextView = new TextView(MainActivity.this);
	myTextView.setText("第"+i+"行, Hello World!"); 
	myTextView.setTextSize(30); 
	myTextView.setBackgroundColor(Color.argb(255,200,200,255));
	LinearLayout.LayoutParams textViewLP = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
	textViewLP.setMargins(0,20,0,0);
	ll.addView(myTextView, textViewLP);
}
说明其功能。

动态创建16个TextView控件,设置文字为"第i行, Hello World!"(0≤i<16)、字体大小为20px、背景颜色为argb(255,200,200,255),然后设置好控件的尺寸为填充内容、上边距为20px后,再把新控件依次放入到线性布局中。

02ppt 第42页

13. 以下相对布局中的Button是怎么布局的?
<Button
	android:text="Button2"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	android:id="@+id/button2"
	android:layout_below="@+id/view01"
	android:layout_toRightOf="@+id/view04"
	android:layout_marginLeft="23dp"
	android:layout_marginTop="58dp" />

Button的布局位于view01控件的下方,距离view01下边界58dp处;同时位于view04控件右方,距离view04右边界23dp处。

02ppt 第48页

14. 线性布局和帧布局有什么差别?
  • 线性布局中所有控件是根据布局空间垂直或水平排列的,彼此间不会重叠。
  • 帧布局中所有控件是叠放在一起的,越往后面越在上层。

02ppt 第45页

15. 表布局和网格布局有什么差别?
  • 表布局是多行布局,每行可以放入若干控件作为列,并可以统一设置每列属性。
  • 网格布局是多行多列布局,一个控件可以占据一行一列,也可以跨越多列或多行。

02ppt 第45页

16. 以下程序的作用是什么?
LinearLayout ll = new LinearLayout(MainActivity.this);
ll.setOrientation(LinearLayout.VERTICAL);
LinearLayout.LayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
addContentView(ll, lp);

动态创建当前MainActivity的线性布局并设置参数,其中尺寸匹配父布局,屏幕方向为竖屏显示,将该线性布局放进当前的布局中。

02ppt 第60页

17. 以下程序的作用是什么?
LinearLayout ll = (LinearLayout)inflater.inflate(R.layout.line_item, null);
TextView num = (TextView)ll.findViewById(R.id.num);
num.setText(((EditText)findViewById(R.id.num)).getText());
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
ll.setPadding(20, 20, 10, 10);
Layout layout=(Layout)findViewById(android.R.id.content); 
layout.addView(ll,lp);

先使用布局填充器将布局line_item转换为视图,由于parent为null所以不会将inflate得到的视图自动加入到parent。然后从视图中获取TextView控件并设置文字和尺寸,其中控件宽度匹配父布局,高度填充内容,内边距按左上右下的顺序分别设置为20dp、20dp、10dp和10dp,最后将该视图加入到布局layout中。

02ppt 第61-62页

18. 以下语句实现了哪条SQL语句的执行?
SQLiteDatabase db = this.openOrCreateDatabase("dbStu.db3", MODE_PRIVATE, null);
ContentValues cv = new ContentValues();
cv.put("num", 1600123); 
cv.put("name", "David");
db.insert("stu", null, cv);

答:

INSERT INTO stu(num, name) values (1600123, 'David')

03ppt 第6页

19. 表stu的字段有stuNum(学号)、stuName(姓名)和classNum(班级号),字段类型为varchar(64)。
如果要从表stu查询出班级号以“16”开头和班级中姓“张”的人数多于10的班级号classNum,并按人数升序,只从第10个班级开始取5个,请给出query方法:
public Cursor query(String table,String[] columns, String selection,String[] selectionArgs, String groupBy,String having, String OrderBy,String limit);

答:

String table="stu";
String[] columns=new String[]{"classNum"};
String selection="classNum like '?%'  and stuName like '?%'";
String[] selectionArgs=new String[]{"16", "张"};
String groupBy="classNum";
String having="COUNT(stuNum)>10";
String orderBy="COUNT(stuNum)";
Cursor c=db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, "9,5");



20. 说明ContentProvider、ContentResolver和ContentObserver的用途。它们一定要在清单文件中定义吗?它们是如何关联上的?

ContentProvider作为安卓四大控件之一,一定要在清单文件中定义,其余的则不需要。
ContentProvider提供接口让其他app可以操作自己的数据并发出改变的消息。其他app则通过ContentResolver来操作这些数据。
ContentObserver可以用来监听ContentProvider数据的改变消息。它们之间都是通过Uri进行联系的。

03ppt 第34页

21. 如何在Activity中取得ContentResolver?

在Activity中可以通过调用getContentResolver方法来取得ContentResolver。

03ppt 第42页

22. ContentProvider要如何修改才能让ContentObserver起作用?

在ContentProvider中要调用ContentResolver的notifyChange方法发送改变的通知。

03ppt 第46&41页

23. ContentProvider有的方法,ContentResolver是否一定有类似的方法?例如,ContentProvider有public Uri insert(Uri uri, ContentValues values),在ContentResolver中有吗?

ContentProvider有的方法,ContentResolver不一定会有类似的方法,e.g.ContentProvider的getType方法。



24. 执行完以下两条语句后wordid的值是什么?
Uri uri = Uri.parse("content://com.ourexample.sqlite/person/12/5");
long wordid = ContentUris.parseId(uri);

运行后wordid的值为5。

03ppt 第39页

25. 安卓的事件绑定有哪四种方法?以下方法是否正确?
  • 把事件处理器直接在布局文件中绑定android:onClick=“clickHandler1”
  • 把接口OnClickListener的子类MyClickListener的一个实例设置为事件监听器。
btn.setOnClickListener(new MyClickListener());
class MyClickListener implements OnClickListener {
	@Override
	public void onClick(View v){ ... }
}
  • 与上面不同的是试了用匿名子类的一个实例。
btn.setOnClickListener(new OnClickListener(){
	@Override
	public void onClick(View v){ ... }
});
  • 把Activity的实例作为接口OnClickListener的子类的实例。
public class
MainActivity extends AppCompatActivity implements OnClickListener {
	@Override
	public void onClick(View v){ ... }
	protected void onCreate(){ 
		btn.setOnClickListener(this);
	}
}

04ppt 第4页

26. 在一个Activitiy中启动另一个Activty的方法有哪些?系统如何找到被启动的Activity?
  • 用Activity启动第二个Activity:
Intent intent = new Intent(this, SecondActivity.class);
  • Action启动第二个Activity或另一个app的Activity:
intent.setAction("com.example.startact.SECONDACT");
或
Intent intent = new Intent("com.example.startact.SECONDACT");

在名单文件有:

<activity android:name=".SecondActivity">
	<intent-filter>
		<action android:name="com.example.startact.SECONDACT" />
		<category android:name="android.intent.category.DEFAULT" />
	</intent-filter>
</activity>
  • 使用包名类名启动另一个app的Activity:
intent.setClassName("com.example.startact", "com.example.startact.SecondActivity");

04 ppt 第10-11页

27. Intent的属性ComponentName是做什么用的?以下三条语句可以简化哪条语句?它的作用是什么?
ComponentName comp = new ComponentName(CurActitivy.this, Activity2.class);
Intent intent  = new Intent();
Intent.setComponent(comp);

ComponentName 属性是用来设置要访问的组件(Activity等)的包名类名,用于访问相同或不同的应用程序的组件
上述三行可以简化成:

Intent intent = new intent(CurActitivy.this, Activity2.class);

作用是设置intent绑定的目标class。

04 ppt 第36页

28. Intent的action属性有什么作用?以下两条语句可以简化为哪一条语句?
Intent intent  = new Intent();
Intent.setAction("com.group.action.ADDRBK_ACTION");

Intent的action属性指出要做什么动作。(这个动作只是给出一个字符串,由系统通过查找所有组件(Activity等)的intent-filter去查找匹配的组件)。
可以简化为:

Intent intent = new Intent("com.group.action.ADDRBK_ACTION");

04ppt 第38页

29. Intent的category属性有什么作用?

category属性用于指明动作的附加信息(动作由action指定)。

04ppt 第39页

30. Intent的data和type用于在Activity之间传递什么内容?

data属性用于提供一个Uri对象。 type属性用于指定data属性所指定的Uri对应的MIME类型,也可以自己定义,格式是abc/xyz。

04ppt 第41页

31. Intent的extra属性是什么类型?以下四条语句的最后两句可以简化为哪一条语句?
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString("user","Wang");
intent.putExtras(bundle);

答:extra属性是Bundle类的实例。最后两句可以简化为:

Intent.putExtras("user","Wang");

04ppt 第43页

32. Activity的android:launchMode有哪四种?每种的作用是什么?

  • standard模式(默认):安卓会为目标Activity创建一个新实例,并把它加入当前Task栈中。
  • singleTop模式:与standard模式相同只是如果目标Activity已经位于Task的栈顶,则直接使用它,而不会创建一个新实例。
  • singleTask模式:一个Acitivity在同一个Task最多只有一个实例。当目标Activity被启动时,如果task中不存在该Activity的实例,则创建它的一个实例;如果已经在Task中,则弹出它之上的所有Activity,直到它处于栈顶;如果已经在栈顶,则与singleTop相同,直接使用它。
  • singleInstance模式: 如果将要启动的Activity不存在,系统将会先创建一个全新的Task,再创建目标Activity实例并将其放入此Task中且单独使用。如果将要启动的Activity已存在,那么无论它位于哪个应用程序系统都会把该Activity所在的Task转到前台,从而使该Activity显示出来。整个系统只会包含该Activity的一个实例且用一个Task单独保存。

04ppt 第51-52页

33. 如果A1和A2是两个Activity,它们的启动模式分别为standard和singleTop,A1调用A2用A1->A2表示,那么A1->A2->A1->A2->A2->A1->A1,Task栈从栈底到栈顶的Activity分别是什么?

栈底到栈顶: A1->A2->A1->A2->A1->A1

04ppt 第51-52页

34. 一个处于stop状态的Activity是否可见?它在内存中吗?

处于stop状态的Activity完全不可见,但仍停留在内存,保留了状态信息。

04ppt 第60页

35. AlertDialog主要有哪几种?
  • 简单对话框
  • 简单列表对话框
  • 单项选择对话框
  • 多项选择对话框

05ppt 第5页

36. Service和Activity有什么差别?BindService与一般的Service有什么差别?IntentService与一般的Service有什么差别?

Service与Activity类似,只是没有界面。使用Servcie要先定义一个Service子类,并在AndroidManifest.xml中配置它。 Service和Activity一样,都是从Context派生出来的。因此都可以使用getResources()和getContentResolver()。
使用BindService时,访问者与Service绑定在一起,访问者退出后,service也终止了。而使用一般的Service时访问者与Service之间没有关联,即使访问者退出了,Service也依然运行。
使用IntentService启动会把Service放在子线程中执行

07ppt 第3页

37. 安卓采用什么机制实现线程之间的消息传递?子线程发送message给主线程的作用是什么?

安卓使用消息循环消息队列实现线程之间的消息传递。子线程通过发送消息给主线程,让主线程更新UI。

07ppt 第23页

38、broadcast组件的作用是什么?普通广播与有序广播的差别在哪里?

BroadcastReceiver的主要作用是接收系统或者自定义的广播,并进行相关的处理工作。
普通广播是所有匹配的接收者均可同时收到广播消息,而有序广播让广播消息根据接收者的优先权依次经过每个接收者,每个接收者都可以停止继续传播消息。
高优先级的Receiver通过setResultExtras方法来发送数据,低优先级的Receiver通过getResultExtras来获取Bundle数据包,进而获取数据,他们都可以用intent的Bundle来获取最初的广播发送者发出的消息。

07ppt 第41页

39. 电量变化时采用了什么组件发通知?该组件还可以发出什么通知?

电量变化使用了系统广播来发通知。该组件还能发出:系统启动完成、网络状态变化、监听SD卡状态、监听应用安装变化等通知。

07ppt 第50-54页

40. 通信录和来电记录采用了什么组件进行编码?

使用了ContentResolver组件来进行编码。

03ppt 第34页

41. 说明画布(Canvas)、画笔(Paint)和位图(Bitmap)的关系?

每个视图(View)对象默认都有一个画布(Canvas)对象,并且关联一个位图(Bitmap)对象。利用画布对象可以在其关联的位图对象上用画笔(Paint)作画。

08ppt 第3页

42. 绘制形状和绘制位图有什么差别?

绘制形状是通过定义View或控件的canvas对象来调用方法绘制,而绘制位图是通过获取Bitmap对象后在Bitmap对象上进行贴图等操作。

08ppt 第16,37页

43. 如何使用一个3X3的矩阵在绘制图像时进行Matrix变换?

通过与原图坐标做矩阵乘法来进行Matrix变换。e.g.

方法public void setTranslate(float dx, float dy);对应的变换公式为:

android 知识点总结 安卓知识点_android 知识点总结


08ppt 第43页

44. Camera变换的特点是什么?

通过camera类可以产生用于3D变换的Matrix

08ppt 第51页

45. Canvas变换的作用是什么?

Canvas可以进行平移(translate)、旋转(rotate)、缩放(scale)和错切(skew)变换。这些变换会引起整个坐标系的改变,使得之后对Canvas的绘图操作都是在变换后的坐标系进行。

08ppt 第58页

46. ColorMatrixColorFilter和LightingColorFilter在过滤图像颜色时有何区别?
  • ColorMatrixColorFilter 的构造器采用一个4x5的矩阵作为参数。
  • LightingColorFilter 的构造器采用一个3或4字节的乘数mul和一个3或4个字节的加数add (3个字节只包含RGB)

08ppt 第78&80页

47. PorterDuff的用途是什么?根据下图说明DST_ATOP和DST_IN的效果?

android 知识点总结 安卓知识点_android_02


PorterDuff是用于图形混合的方法。(先绘制的图是目标图DST,后绘制的图是源图SRC,有18种混合模式)

  • DST_ATOP: 相交处绘制目标图,不相交处绘制源图
  • DST_IN: 在相交处绘制目标图.

08ppt 第84-85页

48. SurfaceView的用途是什么?它与TextureView的区别是什么?

SurfaceView的目的是另外提供一个线程进行绘制操作。
SurfaceView 是View的子类。它使用了双缓冲机制,在新的线程中利用一个缓冲区绘制好屏幕,然后提交到UI界面显示它。(不影响主线程的更新速度)
TextureView可以看成和Button、 TextView一样的普通控件,可以使用平移、缩放、旋转等变换,也可以使用View.setAlpha()等操作。SurfaceView只能在整个屏幕中而不能作为一个View进行绘制。

09ppt 第3页

49. SurfaceView程序中的语句“holder.unlockCanvasAndPost(canvas);”的作用是什么?

作用是:结束锁定并提交改变。

09ppt 第7页

50、补间动画、逐帧动画和属性动画分别有什么特点?
  • 补间动画(Tween Animation): 在给出控件的起止位置、大小、透明度和旋转角度后通过添加中间值的变化过程而产生动画效果。也称为视图动画(View Animation)。
  • 逐帧动画(Frame Animation):通过用多幅图片替换显示而产生动画效果。也称为Drawable Animation。
  • 属性动画(Property Animation): 通过连续改变对象属性的属性值而产生动画效果。与补间动画只改变控件的四个属性的属性值不同的是属性动画可以改变对象的任何数值类型的属性的属性值。

10ppt 第3页

51. NinePatchDrawable是怎么使用的?

NinePatchDrawable 是用来平滑拉伸图像的边沿的,使用如下:
NinePatchDrawable使用了一幅NinePatch图像,这种图像要定义拉伸时填充的内容。可以执行SDK/tools/draw9patch.bat或在Android Studio中点击相应的图进行定义。

11ppt 第11页

52. Fragment的作用是什么?

Fragment的作用是:在活动Activity中为不同的屏幕尺寸修改布局配置,解决不同屏幕分辩率的问题,支持动态、灵活的界面设计。