您的位置:首页 > 移动开发 > Android开发

Android笔记——Activity生命周期与数据传递

2016-03-21 12:26 399 查看
1.概述

四大组件之一,用于表示界面,与用户交互

涉及到的概念:Application、 Activity、 Activity栈 、Task

2.状态与生命周期

2.1 三个基本状态:

1)resumed 一个新activity启动入栈,它在屏幕最前端,处于栈的最顶端,此时它处于与用户交互的激活状态

2)paused 当Activity被另一个透明或者Dialog样式的Activity覆盖时的状态,此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它依然可见,但它已经失去了焦点故不可与用户交互

3)stoped 当Activity被另一个Activity覆盖,失去焦点并不可见时即处于stoped状态

2.2 生命周期



//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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: