Activity
概述
Activity即活动,是一种用于与用户交互的组件,表示一个界面。
下面是Android developer上对其的描述
Activity 表示具有用户界面的单一屏幕。例如,电子邮件应用可能具有一个显示新电子邮件列表的 Activity、一个用于撰写电子邮件的 Activity 以及一个用于阅读电子邮件的 Activity。 尽管这些 Activity 通过协作在电子邮件应用中形成了一种紧密结合的用户体验,但每一个 Activity 都独立于其他 Activity 而存在。 因此,其他应用可以启动其中任何一个 Activity(如果电子邮件应用允许)。 例如,相机应用可以启动电子邮件应用内用于撰写新电子邮件的 Activity,以便用户共享图片。
生命周期
活动开始,代表Activity组件启动。活动结束,代表一个Activity生命周期结束。并且这个生命周期由系统进行统一管理。
下面是一张网图:
出处:http://www.runoob.com/w3cnote/android-tutorial-activity.html
实现生命周期回调
七大方法,分别在创建、可见、重新可见,获得焦点、失去焦点、完全不可见、摧毁时调用。
public class ExampleActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// The activity is being created.
}
@Override
protected void onStart() {
super.onStart();
// The activity is about to become visible.
}
@Override
protected void onResume() {
super.onResume();
// The activity has become visible (it is now "resumed").
}
@Override
protected void onPause() {
super.onPause();
// Another activity is taking focus (this activity is about to be "paused").
}
@Override
protected void onStop() {
super.onStop();
// The activity is no longer visible (it is now "stopped")
}
@Override
protected void onDestroy() {
super.onDestroy();
// The activity is about to be destroyed.
}
}
- 创建
- 显示(无法交互)
- 继续(可以交互)
- 开始运行(意味着进入第一个状态Resume)
- 其他Activity显示在前面
- 暂停
- 长时间不显示
- 停止
- Activity完成或被系统销毁
- 结束
状态
Activity有三个基本状态
- Resumed Activity启动入栈后,在屏幕的最前端(栈顶),此时活动可见并可与用户进行交互。
- Paused 当Activity被另一个透明或Dialog样式的Activity覆盖时,此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它仍然可见,但它已经失去了焦点故不可与用户交互。
- Stoped 当Activity被另一个Activity覆盖、失去焦点并不可见处于Stop状态。
下面是Android developer上对这部分的描述
Activity 基本上以三种状态存在:
继续
此 Activity 位于屏幕前台并具有用户焦点。(有时也将此状态称作“运行中”。)
暂停
另一个 Activity 位于屏幕前台并具有用户焦点,但此 Activity 仍可见。也就是说,另一个 Activity 显示在此 Activity 上方,并且该 Activity 部分透明或未覆盖整个屏幕。 暂停的 Activity 处于完全活动状态( Activity 对象保留在内存中,它保留了所有状态和成员信息,并与窗口管理器保持连接),但在内存极度不足的情况下,可能会被系统终止。
停止
该 Activity 被另一个 Activity 完全遮盖(该 Activity 目前位于“后台”)。 已停止的 Activity 同样仍处于活动状态(Activity对象保留在内存中,它保留了所有状态和成员信息,但未与窗口管理器连接)。 不过,它对用户不再可见,在他处需要内存时可能会被系统终止。
如果 Activity 处于暂停或停止状态,系统可通过要求其结束(调用其 finish() 方法)或直接终止其进程,将其从内存中删除。(将其结束或终止后)再次打开 Activity 时,必须重建。
Shared Preferences保存数据
在某些场合,我们的Activity可能会被更高优先级的Activity意外终止,如打进来一个电话,而你正在码字,这时候Activity的切换势必导致当前数据的丢失。
在《详解安卓屏幕显示及方向的控制》https://blog.csdn.net/nishigesb123/article/details/88934750
这篇文章中实际上提到了一种安卓状态保存的方法——onSaveInstanceState
加上Shared Preferences,就算安卓的两种状态保存的方法了。
实际上onSaveInstanceState有一定的局限性:
- 之前提到过onSaveInstanceState的被调用的时机——即被意外回收的时候。
- 这意味着一旦回收并非意外,onSaveInstanceState并不会被调用。
- 举个栗子——比如用户主动按下back键导致的Activity终结。
这时候我们Shared Preferences的作用就体现出来了,它可以提供一种永久的数据存储解决方案,而非临时的。你可以在任何场景使用它,代价是生成对应的xml文件,占用一定的空间资源。
- Shared Preferences使用XML格式为Android应用提供一种永久的数据存储方式。
- 它存储在文件系统的目录下,可以被处在同一应用中的所有Activity访问。
- Android提供了相关的API来处理这些数据而不需要程序员直接操作这些文件或者考虑数据同步问题。
切出屏幕
打开自动生成的xml所在目录,打开xml文件,我们可以看到,我们输入的内容确实被保存下来了。
测试代码:
package com.example.a4_1sharedpreferences;
import android.content.Context;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
private SharedPreferences sp;
private EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = findViewById(R.id.EditText);
//获取SharedPreferences对象
//参数1为生成的xml文件名(后缀由系统自动生成)
// 参数2为文件的操作模式(在下面列出了四种模式的简介)
sp=getSharedPreferences("msg", Context.MODE_PRIVATE);
}
//还原数据
@Override
protected void onResume() {
super.onResume();
editText.setText(sp.getString("msg",""));
SharedPreferences.Editor editor=sp.edit();
//全部内容清空
// editor.clear();
editor.remove("msg");//指定内容清空
editor.commit();
}
//存储数据
@Override
protected void onPause() {
super.onPause();
String msg=editText.getText().toString();
if (TextUtils.isEmpty(msg)){
return;
}
SharedPreferences.Editor editor=sp.edit();
editor.putString("msg",msg);
editor.commit();
}
}
附:关于 getSharedPreferences(name,mode) 的mode参数
- Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND
- Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
- Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。
- MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;
- MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。