<!-- 这是写在最前的,本人刚刚进入这个行业,前面会发一些简单实用的介绍,今天第一篇,就先发关于Android的最基本一个——activity --!>
(一)activity是Android四大组件之一,先来看看它的生命周期:
Activity的生命周期过程。1、 运行:onCreateonStart
onResume
2、按下返回按键:onPauseonStoponDestroy
3、长按Home键,弹出最近打开过的应用程序,在进入程序onCreateonStartonResume
4、按Home键onPauseonStop
5、在AllList中点击打开onRestartonStartonResume
以下是网上的一张图,很有助于理解:
(二)Activity之间传递数据
在传递端:
Intent intent = new Intent(this,Activity.class);
Bundle bundle = new Bundle();
bundle.putBoolean("bool_key", true);
intent.putExtras(bundle);
startActivity(intent);接受数据:
Intent intent = new Intent(ActivityLifeDemo.this,RevalueActivity.class);
startActivityForResult(intent, 0x1001);
startActivityForResult方法就是默认可以传回来参数,那么“revalue_key”值在哪里获取呢?必须重写onActivityResult方法,通过判断requestCode,来确定。
if(requestCode==0x1001)String str = data.getStringExtra("revalue_key");
假设要传递的是数组。那要怎么办?androidintent传递list或者对象:
方法一:
如果单纯的传递List<String> 或者List<Integer>的话就可以直接使用
Java代码:
intent.putStringArrayListExtra(name,value)
intent.putIntegerArrayListExtra(name,value)
方法二:
如果传递的是List<Object>,可以把list强转成Serializable类型,然后通过
Java代码 putExtras(key, (Serializable)list)
方法传递过去,接受的时候用
Java代码 (List<YourObject>) getIntent().getSerializable(key)
就可以接受到List<YourObject>数据了
但是 切记 你的YourObject类必须要实现Serializable接口
方法三:一种是
Java代码 Bundle.putSerializable(Key,Object);
另一种是
Java代码 Bundle.putParcelable(Key, Object);
当然这些Object是有一定的条件的,前者是实现了Serializable接口,而后者是实现了Parcelable接口
方法四:
用intent传来传去觉得不方便 我们可以写一个在application里面的全局数据
1、创建一个属于你自己的android.app.Application的子类2、在manifest中申明一下这个类,
3、这时android就为此建立一个全局可用的实例,你可以在其他任何地方使用Context.getApplicationContext()方法获取这个实例,进而获取其中的状态(变量)。
Log.i(TAG, "返回的值为:"+str);
(三)Activity四种启动模式
详细可以参考以下同学的,写得比较清晰:
http://www.cnblogs.com/meizixiong/archive/2013/07/03/3170591.html
可以根据实际的需求为Activity设置对应的启动模式,从而可以避免创建大量重复的Activity等问题。设置Activity的启动模式,只需要在AndroidManifest.xml里对应的<activity>标签设置android:launchMode属性standard
默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。
例如:
若我有一个Activity名为A1, 上面有一个按钮可跳转到A1。那么如果我点击按钮,便会新启一个Activity A1叠在刚才的A1之上,再点击,又会再新启一个在它之上……
点back键会依照栈顺序依次退出。singleTop
可以有多个实例,但是不允许多个相同Activity叠加。即,如果Activity在栈顶的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法。
例如:
若我有两个Activity名为B1,B2,两个Activity内容功能完全相同,都有两个按钮可以跳到B1或者B2,唯一不同的是B1为standard,B2为singleTop。
若我意图打开的顺序为B1->B2->B2,则实际打开的顺序为B1->B2(后一次意图打开B2,实际只调用了前一个的onNewIntent方法)
若我意图打开的顺序为B1->B2->B1->B2,则实际打开的顺序与意图的一致,为B1->B2->B1->B2。singleTask
只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。
如果是在别的应用程序中启动它,则会新建一个task,并在该task中启动这个Activity,singleTask允许别的Activity与其在一个task中共存,也就是说,如果我在这个singleTask的实例中再打开新的Activity,这个新的Activity还是会在singleTask的实例的task中。
singleInstance
(四)保存Activity运行状态onSaveInstanceState如果应用1的任务栈中创建了MainActivity实例,如果应用2也要激活MainActivity,则不需要创建,两应用共享该Activity实例;
通过重写onSaveInstanceState()方法来实现Activity的运行状态,请注意以下几点:
1)由于activity 对象被暂停或停止时,它仍然保留在内存里面,关于它的成员信息和当前状态都是活动的,所以此时可以保存Activity的状态,从而使用户所作的Activity的更改保
存在内存中
2) 当系统回收内存而将Activity销毁时,就无法保存其状态,所以需要调用onSaveInstanceState()方法来实现状态的保存
3) 很多情况并不需要保持状态信息,比如按下返回键直接关闭程序,所以并不能保证会调用onSaveInstanceState。如果调用了该方法,一般是在onStop 方法之前且可能在
onPause 之后调用。尽管如此,即使你没做任何操作或没有实现 onSaveInstanceState() 方法,你的 activity 状态也能通过Activity 类里面默认实现的 onSaveInstanceState 方
法恢复出来。特别是会为布局中的视图( View )默认调用onSaveInstanceState 方法,并在这个方法中允许每一个视图提供它需要恢复的任何信息。几乎每一个 Android框架中
的 widget 都视情况实现了这个方法。
注:因为 onSaveInstanceState 方法不一定会被调用,所以你应该只是用它来保存一些 activity 的转换过程状态(即 UI 的状态),而不能用来保存永久性数据。但你可以用
onPause 方法在用户离开 activity 时来保存永久性数据,比如需要保存到数据库的数据。
有一个很好的方法可以用来检验应用程序保存状态的能力,就是简单地旋转你的设备来改变屏幕的方向。因为当屏幕方
向改变时,系统为了给新的方向提供一个可能合适的代替资
源,会销毁 activity 并新建一个新的。
由于这个原因,你的 activity 是否能在其重新创建时完成保存状态就显得尤为重要,因为用户经常会在使用应用程序时
旋转屏幕的。
(五)完全退出程序
我们知道当点击back键时,程序调用了onDestroy方法,程序退出了,但是我们查看其进程,发现调用了onDestroy方
法之后这个Activity还在运行。甚至调用了finish()方法之后程序还能在进程中看到。通过下面这种方式可以实现程序的
完全退出:
Intent intent = new Intent();
Intent.setClass(context,MainActivity. class );
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra(“flag”,EXIT_APPLICATION);
context.startActivity(intnet);
附:
退出单个Activity方法:
调用finish杀死该进程:killprocess(Process.mId)
终止正在运行的虚拟机:system.exit()
退出整个应用:
制造抛异常导致整个程序退出将所有的activity放入到一个list中,然后在需要退出的时候,将所有的activity,finish掉
通过广播来完成退出功能
今天整理就到这里了,希望能帮到大家…