1 一张图解读Activity
这里用一张图解读 生命周期 & 基本概念 & 关键回调方法解读
2 activity类关系解读
关于Activity类的父类、子类的继承关系图如下所示:
3 activity加载模式解读
@1 为什么activity要 指定加载模式?
因为android 使用task(栈结构)来管理activity,当启动一个应用时,android会为之创建一个task(可以理解为activity栈),然后启动这个应用的入口activity。但android 没有为task提供给API,因此开发人员无法直接访问task,只能获取对应task的ID。
@2 activity的四种加载模式解读如下:
- standard:android总会为activity创建一个新实例并添加到当前task栈中(不创建新task)
- singleTop:同上,不同在于当activity在栈顶时不会创建新实例,而是复用已有实例。
- singleTask:activity在同一个Task栈中只有一个实例(注意:如果要启动的activity实例没有位于task的栈顶但在task栈中,那么会把activity实例之前的所有实例全部移除)。
- singleInstance:无论从哪个task中启动activity实例,只会创建一个目标activity。如果activty是新创建的,则系统创建一个全新的task并将activity实例放入其栈顶(一个activity对应一个task);如果activity存在,则无论在哪个task中,系统都会将task转到前台并将activity显示出来。
4 配置activity
android APP中每一个Activity都必须要在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity。activity内容如下:
<activity android:name=".MainActivity"
android:label=@string/title
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
常见属性一般有name、icon、label、exported(是否允许被其他应用调用),launchmode(上面1.3中提到的4种加载模式)。intent和intent-filter与通过intent启动activity的方式有关。
5 activity启动/关闭方式
5.1 activity启动
android 启动方式共分为两类,一种是显式跳转,另一种是隐式跳转。
@1 显式跳转:Intent内部以不同方式直接声明要启动的activity所对应的class
//第1种 指定类来跳转,直接设置
Intent intent=new Intent(this,XXXactivity.class);
startActivity(intent);
//第2种 指定类来跳转,通过setClass方式
Intent intent=new Intent();
intent.setClass(this,XXXactivity.class);
startAcitivity(intent);
//第3种 补全跳转到的那个activity包名
Intent intent=new Intent();
intent.setClassName(this,"com.ags.android.XXXactivity");
startAcitivity(intent);
//第4种 setComponent方式
Intent intent=new Intent();
intent.setComponent(new Component(this,"com.ags.android.XXXactivity"));
startAcitivity(intent);
@2 隐式启动:在Androidmanifest.xml文件中设置action策略,如下所示:
<activity android:name="com.ags.android.XXXActivity"
android:label = @string/title>
<intent-filter>
<action android:name="com.ags.android.XXXActivity/>
<category android:name="android.intent.category.DEFAULT"/>
<intent-filter/>
</activity>
添加关键代码,如下所示:
Intent intent = new Intent();
intent.setAction("com.ags.android.XXXActivity");
startActivity(intent);
@3 startActivityForResult的显式跳转(可回传参数)
这里标注关键代码,如下所示:
//MainActivity中启动FirstActivity
Intent intent = new Intent(MainActivity.this,com.ags.myapplication.FirstActivity.class);
startActivityForResult(intent,1);
//MainActivity的onActivityResult回调方法
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1 && resultCode == 0) {
String position = data.getStringExtra("address");
Log.d(TAG, "onActivityResult:addr"+position);
}
}
//FirstActivity中关键内容(包含回传信息)
Intent intent = new Intent();
intent.putExtra("address", "value_effect");
setResult(0, intent);
FirstActivity.this.finish();
5.2 activity关闭
关闭activity是使用以下2种方法:
- finish方法:结束当前activity。
- finishActivity(int requestCode)方法:结束以startActivityForResult方式启动的activity。
6 Activity 数据交换
在android系统中Bundle类主要用于传递数据,保存的数据是以key-value(键值对)的形式存在。读写方式如下所示:
//通过intent启动activity发送数据,写
Intent intent = new Intent().setClassName("com.ags.XXXactivity");
Bundle bundle = new Bundle();
bundle.putString("name", "ags");
bundle.putInt("width", 175);
intent.putExtras(bundle);
startActivity(intent);
//被启动后的XXXactivity接收数据,读
Bundle bundle = this.getIntent().getExtras();
String name = bundle.getString("name");
int height = bundle.getInt("height");
更多Bundle相关API可以查看文档:Android应用开发之Bundle类
7 Fragment简要说明
@1 为什么要用Fragment?
Android系统可以运行在各种各样的设备中,比如手机、平板、电视。同样的界面在手机上显示可能很好看,在大屏幕的平板上就不行了,手机的界面放在平板上可能会有过分被拉长、控件间距过大等情况也很让人头疼。而Fragment的出现能做到让一个App可以同时适应手机和平板。
@2 Fragment是什么?
Fragment代表了activity的子模块,可以理解成activity的片段。Fragment有自己的生命周期,也可以接收输入事件。Fragment是依赖于Activity的,不能独立存在的。
@3 Fragment的特点:
-
模块化:不必把所有代码全部写在Activity中,而是写在各自的Fragment中。
-
可复用:多个Activity可以复用同一个Fragment。
-
可适配:根据屏幕尺寸、方向,能够快速方便地实现不同的布局,提升用户体验。
@4 使用Fragment
关于Fragment的文档:Android组件之Fragment组件全解-官方文档(可设置中文模式)
8 官方文档索引
更多activity相关内容可以查看官方文档: Android组件之activity组件(可设置中文模式)
总结
- 了解activity基本概念、生命周期、加载模式、AndroidManifest配置、了解fragment组件。
- 熟练编写相关代码:Activity启动和关闭、Activity数据传递 以及fragment组件相关练习。