Android系统开发01—Android基本组件
Android系统开发01—Android基本组件
1.应用程序生命周期
应用程序进程从创建到结束的全过程便是应用程序的生命周期。与其他系统不同,Android应用程序的生命周期是不受进程自身控制的,而是由Android系统决定的。
Android系统将所有的进程分为5类进行管理:
1.前台进程
2.可见进程:还在屏幕中,但是用户并没有直接与之进行交互。
3.服务进程
4.后台进程
5.空进程
从1到5,重要顺序递减。
注意:应用程序在运行时,其状态的切换可能是通过自身实现的,可也能是系统将其改变的。
2.Activity
Activity是Android中最常用的组件,是应用程序的表示层,Activity一般通过View来实现应用程序的用户界面,相当于一个屏幕,用户与程序的交互式通过该类实现的。
Activity的生命周期主要包含三个状态:运行态,暂停态,停止态。
Activity的显示内容跟是由View对象提供的,View对象继承自View类,其中每个View对象管理屏幕中的一个矩形区域。Android自带了许多View对象,而除了使用Android自带的View外,还可以自定义View。
例子:
MyView.java: package qijia.si; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.View; public class MyView extends View { Paint paint; public MyView(Context context){ super(context); paint = new Paint(); paint.setColor(Color.WHITE); paint.setTextSize(20); paint.setAntiAlias(true); } protected void onDraw(Canvas canvas){ super.onDraw(canvas); canvas.drawColor(Color.GRAY); canvas.drawRect(10,10,110,110, paint); canvas.drawText("fuck you", 60, 170, paint); } } MyAndroidProject.java: package qijia.si; import android.app.Activity; import android.os.Bundle; public class MyAndroidProject extends Activity { /** Called when the activity is first created. */ MyView myView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); myView = new MyView(this); this.setContentView(myView); } }3. Service
Service是一个具有较长的生命周期但是并没有用户界面的程序。
Service一般由Activity启动,但不依赖于Activity,Service有两种启动方式:
1.startService
当Activity调用startService方法启动Service时,会依次调用onCreate和onStart方法来启动Service。当结束时,调用onDestroy方法结束Service。
2.bindService
BoardReceiver
BoardReceiver为用户接收广播通知的组件,当系统或某个应用程序发送广播时,可以使用BoardReceiver组件来接收广播信息并作出相应的处理。
使用过程:
1.将需要广播的消息封装到Intent中。
2.Context.sendBroadcast(),sendOrderedBroadcast(),sendStickyBroadcast()中的一种将Intent发送
3.通过IntentFilter对象过滤所发送的实体Intent
4.重写onReceive方法的BoardReceiver。
4.ContentProvider
ContentProvider是用来实现应用程序之间数据共享的类。
5.Intent和IntentFilter
1)Intent类简介
Intent是一种运行时绑定机制,在应用程序运行时连接两个不同的组件。一般的应用是通过Intent向Android系统发出某种请求,然后Android系统会根据请求查询各个组件声明的IntentFilter,找到需要的组件并运行它。
前面所说的Activity,Service及BroadcastReceiver组件之间的通信全部使用的是Intent但是每个机制不同。
Activity组件:当需要激活一个Activity组件时,需要调用Context.startActivity或Context.startActivityForResult方法来传递Intent,此时的Intent参数成为ActivityActionIntent
Service组件:一般通过Context.startService和Context.bindService
BroadcastReceiver组件:上面已经介绍
Intent是由组件名称,Action,Data,Category,Extra和Flag组成:
1.组件名称:组件名称实际上就是一个ComponentName对象,用于标识唯一的应用程序组件。
2.Action:一个描述Intent所触发动作名称的字符串。如
ACTION_CALL,ACTION_EDIT,ACTION_VIEW,ACTION_MAIN等
3.Data:主要对Intent消息中数据的封装,主要描述Intent的动作所操作到的数据的URI及类型
4.Category:是对目标组件类型的描述
5.Extra:封装了一些额外的附加信息。
2)IntentFilter
IntentFilter实际上相当于Intent的过滤器。IntentFilter过滤Intent时,主要通过Action,Data及Category三方面进行监测:
1.检查Action:一个Intent只能设置一种Action,但是一个IntentFilter却可以设置多个Action过滤。当IntentFilter设置了多个Action时,只需一个满足就可完成Action验证。
2.检查Data:主要检查URI及数据类型
3.检查Category:当Intent中的Category与IntentFilter中的一个Category完全匹配时,便会通过Category检查。
Intent案例:
判断输入的电话号码是否符合规范当符合规范时,调用系统自带的拨号程序进行拨号。
package qijia.si; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.telephony.PhoneNumberUtils; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MyAndroidProject extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button bCall = (Button)this.findViewById(R.id.Button01); bCall.setOnClickListener( new View.OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub EditText eTel = (EditText) findViewById(R.id.myEditText); String strTel = eTel.getText().toString(); if(PhoneNumberUtils.isGlobalPhoneNumber(strTel)){ Intent i = new Intent(Intent.ACTION_DIAL,Uri.parse("tel://"+strTel)); MyAndroidProject.this.startActivity(i); }else{ Toast.makeText( MyAndroidProject.this, "号码格式不正确", 5000 ).show(); } } } ); } }