Android之Activity学习_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > Android之Activity学习

Android之Activity学习

 2010/11/19 9:20:04  xifangyuhui  http://xifangyuhui.javaeye.com  我要评论(0)
  • 摘要:appearsasafloatingviewovertheapplication.Itwillneverreceivefocus.Activity学习:一、Activity认识Activity是用户与Android应用程序交互的接口,用户操作应用程序都是通过Activity完成的,这只是一种抽象的定义方式。在Activity中可以放置各种控件,如TextView,Button等,又可以把它看作是一个控件容器。二、创建Activity以及运行Activity的步骤1
  • 标签:Android Activity学习

appears as a floating view over the application. It will never receive focus.Activity学习

一、Activity认识

Activity是用户与Android应用程序交互的接口,用户操作应用程序都是通过Activity完成的,这只是一种抽象的定义方式。在Activity中可以放置各种控件,如TextView,Button等,又可以把它看作是一个控件容器。

二、创建Activity以及运行Activity的步骤

1、一个Activity其实就是一个类,这个类继承于Activity。

2、需要覆盖onCreate(Bundle savedInstanceState)方法,该方法在Activity第一次运行时,Activity框架会调用这个方法。

3、由于Activity是Android应用程序的一个组件,所以每一个Activity都需要在android的配置文件AndroidManifest.xml中进行配置。

4、为Activity添加必要的控件,如何添加呢?在layout文件夹中创建一个声明一个xml格式的布局文件,然后再在这个布局文件中对Activity的布局以及不同的控件进行设置。

5、再在第一步定义的Activity子类中通过findViewById(R中对应的id类中控件的id)方法来获取布局文件中声明的控件,前提是布局文件中必须声明这些控件的id.

三、多个Activity之间的关系

Activity之间可以传递数据,而且Activity不仅仅必须在同一个应用程序内,也可以在不同的应用程序之间。使用startActivity(Intent intent)来执行另外一个Activity,其中intent是很关键的,它象征了请求,其中包含了请求执行的动作,携带的数据等等信息。

四、Intent的作用

可以把Activity理解为一个请求,其中包含了以下一组信息:

Component name: 请求的组件的名称

Action: 组件拿到intent后执行的动作

Data: Activity之间或者是和别的应用程序之间传递的数据

Category

Extras: 一些额外的信息,它们都是键值对

Flags

Intent的setClass(page1.this, page2.class);其中第一个参数是启动Intent的Activity,第二个参数是被启动的Activity。

onClickListener 点击行为监听器,和Swing中的监听器类似,可以作为Activity的内部类或者是匿名类定义,复写其中的onCreate()方法。

?

public class Activity02 extends Activity { /** Called when the activity is first created. */ 

//代表按钮对象的引用

 private Button myButton = null; 

//复写父类当中的onCreate方法,Activity第一次运行时会调用这个方法 

@Override

 public void onCreate(Bundle savedInstanceState) { 

	super.onCreate(savedInstanceState); //为Activity设置布局管理文件
	setContentView(R.layout.main); //以下两行代码是根据控件的ID来得到控件对象
	myButton = (Button)findViewById(R.id.myButton); //为按钮对象设置监听器对象
	myButton.setOnClickListener(new MyButtonListener()); } //以下是一个内部类,这个内部类的对象是一个监听器(如果大家对监听器不是很熟悉,可以参考设计模式当中的观察者模式)
       class MyButtonListener implements OnClickListener{
          //生成该类的对象,并将其注册到控件上。如果该控件被用户按下,就会执行onClick方法
	@Override
	public void onClick(View v) {
	 //生成一个Intent对象
	 Intent intent = new Intent();
	 //在Intent对象当中添加一个键值对
	 intent.putExtra("testIntent", "123"); 
	//设置Intent对象要启动的Activity
	 intent.setClass(Activity02.this, OtherActivity.class);
	 //通过Intent对象启动另外一个Activity
	 Activity02.this.startActivity(intent);
	 /**以下的4行代码将启动发送短信的Activity,详细的情况会在以后的课程当中进行介绍
	 Uri uri = Uri.parse("smsto://0800000123");
	 Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
	 intent.putExtra("sms_body", "The SMS text");
	 startActivity(intent); */ 
              }

     }

 }

