一般情况下,Android应用程序由以下4种组件构成:1、Activity 2、Service3、BroadcastReceiver4、Content Provider
Android进程的类型包括:1、前台(foregound)进程 2、可见(Visible)进程 3、服务(Service)进程4、后台(background)进程 5、空(Empty)进程
Android应用程序一般包含:Java源代码、AndroidManifest.xml、资源文件。
Java源代码由Java编译器编译为class文件,接着dx工具处理为Dex字节码;AndroidManifest.xml、资源文件都由aapt处理为二进制文件;之后统一打包签名为apk包。
Android中一个包将生成一个Dex文件。反编译可以为Java源文件。
—————————————————————————————————————————————————————————————————————————————
事件响应事件:new 一个类如ButtonClick,实现OnClickListener里面的onClick方法,button.setOnClickListener(new ButtonClick());
键盘响应事件:如TestActivity继承Activity,重写里面的onKeyDown(int keyCode, KeyEvent msg)方法。KeyEvent为键盘事件类
运动事件(MotionEvent):触摸屏TouchScreen、滚动球TrackBall,是Android的输入设备
触摸屏和滚动球事件主要通过实现以下2个函数来接收:
public boolean onTouchEvent(MotionEvent event)
public boolean onTrackballEvent(MotionEvent event)
MotionEvent类作为参数传入,在这个参数中可以获得运动事件的各种信息。MotionEvent.ACTION_MOVE;MotionEvent.ACTION_UP;MotionEvent.ACTION_DOWN
可获取鼠标的位置,动作类型等等。
画图:写一个类继承View,重写它的onDraw(Canvas canvas)方法。onTouchEvent中可调用invalidate();重新绘制
涉及2个类:Paint类(画笔),Canvas类(画板)
paint.setColor(Color.RED);
canvas.drawColor(Color.WHITE);
canvas.drawCircle(mX, mY,10, paint);
屏幕间跳转和事件传递
Android每一个屏幕基本就是一个activity(活动),屏幕之间的切换实际上就是活动间的调用,跳转关系通过Intent(意图)实现。
比如一个点击按钮的click事件如下:
public void onClick(View v)
{
Intent intent = new Intent(); // 建立Intent
intent.setClass(Forwarding.this, ForwardTarget.class); // 设置活动。第一个为上下文content,第二个为跳转目标activity
startActivity(intent);
finish();//结束当前活动,没有这个的话则第一个活动处于OnPause状态,第二个活动退出之后,第一个活动重新出现,也就是调用onResume函数
}
这里使用的Intent的setClass()的方法的原型如下所示:
Intent setClass(Context packageContext, Class<?> cls)
第一个参数是当前的上下文类型Context,因此把当前的活动设置过去即可(Activity本身继承了Context),第二个是Intent所包含的JAVA类,直接设置forwardTarget.class类(跳转目标类)即可。
带有返回值的跳转(2个屏幕之间的交互)
java源文件ReceiveResult.java的代码片段如下所示
static final private int GET_CODE = 0;
private OnClickListener mGetListener = new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(ReceiveResult.this, SendResult.class);
startActivityForResult (intent, GET_CODE);
}
};
被跳转的目标的Java源文件SendResult.java的代码片段如下所示:
public void onClick(View v)
{
setResult(RESULT_OK, (new Intent()).setAction("Corky!"));
finish();
}
被跳转的目标程序将返回值返回,这里使用的依然是Intent作为交互的信息,通过setAction()设置不同的活动。
返回之后由ReceiveResult.java中重写onActivityResult方法对返回值进行处理,其中,两个整数类型的参数requestCode和resultCode分别代表请求代码和结果码,第三个参数Intent(类型data)表示活动间交互附加的数据信息
@Override
protected void onActivityResult(int requestCode, int resultCode,Intent data) {
if (requestCode == GET_CODE) {
Editable text = (Editable)mResults.getText();
if (resultCode == RESULT_CANCELED) {
text.append("(cancelled)");
} else {
text.append("(okay ");
text.append(Integer.toString(resultCode));
text.append(") ");
if (data != null) {
text.append(data.getAction());
}
}
text.append("\n");
}
菜单的使用
菜单是屏幕中较为独立的元素
使用菜单主要通过重载Activity中的两个函数来实现:
public boolean onCreateOptionsMenu(Menu menu)
public boolean onOptionsItemSelected(MenuItem item)
onCreateOptionsMenu()用于在建立菜单时进行设置,建立时为每一个按钮设置ID,菜单项被选择时调用onOptionsItemSelected(),通过MenuItem类的getItemId()函数获得这个菜单的ID,继续进行处理。
菜单类在Android中表示为android.view.Menu类。使用这个类可以进行一些更为细节的设置和操作。
abstract MenuItem add(int groupId, int itemId, int order, CharSequence title)
abstract MenuItem add(int groupId, int itemId, int order, int titleRes)
弹出对话框
对话框的父类是android.app.Dialog,通过构建类android.app.AlertDialog来实现弹出式对话框,可以使用AlertDialog.Builder和不同的参数来构建对话框。
实现方法是继承onCreateDialog()函数,返回一个Dialog类型:
@Override
protected Dialog onCreateDialog(int id) {
}
onCreateDialog()函数的参数id是区分对话框的标示,当调用对话框的时候需要调用showDialog()。
public final void showDialog (int id)
showDialog()函数也是通过id来区分对话框
代码实现的片断如下所示:
return new AlertDialog.Builder(AlertDialogSamples.this)
.setIcon(R.drawable.alert_dialog_icon)
.setTitle(R.string.alert_dialog_two_buttons_title)
.setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
/* 左键事件 */
}
})
.setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
/* 右键事件 */
}
单选框和按钮对话框
setSingleChoiceItems
复选框和按钮对话框
setMultiChoiceItems
文本按钮对话框
setView(View)
对话框总结:
对话框的类为android.app.Dialog,通过android.app.AlertDialog.Builder类来建立,在建立的过程中可以进行多项设置。
setIcon()和setTitle():用于设置图标和标题;
setMessage():用于设置提示信息;
setPositiveButton()、setNeutralButton()和setNegativeButton():用于设置左、中、右按钮;
setSingleChoiceItems()和setMultiChoiceItems():用于设置单选项和复选项;
setView():用于设置一个View作为对话框的内容。
—————————————————————————————————————————————————————————————————————————————
控件(Widget)的使用
View 是widgets的基类
扩展者:文本视图TextView、图像视图ImageView、进度条ProgressBar、视图组ViewGroup
ViewGroup可以包含很多子视图,本身也是一个视图
可变按钮ToggleButton
ToggleButton>>>CompoundButton>>>Button>>>TextView>>>View
ToggleButton包含2个开关,可以显示不同的文本textOn(开)和textOff(关)
ImageButton图像按钮,与ImageView主要区别在与ImageButton特定的是具有一个onSetAlpha(int aplha)函数,onSetAlpha函数通过指定0-255来指定Alpha数值。
mageButton只是扩展了ImageView,和普通按钮Button并没有继承(扩展)关系。ImageButton有一个扩展者是ZoomButton,这是一个带有动态缩放功能的图像按钮。
ProgressBar是android.view.View的直接扩展者,支持第二个进度条
int getMax() // 获得进度条的最大值
void setProgress(int progress) // 设置主进度条的进度
void setSecondaryProgress(int secondaryProgress) // 设置第二个进度条的进度
synchronized int getProgress () // 获得进度值
synchronized int getSecondaryProgress () // 获得第二个进度条的进度
自定义视图:
实现一个扩展android.view.View类的类,可以直接构造UI
—————————————————————————————————————————————————————————————————————————————
视图组ViewGroup和布局Layout的使用
Android GUI程序的屏幕体系结构的组织遵循以下原则:
一个屏幕可以包含一个视图;
视图组本身也是一个视图;
视图组可以包含若干个视图
这里一个主要的限制是:在没有视图组的情况下,两个以上的视图(也包括视图组)是不能够并列的。
几种独立使用的视图:
1、WebView网页视图,WebView本身扩展了AbsoluteLayout(绝对布局),因此也是一个ViewGroup
WebView的作用是可以在Android中支持一个HTML格式的元素。由此,虽然WebView也是一个视图组,但是从使用上基本等同普通的控件。
wv = (WebView) findViewById(R.id.wv1);
wv.loadData("<a href='x'>Hello World! - 1</a>", mimeType, encoding);
2、旋转按钮(Spinner)
3、文本切换器(TextSwitcher)
布局:FrameLayout、LinearLayout、AbsoluteLayout、RelativeLayout、TableLayout(里面可包含多个TableRow)
线性布局里面:android:orientation="horizontal" 位置可取值horizontal、vertical
GridView网格视图组
xml中使用的android:numColumns 、android:columnWidth、android:horizontalSpacing和android:verticalSpacing类是GridView的特定属性,分别表示了列的数目,列的宽度,水平间距和竖直间距
android:numColumns设置为"auto_fit"表示根据宽度和间距等信息,自动适应。
AbsListView是ListView和GridView的共同父类,它使用ListAdapter作为其中的数据,ListAdapter作为列表的UI和数据的桥梁,通过实现这个类来构建界面上的AbsListView
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
loadApps();
setContentView(R.layout.grid_1);
mGrid = (GridView) findViewById(R.id.myGrid);
mGrid.setAdapter(new AppsAdapter()); // 设置GridView后面的数据
}
-- - - --- - - --- - - --- - - --- - - -
public class AppsAdapter extends BaseAdapter {
public AppsAdapter() { }
public View getView(int position, View convertView, ViewGroup parent) {
ImageView i;
if (convertView == null) {
i = new ImageView(Grid1.this);
i.setScaleType(ImageView.ScaleType.FIT_CENTER);
i.setLayoutParams(new GridView.LayoutParams(50, 50));
} else {
i = (ImageView) convertView;
}
ResolveInfo info = mApps.get(position);
i.setImageDrawable(info.activityInfo.loadIcon(getPackageManager()));
return i;
}
public final int getCount() {
return mApps.size();
}
public final Object getItem(int position) {
return mApps.get(position);
}
public final long getItemId(int position) {
return position;
}
}
列表List视图组
它与网格视图组类似,ListView本身的使用方法可以和GridView一样,通过构建一个android.widget.BaseAdapter来完成。在实际的使用过程中,可以使用ListActivity这种更简单的方式。
使用列表类ListView时通常继承ListActivity来代替Activity,ListActivity扩展了Activity可以方便ListView的使用,主要的方法包括以下几个:
void setListAdapter(ListAdapter adapter) // 设置ListAdapter作为数据,自己写一个类继承BaseAdapter
void onListItemClick(ListView l, View v, int position, long id) // Item选择时的函数
Tab组织UI(Tab切换视图)
写一个类可继承TabActivity,主要包含以下方法
TabHost getTabHost()// 返回这个活动的TabHost,TabHost就可以使用addTab进行添加tab
TabWidget getTabWidget() // 返回这个活动的TabWidget the activity is using to draw the actual tabs.
void onContentChanged() // 当内容变化的时候,更新屏幕的状态
—————————————————————————————————————————————————————————————————————————————
2D图形接口的使用
Android系统的图形API包括2D和3D两部分:2D部分使用android.graphics类,也作为上层控件的构建基础;3D部分使用OpenGL作为标准接口。
2D通过继承android.view.View类,并实现其中的onDraw()函数来实现绘制的工作,绘制的工作主要由android.graphics包来实现
涉及到的类有:Point、Rect 和Color、Bitmap(位图)、Paint、Canvas(画布,核心类,处理onDraw()调用),主要绘制的设置和操作在Paint(画笔)和Canvas(画布)2个类当中
OpenGL 3D图形