[TOC]
# 目录
# 1、Android四大组件
* ### **Activity(活动)**
**需要在AndroidMainfest.xml中注册**
**概念:**Activity是Android应用与用户进行交互的最直接的组件,它提供了应用的界面显示以及用户的点击等动作的回调,对于用户是可见的。Activity是Context的子类,同时是实现了window.callback和keyevent.callback以处理与用户的交互。
```
<activity android:name=".MainActivity" android:label="@string/app_name">
<!-- 主Activity -->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
```
**生命周期:**![image.png](https://upload-images.jianshu.io/upload_images/13971762-64984a3ea26f5fe8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
> 推荐阅读:[https://developer.android.com/training/basics/activity-lifecycle/](https://developer.android.com/training/basics/activity-lifecycle/ "https://developer.android.com/training/basics/activity-lifecycle/")
[](https://developer.android.com/training/basics/activity-lifecycle/)**Activity的状态保存:**
* 正常情况下或者用户主动按返回键,或者点击关闭按钮(实现了finish( )方法)退出Activity,使用onPause( ) 和onStop( )去保存数据
* 非正常情况下(系统内存不足,主动kill掉处于暂停或者停止状态的Activity)导致的Activity退出,需要我们重写onSaveInstanceState( Bundle savedInstanceState)方法去保存数据,然后在OnCreate(Bundle savedInstanceState)方法中或者实现在系统onStart( )方法调用后,去调用的OnRestoreInsatnceState(Bundle savedInstanceState)去对数据进行还原
**Activity的启动模式**
* **standred:默认模式,**不用为Activity配置android:launchModel属性,每启动一次就会创建一个实例
* **singleTop:栈顶复用模式**,需要在AndroidMainfest.xml中为该Activity配置**android:launchModel="singleTop"**属性,每次启动时,会先去判断当前**返回栈的栈顶**是否是该Activity的实例,如果不是的话就创建一个新的实例,是的话就不会创建新的实例,而是使用当前的栈顶实例。(会调用onNewIntent()方法)
* **singleTask:栈内复用模式**,需要在AndroidMainfest.xml中为该Activity配置**android:launchModel="singleTask"**属性,每次启动时,会先去判断当前**返回栈内**是否存在该Activity的实例,如果不存在的话就创建一个新的实例,置于栈顶,如果栈内存在该Activity实例的话就会将该实例上面的所有Activity实例进行出栈操作,将该Activity实例置于栈顶(会调用onNewIntent()方法)
* **singleInstance:实例唯一模式**,在整个应用中只有一个该Activity的实例,在初次启动该Activity时,会为该Activity开辟一个新的栈空间,将该Activity置于新空间内,之后每次再去启动该Activity时,去新空间中寻找该Activity实例
* ### **Service(服务)**
**需要在AndroidMainfest.xml中注册**
Service也是Context的子类,用于处理后台任务的,用户是不可见的。
**Service的创建**
1. **手动创建**
* 新建Class文件,继承Service
* 在AndroidMainfest中进行注册
2. **使用AndroidStudio进行自动创建**
AndroidMainfest.xml
```
<service
android:name=".MyService" //Service所在的类
android:enabled="true" //Service是否可用
android:exported="true" //是否可以被其他应用使用
/>
```
**Service的生命周期**
![image.png](https://upload-images.jianshu.io/upload_images/13971762-f7908d0b1c277d8b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
**Service的生命周期函数**
* **OnCreate()** 当Service被创建时调用,在一次生命周期过程中只调用一次
* **OnStartCommand()** 当在Activity中调用startService()时被调用,一般用与Activity无关的Service,如播放音乐,下载等
* **OnBind()** 在Activity调用bindService()函数时调用
* **OnUnBind()** 在Activity调用unBindService()函数时调用
* **OnDestory()** 在Service销毁时调用,再次启动该Service时,需调用OnCreate()方法
由图可知,service有两种模式,绑定模式和非绑定模式。
1. 绑定模式***(bindService())***的生命周期:onCreate( ) => onBind( ) => onUnbind( ) => onDestory( )
2. 非绑定模式***(startService())***的生命周期: onCreate( ) => onStartCommand( ) => onDestory( )
> 如果一个service执行了由多个Activity执行了onBind( ) 方法,那么需要所有的Activity都执行onUnBind( )方法,这个service才会停止
>
> 如果一个service执行了由多个Activity执行了startService( ) 方法,只需要执行一次stopService()或者stopSelf()方法,这个service就会停止,因为不管执行多少次启动,只会调用一次onCreate( )方法
**IntentService**
IntentService是Service的子类,比普通的Service增加了额外的功能,IntentService**会创建独立的线程来处理所有的Intent请求**,**会创建独立的线程来处理onHandleIntent( )中实现的代码**,除此之外,IntentService还**会自动停止。**
**前台服务** Android O之后必须加上 channelld,前台服务才可生效
* ### **ContentProvider(内容提供器)**
是应用于app之间的共享数据的接口,使用时必须自定义一个类继承ContentProvicer,然后重写query、insert、update、delete等方法
**必须在AndroidMainfest.xml中注册**
ContentProvider与SQLite的最大区别在于:SQLite只能访问本应用下的数据库,而ContentProvider还可以去增删改查本地文件、xml文件的读取等
* ### **BroadCastReceiver(广播接收器)**
**在AndroidMainfest.xml中注册称为静态注册,在代码中注册称为动态注册,各有优劣**
接收系统或者app发送的广播事件,分为有序广播和无序广播。
实现原理:通过Android系统的Binder机制实现通信
> **有序广播:**按照被接受者的优先级顺序在被接受者之间依次传播,高优先级的被接受者可以将处理结果通过广播传递给低优先级的被接受者,也可以中断该广播的传递
>
> **无序广播:** 完全异步,理论上可以被任何广播接收器接受到,优点是:传播效率高,缺点是不可控,
```
<!-- 静态注册 -->
<receiver android:name=".receiver1">
<!-- 该广播接收器接收的广播 -->
<!-- android:priority 设置优先级 -->
<intent-filter android:priority="100">
<action android:name="android.intent.action.CALL"></action>
</intent-filter>
</receiver>
```
```
//动态注册
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//to do something
}
};
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_CALL);//该广播接收器接收的广播类型
//intentFilter.setPriority(100); //为广播设置优先级
registerReceiver(receiver,intentFilter);
```
```
Intent intent = new Intent("com.duoshilin.android.week03.MY_BROADCAST");
sendBroadcast(intent); //发送无序广播
sendOrderedBroadcast(intent,null);//发送有序广播 第二个参数是与权限有关的字符串
```
##### **本地广播**
* 只能动态注册不能静态注册
* 只能在本应用中使用
```
/**
* 使用本地广播
*/
public class Main2Activity extends AppCompatActivity {
private IntentFilter intentFilter;
private LocalReceiver localReceiver;
private LocalBroadcastManager manager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
//注册一个本地广播
manager = LocalBroadcastManager.getInstance(this);
intentFilter = new IntentFilter();
intentFilter.addAction("com.duoshilin.android.LOCAL_BROCAST");
localReceiver=new LocalReceiver();
manager.registerReceiver(localReceiver,intentFilter);
//点击按钮发送广播
Button button = findViewById(R.id.send_local_broadcast);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.duoshilin.android.LOCAL_BROCAST");
manager.sendBroadcast(intent);
}
});
}
class LocalReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "我是一个本地广播", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
manager.unregisterReceiver(localReceiver);
}
}
```
# 2、AndroidMainfest.xml
> 官方文档:[https://developer.android.com/guide/topics/manifest/manifest-intro](https://developer.android.com/guide/topics/manifest/manifest-intro "https://developer.android.com/guide/topics/manifest/manifest-intro")
# 3、Handler机制
* **是Android中消息传递 / 异步通信的机制,主要用于将子线程(工作线程)中需要更新UI的消息,传递给主线程(线程),从而实现对UI的更新(**android 中不允许子线程更新UI**)**
* **handler的使用必须先调用Looper.prepare()方法,通常在Activity中调用时没有调用该方法是因为在ActivityThread的main方法中,系统内部调用了Looper.prepareMainLooper()方法,实际上还是调用了Looper.prepare()**
* **handler的使用**
```
public class HandlerTestActivity extends AppCompatActivity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handler_test);
tv=findViewById(R.id.tv);
method1();
method2();
method3();
}
//匿名内部类实现
private void method1(){
final Handler mHandler;
mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
Bundle data = msg.getData();
tv.setText(data.getString("key"));
}
};
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message message = new Message();
message.obj = "匿名实现的Handler";
Bundle data = new Bundle();
data.putString("key","value");
message.setData(data);
mHandler.sendMessage(message);
}
}).start();
}
//新建Handler子类实现
private void method2(){
final Handler mHandler;
class MyHandler extends Handler{
@Override
public void handleMessage(Message msg) {
tv.setText(msg.obj.toString());
}
}
mHandler = new MyHandler();
new Thread(new Runnable() {
@Override
public void run() {
Message message = new Message();
message.obj = "Handler子类实现的Handler";
mHandler.sendMessageDelayed(message,2000);
}
}).start();
}
//使用Handler的post()实现
private void method3(){
Handler mHandler;
mHandler = new Handler();
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
tv.setText("使用handler.post()实现");
}
},3000);
}
}
```
**在子线程里使用Handler**
```
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}
```
# 4、Handler、Message和Looper
> 推荐阅读:[https://blog.csdn.net/fnhfire_7030/article/details/79518819](https://blog.csdn.net/fnhfire_7030/article/details/79518819 "https://blog.csdn.net/fnhfire_7030/article/details/79518819")
* Handler:负责发送和处理消息。
* Message:用来携带需要的数据。
* MessageQueue:消息队列,队列里面的内容就是Message。
* Looper:消息轮巡器,负责不停的从MessageQueue中取Message。
![image.png](https://upload-images.jianshu.io/upload_images/13971762-e8810a33a539d614.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![image.png](https://upload-images.jianshu.io/upload_images/13971762-ee40b8dd5187e2ce.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)