?

??

五、在一个Activity中启动另外一个Activity的方法

利用startActivity(Intent intent)方法启动另外一个Activity

六、使用Intent在Activity之间传递数据的基本方法

?使用Intent的putExtra("key", "value")方法来传递,在对应的Activity中利用getStringExtra("key")来取得值,当然首先要getIntent()得到从另外一个Activity中传递过来的Intent对象。

七、常见的Activity控件

1、EditText:类似于html中的文本输入框,用户在其中输入文本

2、TextView:显示文本的控件

3、Button:按钮

4、Menu:菜单控件

前面三个都需要在Activity对应的布局文件中进行注册,而Menu控件不需要在布局文件中进行注册。

?

?public boolean onCreateOptionsMenu(Menu menu)? 当用户点击MENU按钮的时候会调用该方法,因此如果想实现点击MENU按钮弹出一个菜单就需要复写该方法。

通过调用add(int?groupId, int?itemId, int?order, int?titleRes)?来添加菜单项,该方法返回的结果是MenuItem,注意该方法的四个参数,第一个是组id,第二个是菜单项id,第三个是顺序id,最后一个是菜单项的值,这个值应该定义在string.xml中,方便实现国际化。

那么当用户选择了某个菜单项的时候又怎么办呢?

复写public boolean onOptionsItemSelected(MenuItem item)方法,在方法中利用getItemId()方法来判断用户点击的MenuItem(利用ItemId)是哪个,并执行相应的操作。

结束程序执行时,调用Activity的finish()就可以了。

?

5、RadioGroup和RadioButton

顾名思义,RadioButton即单选按钮,多个RadioButton是属于同一个RadioGroup的,因此在布局文件中,RadioButton标签是作为RadioGroup的子元素存在的。RadioGroup也可以配置orientation,即其中的radioButton的排列方式。

在Activity中,如果需要对RadioGroup和RadioButton添加监听器,需要对RadioGroup对象添加监听器,通过调用:

genderGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()?//匿名内部类

来为当前的RadioGroup添加监听器,监听后执行的操作需要继承RadioGroup的内部类OnCheckedChangeListener,并且复写public void onCheckedChanged(RadioGroup group, int checkedId)方法。调用RadioButton对象的getId()和checkedId来进行比较,判断点击的是哪个RadioButton。

?

6、CheckBox

?和RadioButton不一样,checkBox表示复选框,它没有组的概念在里面,在为checkBox设置监听器的时候,需要为每个CheckBox都设置一个监听器,而不是像RadioButton那样,只为RadioGroup设置监听器。通过调用CheckBox对象的setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {来添加监听器。它是复写的CompoundButton的内部类OnCheckedChangeListener的public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)来实现的。CheckBox继承于compoundButton。其中isChecked顾名思义,表示是否选中,根据此值再来完成相应地操作。

?

7、Toast

?A toast is a view containing a quick little message for the user.简单翻译Toast就是一个包含了提醒用户的信息的一个视图。appears as a floating view over the application. It will never receive focus.Toast视图是漂浮在别的Activity之上的,而且它永远不能获得焦点。

调用Toast的静态方法

?public static Toast makeText(Context?context, CharSequence?text, int?duration)

来添加一个Toast,该Toast展示的结果是text中的值,duration表示该Toast显示的时间。

?

8、ProgressBar

顾名思义,该控件指的是进度条控件,?进度条在布局文件中进行配置,其中通过设置ProgressBar的style属性来选择不同的进度条:

style="?android:attr/progressBarStyleHorizontal"? 水平进度条

style="?android:attr/progressBarStyle"?? 普通进度条

通过设置visibility属性来设置进度条是否可见:

android:visibility="gone" //不可见,具体的可见性在Activity中进行设置

对于水平进度条,还可以在布局文件中设置进度条的max属性,指定进度条的基数:

android:max="100"

在Activity中可以调用进度条对象的setVisibility(View.VISIBLE)来设置进度条是否可见,也可以调用setMax()来设置水平进度条的基数。另外,还可以调用进度条的

