Android 四大组件之 Activity
Activity 的启动
1. startActivity()
Intent intent = new Intent(this, SignInActivity.class);
startActivity(intent);
2. startActivityForResult()
private void pickContact() {
startActivityForResult(intent, 5555); // 第二个参数给出请求码,随便定义,标识而已
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK && requestCode == 5555) {
// 重写 onActivityResult 来接收 Activity 结束的消息
}
}
结束 Activity
- finish()
- finishActivity()
这些方法可以立即结束 Activity,当然 Android 也有自己的 Activity 管理器,没啥事的话也可以不处理。
Activity 状态
-
Resumed(running状态
当一个活动位于返回栈的栈顶时, 这时活动就处于运行状态。系统几乎一定不会回收这个状态的 Activity
-
暂停状态
当一个活动不再处于栈顶位置, 但仍然可见时, 这时活动就进入了暂停状态。比如弹窗覆盖了部分窗口,处于暂停状态的活动仍然是完全存活着的。只有在极低内存的情况下才有可能被回收。
-
停止状态
当一个活动不再处于栈顶位置, 并且完全不可见的时候, 就进入了停止状态。 系统仍然会为这种活动保存相应的状态和成员变量, 但是这并不是完全可靠的, 当其他地方需要内存时,处于停止状态的活动有可能会被系统回收。
Activity 的生命周期回调方法
-
onCreate()
在活动第一次被创建的时候调用。 应该在这个方法中完成活动的初始化操作, 比如说加载布局、绑定事件等。
-
onStart()
这个方法在活动由不可见变为可见的时候调用。
-
onResume()
这个方法在活动准备好和用户进行交互的时候调用。 此时的活动一定位于返回栈的栈顶,并且处于运行状态。
-
onPause()
这个方法在系统准备去启动或者恢复另一个活动的时候调用。 我们通常会在这个方法中将一些消耗 CPU 的资源释放掉,以及保存一些关键数据,但这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用。
-
onStop()
这个方法在活动完全不可见的时候调用。它和 onPause()方法的主要区别在于,如果启动的新活动是一个对话框式的活动,那么 onPause()方法会得到执行,而 onStop()方法并不会执行。
-
onDestroy()
这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态。
-
onRestart()
这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。
public class MyActivity extends Activity {
//Activity 创建时被调用
protected void onCreate(Bundle savedInstanceState);
//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();
}
Activity 运行时屏幕方向与显示方式
两种方法
1. 清单文件
<activity android:name=".Example"
android:label="@string/app_name"
android:screenOrientation="portrait">// 竖屏 , 值为 landscape 时为横屏
…………
</activity>
2. 代码实现
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
全屏
// 设置全屏模式
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
// 去除标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE);
以窗口形式显示 Activity
<activity
android:name="MyActivity"
android:theme="@android:style/Theme.Dialog">
</activity>
保存 Activity 状态
当一个活动进入到了停止状态,是有可能被系统回收的。
Activity 中提供了一个 onSaveInstanceState()回调方法,这个方法会保证一定在活动被回收之前调用.
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("key", "value");
}
在 onCreate() 或者 onRestoreInstanceState() 中恢复
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
if(savedInstanceState != null){
String value = savedInstanceState.getString("key");
}
}
Activity 的启动模式
启动模式一共有四种,分别是 standard、 singleTop、singleTask 和 singleInstance , 可以在 AndroidManifest.xml 中通过给标签指定android:launchMode 属性来选择启动模式。
-
standard
standard 是活动默认的启动模式,在不进行显式指定的情况下,所有活动都会自动使用这种启动模式。 系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例。
-
singleTop
当活动的启动模式指定为 singleTop, 在启动活动时如果发现返回栈的栈顶已经是该活动, 则认为可以直接使用它,不会再创建新的活动实例。不过当 FirstActivity 并未处于栈顶位置时, 这时再启动 FirstActivity, 还是会创建新的实例的。
-
singleTask
当活动的启动模式指定为 singleTask,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例
-
singleInstance
不同于以上三种启动模式, 指定为 singleInstance 模式的活动会启用一个新的返回栈来管理这个活动(其实如果 singleTask 模式指定了不同的 taskAffinity, 也会启动一个新的返回栈)。而且这个栈中只有 SecondActivity 这一个活动。
Activity 的最佳实践(《Android 第一行代码》)
1. 知晓当前是在哪一个活动
写一个 BaseActivity 并由其他 Activity 继承,那么在运行的时候就会打印当前运行的 Activity 名字。
public class BaseActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("BaseActivity", getClass().getSimpleName());
}
}
2. 随时随地退出程序
需要用一个专门的集合类对所有的活动进行管理
public class ActivityManager {
public static List<Activity> activities = new ArrayList<Activity>();
public static void addActivity(Activity activity) {
activities.add(activity);
}
public static void removeActivity(Activity activity) {
activities.remove(activity);
}
public static void finishAll() {
for (Activity activity : activities) {
if (!activity.isFinishing()) {
activity.finish();
}
}
}
}
修改 BaseActivity
public class BaseActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("BaseActivity", getClass().getSimpleName());
ActivityManager.addActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityManager.removeActivity(this);
}
}
在程序需要退出的地方调用ActivityManager.finishAll()
即可。
3. Activity 的最佳写法
为每个类编写启动方法,就能直观的知道传递参数了。
public class SecondActivity extends BaseActivity {
public static void actionStart(Context context, String data1, String data2) {
Intent intent = new Intent(context, SecondActivity.class);
intent.putExtra("param1", data1);
intent.putExtra("param2", data2);
context.startActivity(intent);
}
}
FirstActivity 中调用SecondActivity.actionStart(FirstActivity.this, "data1", "data2");
更多相关文章
- Android上SD卡图片的标准缓存方法
- Android Glide 升级4.8 后, 原方法error/preload/fallback 无法使
- android朋友圈监听键盘状态 点击空白区域隐藏键盘
- Android再按一次退出程序实现方法
- android 登录前检查网络状态
- Android 监听手机GPS打开状态实现代码
- Android getWindow().setFlags方法
- android之检查service运行状态函数
- Android是否可以实现静默安装模式