这是我参与「第四届青训营 」笔记创作活动的第2天。
根据青训营提供的课程及资料,对相关知识点进行了整理,当然也查阅了其他相关资料。
一、知识点
-
界面组件
-
Activity
- 程序界面入口
- 页面容器
- 前台交互
-
Fragment
- 设计之初是为了设备适配,解决碎片化
- 轻量级的页面容器
-
-
服务组件 Service
-
广播组件 Broadcast
-
数据组件 ContentProvider
-
通信组件
- Handler 线程通信
- Binder 进程通信
二、知识点详细介绍
1 Activity
1.1 Activity是什么
Activity是一个用户界面的容器,主要用于和用户进行交互。一个应用程序中可以包含多个Activity,下面就是一个Activity的页面截图,页面布局中只有一个TextView组件,该组件的文字内容是“Hello,World!”。
1.2 Activity基本用法
首先,你需要创建一个Activity文件并在AndroidMainfest.xml文件中进行注册声明,然后,创建该Acticity的布局文件,最后,在该活动的文件中使用布局文件与Activity进行绑定,这几个操作完毕后运行起来就能看到基本的页面了。
注册-->布局-->绑定
1.2.1 注册Activity
在AndroidMainfest.xml文件中进行Activity的注册,Activity的注册声明需要放在标签内,通过标签对Activity进行注册。如果要将该Activity配置为主Activity还需要在标签内加入,并且在该标签内添加和这两句声明,示例如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.edu.jssvc.wangyu.helloworldwy">
<application
...>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
1.2.2 将布局文件与Activity进行绑定
这是在MainActivity中将该活动与布局文件activity_main.xml绑定的示例,调用的方法是setContentView()
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
1.2.3 Activity的启动方法
Activity的启动方法分为显式启动和隐式启动两种。
SecondActivity在AndroidMainfest.xml中的注册声明如下:
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.example.activitytest.MY_CATEGORY" />
</intent-filter>
</activity>
显式启动示例如下:
//新建显式意图
Intent intent= new Intent(FirstActivity.this,SecondActivity.class);
//发送意图,启动Activity
startActivity(intent);
隐式启动需要和同时匹配才能相应,示例如下:
//新建隐式意图
Intent intent= new Intent("com.example.activitytest.ACTION_START");
intent.addCategory("com.example.activitytest.MY_CATEGORY");
//发送意图,启动Activity
startActivity(intent);
1.2.4 向下一个Activity传递数据
在上述的介绍中,可以使用startActivity()方法启动下一个Activity,如果想要向下一个Activity传递数据,可以调用Intent对象中的putExtra()方法,向下一个Activity传递数据的示例如下:
//新建显式意图
Intent intent= new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("extra_data","Hello,SecondActivity");
//发送意图,
startActivity(intent);
在SecondActivity中,通过调用Intent对象中的getStringExtra()方法获取传递过来的String类型的数据,当然也可以传递其他类型的数据,SeconiActivity中的获取FirstActivity传递过来数据的代码如下:
//取得启动当前Activity的Intent对象
Intent intent = getIntent();
//从Intent实例中取得Extra字段
String data = intent.getStringExtra("extra_data");
1.2.5 启动带返回值的Activity
-
启动带返回值的Activity方法
前面的示例中启动下一个Activity调用的方法都是startActivity(),如果你想要启动一个带返回值的Activity就需要调用startActivityForResult()方法,示例如下:
//新建显式意图 Intent intent= new Intent(FirstActivity.this,SecondActivity.class); //参数除Intent对象,还需要一个标记意图对象的请求码,必须是整数 startActivityForResult(intent,1); -
被启动Activity设置返回值的方法
//创建空意图 Intent intent = new Intent(); //为意图添加一个自定义的Category,category参数允许有多个,且系统会提供一个默认的 intent.putExtra("extra_return","Hello,FirstActivity"); //参数除Intent对象,还需要一个标记意图对象的请求码,必须是整数 setResult(RESULT_OK,intent); -
处理返回值的回调方法
/** * 接受被startActivityForResult()方法启动的Activity用setResult()返回数据 * @param requestCode int类型数据,表示针对哪个意图对象返回的数据 * @param resultCode int常量,表示返回的意图是否有效 * @param data Inten类型,通常携带返回数据 */ @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { switch (requestCode){ case 1: if (resultCode == RESULT_OK){ String returnedData = data.getStringExtra("extra_return"); } } }ps:
1.3 Activity的生命周期
1.3.1 Activity的4种生命周期状态
- Active 运行状态
- Pause 暂停状态
- Stop 停止状态
- Killed 消亡状态
1.3.2 Activity生命周期的回调方法
-
正常生命周期
- onCreate():创建时回调,一般在此处创建视图和绑定数据
- onStart():已启动,即将进入前台
- onResume():与用户开始交互,位于Activity栈顶
- onPause():Activity失去焦点或已暂停,Activity界面部分可见,下一个生命周期时onResume()或onStop()
- onStop():Activity不再可见,下一个回调是onRestart()或onDestory()
- onRestart():重启已停止的Activity,下一个回调是OnStart()
- onDestory():销毁Activity,释放该Activity的所有资源
-
异常生命周期
在异常生命周期中会额外执行两个方法:
- onSaveInstanceState():在非正常关闭时回调,用于保存数据,不支持持久化数据
- onRestoreInstanceState():用于恢复数据
异常生命周期出现情况:
- 资源相关的系统配置改变(最常见的就是旋转屏幕)
- 内存不足时候,会杀死优先级低的Activity
1.3.3 Activity生命周期小结
-
启动退出场景
- 启动 onCreate()→onStart()→onResume()
- 退出 onPause()→onStop()→onDestory()
-
部分遮挡
- 遮挡 onPause()
- 恢复 onResume()
-
完全遮挡
- 遮挡 onPause()→onSaveInstanceState()→onStop()
- 恢复 onStart()→onResume()
-
配置变更
-
未配置
- 销毁 onSaveInstanceState()→onPause()→onStop()→onDestory()
- 重建 onCreate()→onStart()→onRestoreInstanceState()→onResume()
-
已配置 onConfigurstionChanged()
-
-
后台回收
- 销毁 不会有时机处理
- 重建 onCreate()→onStart()→onRestoreInstanceState()→onResume()
1.4 Activity启动模式
- standard:默认启动模式,允许重复
- singleTop:栈顶复用,不允许Activity连续重复
- singleTask:栈内复用,不允许栈内Activity重复
- singleInstance:全局复用,系统全局不允许Activity重复