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显示的时间。
?
顾名思义,该控件指的是进度条控件,?进度条在布局文件中进行配置,其中通过设置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?