setProgress(int?progress) 来设置主进度条的位置,进度条的位置位于:progress/max(max是水平进度条的基数)

setSecondaryProgress(int?secondaryProgress) 用来设置第二进度条的当前位置,原理同上面的方法。

?


9、ListView

?

?

?

?

?八、Activity的生命周期

?

public class Activity extends ApplicationContext {

protected void onCreate(Bundle savedInstanceState);

?protected void onStart();

?protected void onRestart();

?protected void onResume();

?protected void onPause();

?protected void onStop();

?protected void onDestroy(); }

?

?

Activity中上面的七个方法代表了Activity生命周期的七个阶段,其中当Activity第一次被创建的时候会执行onCreate方法,而当Activity创建完后并且展示给用户的时候会调用onStart方法,接着如果该Activity获得焦点将会由Android系统调用该Activity的onResume方法,接下来,如果该Activity执行了另外一个Activity,那么上一个Activity的onPause方法会被调用以执行一些资源的释放操作,接下来执行新的Activity的onCreate,onStart以及onResume方法,如果新建的Activity完全覆盖了原来的Activity,那么原来Activity的stop方法将会被调用。而当从新建的Activity中会到原来的Activity时onRestart方法会被调用,并连续执行onStart()以及onResume(),此时不会再执行onCreate(),因为该Activity并未被销毁,如果在Activity中执行了finish()或者Android系统需要回收资源时可能会执行Activity的onDestroy()。

注意,在Activity的执行过程中,存在一个Task的概念,Task其实就是一个Activity栈,先进后出,其中首先执行的Activity入栈,接下来执行的Activity继续入栈,如果Activity执行了finish(),将不会被放入Task栈中,新的Activity入栈的时候,上一个Activity会执行onPause(),接下来是刚入栈的Activity的onCreate,onStart,onResume方法,接下来可能会执行上一个Activity的onStop方法,当从Task栈中弹出Activity的时候,会首先执行上一个弹出的Activity的onPause(),接着执行当前Activity的onRestart(),onStart()以及onResume(),再执行上一个弹出的Activity的onStop()以及onDestroy()。弹出的Activity若要再次被执行,即进入Task栈,需要再次执行onCreate来创建它,因为此时它已经被销毁,不能再onRestart了。

即从Task栈中弹出Activity时会执行将弹出的Activity给销毁掉。

?

android:theme="@android:style/Theme.Dialog" 设置当前Activity为弹出式的Activity,其中Task栈中前一个Activity并未被完全覆盖,因此此时只会调用前一个Activity的onpause()方法,而不会调用onStop方法。

?

<!--StartFragment -->

11-14 13:14:37.342: INFO/System.out(267): FirstActivity ---> onCreate     
11-14 13:14:37.403: INFO/System.out(267): FirstAcvity --->onStart
11-14 13:14:37.413: INFO/System.out(267): FirstAcvity --->onResume
11-14 13:14:45.093: INFO/System.out(267): FirstAcvity --->onPause
11-14 13:14:45.132: INFO/System.out(267): SecondActivity--->onCreate
11-14 13:14:45.142: INFO/System.out(267): SecondActivity--->onStart
11-14 13:14:45.152: INFO/System.out(267): SecondActivity--->onResume
11-14 13:14:53.433: INFO/System.out(267): SecondActivity--->onPause
11-14 13:14:53.473: INFO/System.out(267): FirstAcvity --->onStop
11-14 13:14:53.473: INFO/System.out(267): FirstActivity ---> onCreate     
11-14 13:14:53.493: INFO/System.out(267): FirstAcvity --->onStart
11-14 13:14:53.493: INFO/System.out(267): FirstAcvity --->onResume
11-14 13:14:53.833: INFO/System.out(267): SecondActivity--->onStop
11-14 13:17:02.293: INFO/System.out(267): FirstAcvity --->onPause
11-14 13:17:02.323: INFO/System.out(267): SecondActivity--->onCreate
11-14 13:17:02.342: INFO/System.out(267): SecondActivity--->onStart
11-14 13:17:02.352: INFO/System.out(267): SecondActivity--->onResume
?
发表评论
用户名: 匿名