`
xifangyuhui
  • 浏览: 185759 次
  • 性别: Icon_minigender_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
 

<!--StartFragment -->

 上图是使用了普通Activity(FirstAcvity)和Dialog样式的Activity(SecondActivity)交替执行时他们的Activity生命周期各个阶段的变化。注意图中第9行和第10行,从对话框式Activity回到普通Activity时的生命周期变化,其中SecondActivity执行onPause方法很正常,但是此时FirstActivity 却执行了onStop方法,并且接着执行了onCreate方法而不是onRestart方法,着实令我疑惑。若有网友能解释此处原因,麻烦告知。另外在图中第14行和15行,SecondActivity并未执行onDestroy方法,理应执行onRestart方法,而这里却执行了onCreate方法,也非常令我疑惑。

 

 八、Activity的布局

 

(1)LinearLayout

android:orientation="vertical" ——可选horizontal 和 vertical 表示控件水平放置或者垂直放置,即横向布局和纵向布局

常见的控件属性

       android:id  —— 为控件指定相应的ID
     android:text —— 指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xml文件当中的字符串
     android:grivity —— 指定控件中文字的基本位置,比如说居中,居右等位置
     android:textSize —— 指定控件当中字体的大小
     android:background —— 指定该控件所使用的背景色,RGB命名法
     android:width —— 指定控件的宽度
     android:height —— 指定控件的高度
     android:padding* —— 指定控件的内边距,也就是说控件中的内容与控件边框之间的距离,可以不用指定left,right,top,bottom,直接指定padding表示四边边距。

     android:margin* —— 指定控件的外边距,也就是控件边框之间的距离,可以不用指定left,right,top,bottom,直接指定margin表示四边边距。
     android:layout_weight —— 控件之间的大小比例,当前控件所占的比例为:当前控件的weight/所有控件的weight之和
     android:sigleLine —— 如果设置为真的话,则将当前控件的所有内容在同一行当中进行显示

(2)TableLayout

TableLayout标签本身的属性android:stretchColumns表示拉伸某一列来填满父控件的控件,例如对于TableRow来说,其中有很多控件,但是这些控件都无法让TableRow填满,此时设置了拉伸列,那么指定列将会被拉伸来填满TableRow。

TableLayout中可以包含很多的TableRow标签,TableRow标签中的每个控件占据一列,每个TableRow标签代表占据一行。

 

为了得到复杂的布局,各个Layout之间是可以相互嵌套的

 

(2)RelativeLayout 相对布局

 

常见控件的布局,分为四组:

  android:layout_above 将该控件的底部至于给定ID的控件之上
  android:layout_below 将该控件的顶部至于给定ID的控件之下
  android:layout_toLeftOf 将该控件的右边缘和给定ID的控件的左边缘对齐
  android:layout_toRightOf 将该控件的左边缘和给定ID的控件的右边缘对齐

 

  android:layout_alignBaseline 该控件的baseline和给定ID的控件的baseline对齐
  android:layout_alignBottom 将该控件的底部边缘与给定ID控件的底部边缘
  android:layout_alignLeft 将该控件的左边缘与给定ID控件的左边缘对齐
  android:layout_alignRight 将该控件的右边缘与给定ID控件的右边缘对齐
  android:layout_alignTop 将给定控件的顶部边缘与给定ID控件的顶部对齐


  android:alignParentBottom 如果该值为true,则将该控件的底部和父控件的底部对齐
  android:layout_alignParentLeft 如果该值为true,则将该控件的左边与父控件的左边对齐
  android:layout_alignParentRight 如果该值为true,则将该控件的右边与父控件的右边对齐
  android:layout_alignParentTop 如果该值为true,则将空间的顶部与父控件的顶部对齐

 

  android:layout_centerHorizontal 如果值为真,该控件将被至于水平方向的中央
  android:layout_centerInParent 如果值为真,该控件将被至于父控件水平方向和垂直方向的中央
  android:layout_centerVertical 如果值为真,该控件将被至于垂直方向的中央

 

 

未完待续。

 

 

 

 

感谢mars老师录制的教学视频:http://www.verycd.com/topics/2837883/

 



  


  
1
0
分享到:
评论
1 楼 ITcms 2015-04-12  
Activity直接执行了onCreate方法的那部分,我觉得可能是因为系统资源不足了,系统自动销毁哪些不在前台的Activity,所以就造成了直接执行onCreate方法

相关推荐

Global site tag (gtag.js) - Google Analytics