Activity可以用来表示一个界面,活动开始代表Activity组件启动,活动结束代表Activity生命周期结束。一个android应用必须通过Activity来运行和启动。Activity的生命周期交给系统统一管理。
(一)三个基本状态:
Resumed 一个新的Activity启动入栈后,处于屏幕的最前端,栈的最顶端,处于可以与用户交互的激活状态。
Paused 当Activity被另一个透明或者dialog样式的Activity覆盖的状态。此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以依然可见,但是已经失去了焦点,故不可与用户交互
Stoped 当Activity被另外一个Activity覆盖,失去焦点且不可见时处于Stoped状态
(二)Activity七大生命周期方法
onCreate(Bundle savedInstanceState):
Activity创建时第一个调用的方法,通常我们在该方法中加载布局文件,初始化UI组件,事件注册等等
onStart() :
在OnCreate方法之后调用,用于显示界面,但用户还不能进行交互
onResume() :
在onStart方法后调用,该方法执行完成后,用户可以进行交互,当前Activity进入Resume状态
当一个paused状态的activity被重新返回时,会再次调用该方法,让Activity进入运行状态
onPause() :
当其他Activity(透明或窗口模式)进入时,该方法会被调用,让当前Activity进入Paused状态
当前Activity还可见,但不可交互。
如果其他更高优先级的APP需要内存时,当前Activity可能会被销毁。
当前Activity被返回时,会调用OnResume方法
onStop() :
当其他Activity完全覆盖该Activity时,会被调用,当前Activity进入Stopped状态
不可见,如果其他更高优先级的APP需要内存时,当前Activity可能会被销毁。
当前Activity被返回时,会调用OnRestart方法
onDestroy() :
当前Activity被销毁时调用,通常在该方法中用来释放资源,当前Activity被销毁
onRestart() :
当一个stopped状态的Activity被返回时调用,之后调用onRestart方法进入运行状态
(三)Activity传递数据的两种方式
在android中,不同的Activity实例可能运行在一个进程中,也可能运行在不同的进程中,因此我们需要一个特别的机制帮助我们在Activity之间传递数据。Android中通过Intent对象来表示一条消息,一个Intent对象布局包含有这个消息的目的地,还可以包含消息的内容。
可通过Activity.startActivity(intent)启动另一个Activity的时候,我们再Intent类的构造器中指定了“收件人地址”
直接通过Bundle对象来传递
//创建一个意图 参数:上下文,要跳转的组件的字节码
Intent intent = new Intent(this,MainActivityB.class);
String info = editText.getText().toString();
//封装要传递的对象
Bundle data = new Bundle();
data.putString("info",info);
intent.putExtras(data);
//intent.putExtra("info",info);
startActivity(intent);
通过Intent定义的Bundle对象来传递
(四)Activity处理返回结果
Activity提供了一个机制,跳转到其他activity时,再返回,可以接受到其他activity的返回值,无需start新的当前activity
A:
public void selectClick(View v){
Intent intent = new Intent(this,PhoneNumberListActivity.class);
//intent,请求编码
startActivityForResult(intent,REQUESTCODE_1);
}
//重写方法处理返回的结果
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
System.out.println("requestCode:"+requestCode+" REQUESTCODE_1:"+REQUESTCODE_1+" RESULT_OK:"+RESULT_OK);
if(requestCode==REQUESTCODE_1 && resultCode==RESULT_OK){
String number = data.getStringExtra("number");
editText_number.setText(number);
}
}
B:
listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String number = numbers[position];
Intent intent = new Intent();
intent.putExtra("number",number);
setResult(RESULT_OK,intent);//设置返回结果
finish();//结束当前界面
}
});
(五)Activity运行时屏幕方向与显示方式
1)android:screenOrientation=""
landscape横屏
portrait竖屏
2)代码控制:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
全屏运行:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);
(六)SharedPreferences保存数据
//还原数据
@Override
protected void onResume() {
super.onResume();
editText_msg.setText(sp.getString("msg",""));
}
//我们在该事件方法里存储数据
@Override
protected void onPause() {
super.onPause();
String msg = editText_msg.getText().toString();
if(TextUtils.isEmpty(msg)){
return;
}
SharedPreferences.Editor editor = sp.edit();
editor.putString("msg",msg);
editor.commit();//提交
}