目录
6. ActiviActivityty运行时屏幕方向与显示方式
七大方法四大状态
1. Activity简介
Activity 属于应用程序级组件,唯一能够显示界面的组件。
Activity 可意为活动,一个界面就是一个Activity,它具有一个完整的生命周期。Android应用必须通过Activity 来运行和启动,Activity的生命周期交给系统统一管理。
四个基本概念:Application、Activity、Activity栈、Task
2. Activity状态
Activity四大基本状态
Activity生命周期一般分为四个基本状态,分别是活动状态(running),暂停状态(paused),停止状态(stopped)和死亡状态。
1.活动状态(running)
活动状态一般是指该Activity正处于屏幕最显著的位置上显示,即该Activity是在Android活动栈的最顶端。
一般地当Activity 创建后就是处于该状态中。
期间触发的函数及顺序为: onCreate() ->onStart() -> onResume()。
其中:
onCreate()只有在该Activity是第一次被创建时才会被调用,主要是负责Activity的一般性的初始化设置,包括视图的创建,数据的绑定等等。需要注意的是若之前有冻结的state(即系统对该Activity调用过onSaveInstanceState()函数),则可以通过其 Bundle 参数进行state恢复。
onStart()是当Activity正在变为可见状态时才会被调用。一般地在此期间可以注册一个广播等等。
onResume()是在该Activity将要和用户进行交互时被调用,此时Activity位于的活动栈顶部。
2.暂停状态(paused)
暂停状态一般指该Activity已失去了焦点但仍然是可见的状态(包括部分可见)。一个处于暂停状态的Activity只有在系统极度缺乏内存资源的情况下才会被系统强制结束。
运行状态到暂停状态所触发的函数及顺序为:onResume() -> onPuased()。
暂停状态恢复至运行状态所触发的函数及顺序为:onPuased() -> onResume()。
其中:
onPuased()是当一个Activity失去系统焦点后将会被调用,包括见面被部分遮挡,以及设备转入休眠状态等等。一般地在此期间对一些未保存的数据进行持久化并停止其他需要耗费CPU的操作,同时不可进行耗时操作,否则会阻塞系统UI线程。
3.停止状态(stopped)
停止状态一般指该Activity被另一个Activity完全覆盖的状态,这是它仍然保持所有的状态,但是由于该Activity变得不可见,所以系统经常会由于内存不足而将该Activity强行结束。
暂停状态到停止状态所触发的函数及顺序为:onPuased() -> onStop()。
停止状态恢复至运行状态所触发的函数及顺序为:onStop() -> onRestart() -> onStart() -> onResume()。
其中:
onStop()是当一个Activity变为不可见时将会被调用,此时可能是由于该Activity要被注销或新的Activity完全遮挡了该Activity。在此期间一般可以进行取消注册广播等操作,因为用户不可见。
onRestart()是当一个Activity从停止状态恢复至运行状态时将会被优先调用。
4.死亡状态
死亡态是指该Activity被系统销毁。当一个Activity处于暂停状态或停止状态时就随处可能进入死亡状态,因为系统可能因内存不足而强行结束该Activity。
停止状态到死亡状态分为两种情况:(1)由用户操作导致,则执行:onStop() -> onDestroy()。(2)由系统自动强制执行,则该Activity被强行结束。
其中:
onDestroy()是当一个Activity正在被系统finished期间被调用的。
3. Activity生命周期
public class MyActivity extends Activity{
//Activity创建时被调用
protected void onCreate(Bundle savedlnstanceState);
//Activity可见时被调用
protected void onStart();
//Activity重新可见时被调用,接着会调用onStart()
protected void onRestart();
//Activity获得焦点,可进行输入时被调用
protected void onResume();
//Activity关去焦点,但可见时被调用(在其它应用需要内存时,可能会被kills)
protected void onPause();
//Activity完全不可见时被调用(会被系统kills)
protected void onStop();
//Activity被销毁时被调用(会被系统kills)
protected void onDestroy();
}
4. Activity传递数据
1.传递对象方法一:Bundle 携带textView信息
2.传递对象方法二:序列化(消耗性能更多),对象实现Serializable接口
3.传递对象方法三:Android官网推荐,对象实现Parcelable接口,打包的方式
5. Activity处理返回结果
示例:点击 MainActivityResult 页面中的Button 打开 PhoneNumberList 页面;点击PhoneNumberList页面的某一个PhoneNumber,返回MainActivityResult 页面,并在MainActivityResult 页面显示这个PhoneNumber 的值。
--------------------------------------------------------------------------------------
首先,设置 MainActivityResult.java 中的Button点击事件,选择可以返回结果的 startActivityForResult()方法,携带requsest值。
Intent intent = new Intent(this,PhoneNumberListActivity.class);
startActivityForResult(intent,REQUESTCODE_1);
页面成功跳转之后,设置 PhoneNumberList 页面的 item 点击事件:点击之后,携带其数据,返回result_ok状态,并关闭界面。
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
// 获取被点击的item的值
String number = numberArr[position];
// 存入传递的数据
Intent intent = new Intent();
intent.putExtra("number",number);
// 设置返回结果
setResult(RESULT_OK,intent);
// 结束当前界面
finish();
}
});
对返回的数据处理,重写onActivityResult()方法,对数据处理。但只有这一个方法可以对数据进行处理,因此在第一步进行跳转页面方法startActivityForResult()的参数二,就是request标志。当第二次点击它依旧会把之前带走的request标志带回来,依据 request 标志我们可以了解它是什么来自哪里。
根据需求进行选择匹配 请求的标志和返回的状态 ,填充其内容方法。
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
/**
* @Description: 处理返回的结果
* @Params: * @param requestCode:请求的标记
* @param resultCode:获取返回的标记
* @param data:返回的intent(意图)
*/
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == REQUESTCODE_1 && resultCode == RESULT_OK){
// 获取传递的值
String number = data.getStringExtra("number");
// 在页面上显示数据
editText_num.setText(number);
}
}
6. ActiviActivityty运行时屏幕方向与显示方式
屏幕方向
1. 固定显示方式
(在该 Activity 的配置文件中,添加屏幕方向属性)
android:screenOrientation="landscape"
2. 通过代码设置屏幕方向
(Activity 文件中)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
显示方式
1. 通过代码实现
// 设置全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
// 去标题。若是要使用去标题的话,原本的 Activity 就应该是含标题的才行。
requestWindowFeature(Window.FEATURE_NO_TITLE);
2.在清单文件可以通过设置Activity的主题
android:theme="@android:style/DeviceDefault.Light.ButtonBar"
7. Activity通过SharedPreferences保存数据
通常情况下会发生这样的问题,我们在编辑短信的同时有电话打进来,那么接电话肯定是要启动另一个Activiy,那么当前编辑短信的Activity所编辑的信息我们想暂时保存下来,等接完电话后回到该Activity时,可以继续编辑短信。该功能如何去实现呢?
SharedPreferences 使用xml格式为Android 应用提供一种 永久的数据存储方式 。对于一个Android应用,它存储在文件系统的/data/data/your_app_package_name/shared_prefs/目录下,可以被处在同一个应用中的所有Activity访问。
Android 提供了相关的APl来处理这些数据而不需要程序员直接操作这些文件或者考虑数据同步问题。
根据Activity 的生命周期,当另一个 Activity 被打开时,前一个 Activity 处于onPause状态,但当其他应用需要内存时,就会被kill掉;重新打开前一个Activity时,会调用OnResume()。因此为了保存以前的数据,将重写onPause方法进行储存信息和onResume方法进行还原数据。
@Override
protected void onPause() {
/**
* @Description: 在该方法里存储数据
*/
super.onPause();
// 获取输入的数据
String msg = editText_msg.getText().toString();
if(TextUtils.isEmpty(msg)){
// 若原本没有输入数据,则直接返回
return;
}
// 利用editor 进行存储数据
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("msg",msg);
// 提交数据
editor.commit();
}
@Override
protected void onResume() {
/**
* @Description: 在该方法里还原数据
*/
super.onResume();
// 直接从 sharedPreferences 获取数据
editText_msg.setText(sharedPreferences.getString("msg",""));
// 清除之前的数据
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.remove("msg");
editor.commit();
}