这是我参与「第四届青训营 」笔记创作活动的第1天
-
安卓基础组件
-
Activity-
基本介绍
activity是安卓四大基本组件之一,需要在程序清单
AndroidManifest中声明,然后在MainActivity中绑定
-
-
- `Activity`生命周期
- `onCreate()`:该方法在活动第一次创建的时候被调用,你应该在该方法中完成活动的初始化操作,比如加载布局、绑定事件等等。
- `onStart()`:该方法在活动由不可见变为可见的时候调用。
- `onResume()`:该方法在活动准备好和用户进行交互的时候调用,此时活动一定位于栈顶,且处于运行状态。
- `onPause()`:`Actvity`失去焦点或已暂停,`Activity`界面部分可见,下一个生命周期是`onResume(`)或`onStop()`
- `onStop()`:这个方法在活动完全不可见的时候调用,它和`onPause()`最主要的区别在于,如果启动的新活动时对话框模式(以前的活动并不是完全不可见),那么这时候以前的活动会执行`onPause()`但是不会执行`onStop()`。
- `onRestart()`:重启已停止的`Activity`,下一个回调是`onStart()`
- `onDestory()`:销毁`Actvity`,释放该Activity的所有资源
- `onSaveInstanceState()`:在非正常关闭时回调,用于保存数据,不支持持久化数据
- `onRestoreInstanceState()`/`onCreate()`:用于恢复数据
- 利用`Activity特性`解决接电话Crash问题
产生原因:页面被回收导致本地变量被置空
方法:
1、添加判空逻辑避免空指针问题
2、在页面回收生命周期中存储数据,页面重建时进行恢复`onSaveInstanceState()`中写入需要保存的数据
`onRestoreInstanceState()`进行数据恢复
- `Activity`的四种启动模式
`Standard` 默认模式,允许Activity重复
`SingleTop`栈顶复用,不允许Activity连续重复
`SingleTask`栈内复用,不允许栈内Activity重复
`SingleInstance`全局复用,系统全局不允许Activity重复
- `Fragment`
- 基本用法
- 1、创建Fragment布局文件
```
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
```
2、将 Fragment 添加到 Activity
```
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_container);
fragmentManager = getSupportFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
if(findViewById(R.id.fl_Container1) != null){ //确认有一个Fragment容器
if(savedInstanceState != null){ //如果activity是resumed,再生成一个Fragment会覆盖原来的Fragment
return;
}
fragment_1 = new Fragment_1();
//实例化一个自定义Fragment类的对象,并将此对象添加到容器Activity中
fragmentTransaction.add(R.id.fl_Container1,fragment_1).commitAllowingStateLoss();
//调用commit方法后才会生效,commitAllowingStateLoss宽容显示,允许一些横竖屏幕切换等情况下会出现的错误。
}
}
```
3、Activity 与 Fragment,Fragment 与 Fragment 的通信
3.1、Activity向Fragment通信 ① 拿到Fragment的引用,直接调用其public方法。
② 如果Activity中未保存任何Fragment的引用,每个Fragment都有一个唯一的TAG或者ID, 可以通过下面两种方式获得其引用
```
● getFragmentManager( ).findFragmentByTag(String tag)
● getFragmentManager( ).findFragmentById(int id)
```
③ 在Activity里使用 `fragment.setArguments(bundle)` 方法,通过Bundle传递数据,在Fragment里使用`Bundle bundle = getArguments()`获取数据。
3.2、Fragment向Activity通信 ① 在Fragment中可以通过 `getActivity()` 得到当前绑定的Activity的实例,然后进行操作。
② 在Fragment中定义接口,在Activity中进行接口回调。
3.3 Fragment与Fragment
假设有F1 和 F2
① F1通过当前绑定的Activity拿到 F2的引用。
② 在F1中定义接口,在Activity中进行接口回调,由Activity操作F2。
③ 通过广播。
- 生命周期
方法:
```
onAttach方法:顾名思义,是Fragment和Activity建立关联的时候调用。
onCreateView方法:为Fragment加载布局时调用。
onActivityCreated方法:当Activity中的onCreate方法执行完后调用。
onDestroyView方法:Fragment中的布局被移除时调用。
onDetach方法:顾名思义,是Fragment和Activity解除关联的时候调用。
```
验证:
- `Service`
- 基本用法
1 注册:`AndroidManifest`中使用`<servrce.../>`标签
2创建:建立相应的`Service`实现类
3加载:`startService()/bindService()`
- 生命周期
方法:
```
onStartCommand() 当另一个组件(如 Activity)通过调用 startService() 请求启动服务时,系统将调用此方法。一旦执行此方法,服务即会启动并可在后台无限期运行。 如果自己实现此方法,则需要在服务工作完成后,通过调用 stopSelf() 或 stopService() 来停止服务。(在绑定状态下,无需实现此方法。)
onBind() 当另一个组件调用 bindService() 与服务绑定时,系统将调用此方法。在此方法中必须返回 IBinder 提供一个接口,供客户端与服务器进行通信。如果不希望允许绑定,则可以返回 null 。
onCreate() 首次创建服务时,系统调用次方法来执行一次性程序(在调用 onStartCommand() 或 onBind() 之前)。如果服务已经运行则不会调用此方法。
onDestory() 当服务不再使用且将被销毁是,系统调用此方法。服务应该实现方法来清理所有资源,如线程、注册的监听器,接收器等。
```
- 与`Activity`通信
1定义Binder子类,并实现`getService()`方法,返回`Service`对象
2实现`Service`类`onBind()`方法,返回上述`Binder`对象,
3实例化`ServiceConnection`对象,实现`onServiceConnected()`方法,从中获取到`Service`实例
4 `Activity`中调用`bindService()`方法,并传递步骤3的`ServiceConnection`对象,将流程跑起来
5 `Activity`既可以通过调用`Service`实例中的方法进行直接通信
- `BroadcastReceiver`
- 静态广播
1注册∶`AndroidManifest`中使用`<receiver.../><intent-filter../>`
2创建∶建立相应的`BroadcastReceiver`实现类
3接收∶在步骤2类onReceive()中接收广播
4发送`Context.sendBroadcast()`
- 动态广播
注册:`Context.registerReceiver()`
- 常用系统广播
```
Intent.ACTION_CONNECTIVITY_CHANGE
Intent.ACTION_BATTERY_CHANGED
Intent.ACTION_SCREEN_ON
Intent.ACTION_SCREEN_OFF
Intent.ACTION_PACKAGE_INSTALL
Intent.ACTION_BOOT_COMPLETED
Intent.ACTION_PACKAGE_ADDED
Intent.ACTION_PACKAGE_REPLACED
Intent.ACTION_PACKAGE_REMOVED
```
- `ContentProvider`
- 基本用法
生产者
1、注册∶`AndroidManifest`中使用`<provider.../>`
属性∶`authorities/exported/readPermission/writePermission`
2、创建∶建立相应的`ContentProvider`实现类
方法∶`onCreate/getType/insert/delete/update/query`
消费者
1、声明∶`AndroidManifest`中声明权限
2、使用∶`context.getContentResolver()`
方法∶`insert/delete/update/query`
\