关于Avitivity

来源:互联网 发布:生物信息学 知乎 编辑:程序博客网 时间:2024/06/05 15:47

<!--  这是写在最前的,本人刚刚进入这个行业,前面会发一些简单实用的介绍,今天第一篇,就先发关于Android的最基本一个——activity --!>


(一)activity是Android四大组件之一,先来看看它的生命周期:

Activity的生命周期过程。
1、  运行:
    onCreate
    onStart
    onResume

2、按下返回按键:
    onPause
    onStop
    onDestroy

3、长按Home键,弹出最近打开过的应用程序,在进入程序
    onCreate
    onStart
    onResume

4、按Home键
    onPause
    onStop

5、在AllList中点击打开
    onRestart
    onStart
    onResume

以下是网上的一张图,很有助于理解:


(二)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

如果应用1的任务栈中创建了MainActivity实例,如果应用2也要激活MainActivity,则不需要创建,两应用共享该Activity实例;

(四)保存Activity运行状态onSaveInstanceState

通过重写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掉
   
通过广播来完成退出功能

今天整理就到这里了,希望能帮到大家…






1 0