Android第四章Activity

首先Activity是四大组件之一,也是用的最多的组件,主要负责显示内容和用户交互的部分。

Activity到底是怎么一回事,我也花了一段时间来查看好多网站和书本才略懂一些,个人觉得学习Activity首先就应该看它的生命周期:


这张图值得仔细琢磨,一个Activity的生命周期中:创建起来就会自动调用onCreate()-->onStart()-->onResume()然后就显示了,当你按BACK键的时候就会一次调用onPause()-->onStop()-->onDestroy(),举个最直接的例子就是建完工程之后运行,然后按BACK键结束应用,这2个动作对应于上面的2个过程。

还有各种情况,http://www.oschina.net/question/54100_27841这个博客讲得好具体易懂了,我学习的时候就参考了这个博客,看完这个博客,大体就了解了Activity的生命周期中各种函数什么时候会调用。


知道了各种函数什么时候调用还不够,下面就具体地重现下这些情况,在这个之前先来学习一下一些类,很多书都是这样:举的例子里面都涉及了后面的知识,然后在下面注释一下叫你详细的请参数后面第几章的内容,好讨厌的感觉。

(1)Bundle类:类似于Map的一个类,保存的也是key-value对:举个例子:

Bundle bundle=new Bundle();
bundle.putString("username", "my_username");
bundle.putInt("password", 123456);
String usernameString=bundle.getString("username");
int password=bundle.getInt("password");

(2)Intent类:它是Android组件之间通信的信使,Intent对象就好比一个信封,要有目的地(必须有)和内容(可选),参考自http://www.ibm.com/developerworks/cn/opensource/os-cn-android-actvt/


(3)Android的调试方法:Logcat,利用Log类的各种方法来显示内容Log.e(TAG, "onCreate-----------------");这样一句话运行的时候就会在Logcat的error栏目输出onCreate-----,通过这个可以确定这个语句所在的方法运行了。

有了这个大体的了解之后就好讲了。


Activity的创建:

我们键工程的时候就自动生成了一个Activity,下面来了解一下Eclipse帮我们做了哪些工作:Activity的java源代码,onCreate(){配置XML布局文件};AndroidManifest.xml中<application>标签内的<activity>标签的设置(Activity组件需要显示声明在这个XML中)
再结合Activity的生命周期:启动Activity,首先调用onCreate(),在这个函数里面设置好了这个Activity的布局,在调用onStart(),最后调用onResume(),然后Activity就running中了。
在AndroidManifest.xml中怎么配置Activity:


启动另一个Activity:

到目前为止我们都是在一个Activity上弄它的布局XML文件,那么如何弄多个Activity,我刚接触安卓的时候就很想知道这个问题了,一直等到这时候才知道。
先来介绍一个Activity.startActivity(Intent)这个函数,开启一个Activity的功能,这里就用到了上面的Intent作为参数,这里要注意的问题就是这个函数是真的新开一个目的地的Activity对象的,这里举个例子:MainActivity里面有一个Button1,按它跳到SecondActivity,SecondActivity里面有一个Button2可以跳回MainActivity。
Button1的监听器:
<pre name="code" class="java">btn1.setOnClickListener(new View.OnClickListener()
		{
			
			@Override
			public void onClick(View arg0)
			{
				// TODO Auto-generated method stub
				Intent intent=new Intent(MainActivity.this, SecondActivity.class);
				startActivity(intent);
			}
		});

Button2的监听器:
 
 
<pre name="code" class="java"><span style="font-family: Arial, Helvetica, sans-serif;">btn2.setOnClickListener(new View.OnClickListener()</span>
		{
			
			@Override
			public void onClick(View arg0)
			{
				// TODO Auto-generated method stub
				Intent intent=new Intent(SecondActivity.this, MainActivity.class);
				startActivity(intent);
			}
		});


 这里再来结合一下Activity的生命周期来了解生命周期: 
Main.onCreate()----->Main.onStart()----->Main.onResume()---按Button1--->Main.onPause()----->Second.onCreate()----->Second.onStart()------>Second.onResume()----->Main.onStop()-----按Button2------>Second.onPause()-------->Main.onCreate()----->Main.onStart()----->Main.onResume()
按button2会再生成一个MainActivity对象放到Activity栈顶,也就是说现在栈中情况是:MainActivity(1)《----SecondActivity《-----MainActivity(2)
这时按BACK键退出程序会先把MainActivity(2)弹出栈,展示SecondActivity,再按BACK弹出SecondActivity,再按BACK,弹出MainActivity(1),才显示桌面




Activity之间的信息交流:

这个比较重要,A  activity和  B activity,如果A的数据直接发给B就完事了可以往Intent那里绑定Bundle发过去,像Intent的介绍那样做,但是如果是A的一个按钮去B,在B填好数据再返回给A就不可以这样了,因为如果利用startActivity函数,栈中就会有2个A了,这并不是我们所希望的,除了这个函数,我们还有一个startActivityForResult()函数专门负责处理这种情况,详情看:http://www.cnblogs.com/mubai/archive/2011/09/21/2183816.html,我也是看这个网站学习的,主要就是A中启动了B,B处理好数据setResult()之后finish自己,弹出栈,这个时候压在B底下的Activity ---A就变回栈顶(会调用onRestart()---->onStart()----->onResume()但是这3个函数都没办法接收到B中的数据),除此之外A还会回调onActivityResult()函数,这个函数里面就有B传回来的Intent作为参数,然后就可以利用这些信息了。



Activity的加载模式:

standard:默认的加载模式,启动Activity时总会为Activity创建实例放到栈顶中,这也是我们之前startActivity()为何会有多个MainActivity的原因。
SingleTop:启动Activity的时候,如果栈顶的Activity和目标同类,就不再创建实例,直接用栈顶的同类的实例
SingleTask:启动Activity的时候,如果栈中有同类的Activity,就会把它上面的Activity全部弹出栈,让它置顶
SingleInstance:这种模式是针对多个Activity栈的情况,暂时不明白
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值