1. 说明:
Activity是Android组件中最基本也是最为常见用的四大组件(Activity,Service服务,Content Provider内容提供,BroadcastReceiver广播接收器)之一。Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务。是一个负责与用户交互的组件,可以通过setContentView(View)来显示指定控件。在一个应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。
2. Activity生命周期
onCreate():在创建Activity是被回调,在这里你应该完成所有常见的静态设置工作——创建view、绑定list数据等等
onRestart():activity被停止后、又再次被启动之前调用(Acitivity没有被系统销毁情况下)。
onStart():启动Activity时被回调
onResume():activity开始与用户交互之前回调。这时activity是在activity栈的顶端,用户可以向其中输入。
onPause():当系统准备启动另一个activity时回调。这个方法通常用于把未保存的改动提交为永久数据、停止动画播放、以及其它可能消耗CPU的工作等等。 它应该非常迅速地完成工作,因为下一个activity在本方法返回前是不会被恢复运行的。如果activity返回前台,则下一个回调方法是onResume();如果进入用户不可见状态,则下一个是onStop()。
onStop():当activity不再对用户可见时回调。原因可能是它即将被销毁、或者其它activity(已有或新建的)被恢复运行并要覆盖本activity。如果activity重新与用户交互,则下一个回调方法是onRestart();如果这个activity即将消失,则下一个回调方法是onDestroy()。
onDestroy():在本activity被销毁前回调。这是activity收到的最后一个调用。 可能是因为activity完成了工作(手动调用finish()), 也可能是因为系统为了腾出空间而临时销毁activity的本实例。 可以利用isFinishing() 方法来区分这两种情况。
3. 参数传递
在Activity之间的跳转是有时会将上个Activity中的数据传到下一个Activity中,或者当前Activity退出时数据返回到上一个Activity中。
(1)当前Activity向下一个Activity传递参数:
a、Intent传递一些简单的参数
当前Activity调用putExtra(name, value);存放键值对(key-value)
Intent intent = new Intent(this,xxxx.class);
intent.putExtra(name, value);
startActivity(intent);
在另一个Activity中,获取传递过来的参数
Intent i = getIntent();
String value = i.getStringExtra("name");
b、Bundle 传递数据
当前Activity中将数据放入Bundle中,再使用intent传递(bundle也是存放键值对)
Bundle bundle = new Bundle();
bundle.putString(name, value);
intent.putExtras(bundle);
另一个activity中接受数据
Intent intent=getIntent();
Bundle bundle=intent.getExtras();
String value=bundle.getString(name);
注:其中key都是String类型
(2)当前Acitivity将数据返回到上一个Activity:
列:A==>B,B==>A。activityA跳转到activityB,然后从B返回到A,并将B中的数据同时返回到A中
A:
调用startActivityForResult(intent, requestCode);其中requestCode为请求码。
并重写onActivityResult(int requestCode, int resultCode, Intent data);其中resultCode为结果码,data为另一个Activity返回的数据(类似activityB)。
public class MainActivity extends Activity
{
private Button mainBtn=null;
private final static int REQUEST_CODE=1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mainBtn=(Button)findViewById(R.id.mainBtn);
mainBtn.setOnClickListener(listener);
}
private OnClickListener listener=new OnClickListener()
{
@Override
public void onClick(View v)
{
Intent intent=new Intent();
intent.setClass(MainActivity.this, SecondActivity.class);
intent.putExtra("name", "小明");
startActivityForResult(intent, REQUEST_CODE);
}
};
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (requestCode==REQUEST_CODE)
{
if (resultCode==SecondActivity.RESULT_CODE)
{
Bundle bundle=data.getExtras();
String str=bundle.getString("backA");
Toast.makeText(MainActivity.this, str, Toast.LENGTH_LONG).show();
}
}
}
}
B:
调用setResult(resultCode, data);其中resultCode为结果码,data为intent
public class SecondActivity extends Activity
{
public final static int RESULT_CODE=1;
private TextView secondTxt;
private Button secondBtn;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
Intent intent=getIntent();
Bundle bundle=intent.getExtras();
String str=bundle.getString("name");
secondTxt=(TextView)findViewById(R.id.secondTxt);
secondTxt.setText(str);
secondBtn=(Button)findViewById(R.id.secondBtn);
secondBtn.setOnClickListener(listener);
}
private OnClickListener listener=new OnClickListener()
{
@Override
public void onClick(View v)
{
Intent intent=new Intent();
intent.putExtra("backA", "Back A");
setResult(RESULT_CODE, intent);
finish();
}
};
}
注: 这里 要说明的是RESULT_CODE必须与前一个Activity(B中)一致,否则就不能正常返回。而第一个MainActivity通过重写onActivityResult()来取得相应的返回值。
4. onSaveInstanceState
onsaveInsanceState方法是用来保存Activity的状态的。当一个Activity在生命周期结束前,会调用该方法保存状态。这个方法有一个参数名称与onCreate方法参数名称相同。
在实际应用中,当一个Activity结束前,如果需要保存状态,就在onsaveInsanceState中,将状态数据以key-value的形式放入到saveInsanceState中。这样,当一个Activity被创建时,就能从onCreate的参数saveInsanceState中获得状态数据。onSaveInstanceState的调用顺序是在onPause之前。
实际应用中:一个游戏在退出前,保存一下当前游戏运行的状态,当下次开启时能接着上次的继续玩下去。再比如:电子书程序,当一本小说被阅读到第199页后退出了(不管是内存不足还是用户自动关闭程序),当下次打开时,读者可能已忘记了上次已阅读到第几页了,但是,读者想接着上次的读下去。如果采用saveInstallState参数,就很容易解决上述问题。
5. onRestoreInstanceState
(1)在Activity被覆盖或退居后台之后,系统资源不足将其杀死,然后用户又回到了此Activity,此方法会被调用;(2)在用户改变屏幕方向时,重建的过程中,此方法会被调用。我们可以重写此方法,以便可以恢复一些临时数据。onRestoreInstanceState的调用顺序是在onStart之后。
6.启动模式
standard
默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。
singleTop
可以有多个实例,但是不允许多个相同Activity叠加。即,如果Activity在栈顶的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法。singleTop即表示当前Activity栈中“栈顶唯一”
singleTask
只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前栈中创建一个新的实例,若存在,则会把栈中在其之上的其它Activity destory掉并调用它的onNewIntent方法。
如果是在别的应用程序中启动它,则会新建一个栈,并在该栈中启动这个Activity,singleTask允许别的Activity与其在一个栈中共存,也就是说,如果我在这个singleTask的实例中再打开新的Activity,这个新的Activity还是会在singleTask的实例的栈中。singleTask表示当前Activity栈中“实例唯一”
singleInstance
只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。
其中横竖屏切换时候Activity的生命周期可以参考http://blog.csdn.net/jdsjlzx/article/details/6598135