1.概述
四大组件之一,用于表示界面,与用户交互
涉及到的概念:Application、 Activity、 Activity栈 、Task
2.状态与生命周期
2.1 三个基本状态:
1)resumed 一个新activity启动入栈,它在屏幕最前端,处于栈的最顶端,此时它处于与用户交互的激活状态
2)paused 当Activity被另一个透明或者Dialog样式的Activity覆盖时的状态,此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它依然可见,但它已经失去了焦点故不可与用户交互
3)stoped 当Activity被另一个Activity覆盖,失去焦点并不可见时即处于stoped状态
//Activity创建时调用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
//Activity可见时调用
@Override
protected void onStart() {
super.onStart();
}
//Activity重新可见时调用
@Override
protected void onRestart() {
super.onRestart();
}
//Activity获得焦点时调用
@Override
protected void onResume() {
super.onResume();
}
//Activity失去焦点但仍然可见时调用(在其他应用需要内存时,可能会被kill)
@Override
protected void onPause() {
super.onPause();
}
//Activity 完全不可见时调用(会被系统kill)
@Override
protected void onStop() {
super.onStop();
}
//Activity被销毁时调用(会被系统kill)
@Override
protected void onDestroy() {
super.onDestroy();
3.状态数据暂存
3.1 onPause()
当系统要启动另一个activity时调用(其他的activity显示之前),这个方法通常被用来提交那些持久数据的改变、停止动画、和其他占用CPU资源的东西。由于下一个activity在这个方法返回之前不会resumed,所以实现这个方法时代码执行要尽可能快,不然可能会出现ANR。
3.2 onSaveInstanceState()
它会将一个Bundle对象传递给该方法。当activity再次启动时,这个Bundle会传递给onCreate()方法和随着onStart()方法调用的onRestoreInstanceState(), 所以它们两个都可以恢复捕获的状态。(意思是onRestoreInstanceState只有在Activity被系统回收后再重新生成时才会被调用)
onSaveInstanceState的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用,
eg:
用户按下HOME键时。
长按HOME键,选择运行其他的程序时。
按下电源按键(关闭屏幕显示)时。
从activity A中启动一个新的activity B时。
屏幕方向切换时,例如从竖屏切换到横屏时。
// Activity即将移出栈顶保留UI状态时调用此方法
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.d("***", "onSaveInstanceState");
}
// onCreate完成后被调用,用来恢复UI状态
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.d("***", "onRestoreInstanceState");
}
4.数据传递
不同Activity之间的数据传递,一般使用intent作为“信使”,一个intent对象一般由两部分构成,一是“目的地”,二是消息内容,“目的地”时必须的,内容是可选的。
发送方:
//创建信使(已加入“地址”)
Intent intent=new Intent(CurrentActivity.this,OtherActivity.class);
//创建消息内容
Bundle bundle=new Bundle();
bundle.putBoolean("Booleankey",true);
bundle.putString("Stringkey","value");
bundle.putSerializable("person", new Person());
intent.putExtra("key",bundle);
/** //也可以不用Bundle这个中介,直接把信息写在intent中 intent.putExtra("Booleankey",true); intent.putExtra("Stringkey", "value"); intent.putExtra("person", new Person()); **/
//跳转至目的地Activity
startActivity(intent);
接收方
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_other);
Intent intent=getIntent();
Bundle bundle=intent.getBundleExtra("key");
String Stringkey=bundle.getString("Stringkey");
Boolean Booleankey=bundle.getBoolean("Booleankey");
Person person=bundle.getSerializable("person");
/** //如果信息直接搭载在Intent上 String Stringkey=intent.getStringExtra("Stringkey"); Boolean Booleankey=intent.getBooleanExtra("Booleankey", true); Person person=intent.getSerializableExtra("person"); **/
}
5.结果返回处理
Activity提供了一种机制,跳转到其他Activity再返回时,可以接收其他Activity返回的值,而无需再start新的当前Activity,eg:
创建两个Activity,在MainActivity中输入数据后单击“下一步”按钮,启动OtherActivity,在OtherActivity收集到数据后,点击“上一步”,回到MainActivity,并传回OtherActivity的数据,覆盖MainActivity的原数据
MainActivity
//跳转页面
Intent intent=new Intent(MainActivity.this,OtherActivity.class);
//后一个参数为requestCode,用于处理返回结果时判断是从哪个界面返回的
StartActivityForResult(intent,0);
//处理返回结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==0&&resultCode==RESULT_OK){
//处理从Intent data接收的数据
}
}
OtherActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_other);
//准备要回传的数据
Intent resultIntent=getIntent();
resultIntent.putExtra("Stringkey", "value");
setResult(RESULT_OK,resultIntent);
//结束当前Activity
this.finish();
}