Android中的四大组件

早该好好看看Android的基础了


Android中的四大组件

Activity

这个是最常见的。一个Activity就是一个单独的屏幕(前端)。一个Activity的生命周期如下:

启动顺序

1
onCreate() -> onStart() -> OnResume()

销毁

1
2
3
4
5
			内存不紧张             内存不紧张
onPause() ------------> onStop() ------------> onDestroy()
|内存 |内存
|紧张 |紧张
+-----> <Processed Killed> +-----> <Processed Killed>

跳转到另一个活动的Activity(注意调用顺序)

1
1st Activity onPause() -> 2nd Activity onCreate() -> onStart() -> OnResume() -> 1st Activity onStop()

返回到前一个Activity(此时第二个Activity算作结束)

1
2nd Activity onPause()  —> 1st Activity onRestart() -> onStart() -> onResume() -> 2nd Activity onStop() ->onDestroy()

由于其他程序弹出,导致暂时挂起(Run -> Pause)(例子:正在切换app的时候,当前app依然是可以被看到的)

1
onPause()

完全不需要展示的时候(Pause -> Stop)(丢在后台)

1
onStop()

从后台进入活动(Stop -> Run)(从后台启动至可视)

1
onRestart() -> onStart() -> onResume()

上述方法,我们都能够通过**覆盖(override)**的方式复写,从而定制功能。

Intent

Intent为Activity的通信模块。Android中的Activity都是利用Intent进行通信。利用Intent,可以启动Activity/Service/Broadcast例如:

1
2
3
4
5
6
7
8
9
+--------------------+----------------------------------------------------------+
| 组件名字 | 对应方法 |
+--------------------+----------------------------------------------------------+
| Activity | startActivity / startActivityForResult |
+--------------------+----------------------------------------------------------+
| Service | startService / bindService |
+--------------------+----------------------------------------------------------+
| Broadcast | sendBroadcasts / sendOrderedBroadcast / sendStickycasts |
+--------------------+----------------------------------------------------------+

Intent中,可以定义如下的属性

  • 动作(Action): 当前 Intent 要完成的动作,比如发起电话,**调用另一个 Activity **
  • 数据(Data): 执行动作的URI以及对应MIME类型
  • 附加信息(Category): 执行动作的附加信息,比如直接回到 HOME 界面
  • 类型(Type): 指定Intent的数据类型(MIME)。一般不需要指定
  • 组件(Conpent): 指定Intent最终目的组件类型,一般来说不需要指定。
  • 扩展信(Extra):这个比较常见的用法是,在两个不同的activity之间进行数据的传输。

设置好属性之后,根据我们指定的Intent类型,调用函数:

1
startActivity/startService/startBroadcast

进行Intent调用

AndroidManifest

所有的Activity都需要在这个配置文件中生命,否则的话程序不会识别该Activity,强行运行的时候会直接闪退。

Service

与Activity相对,在后台运行的程序。Service有两种不同的类型:

  • Started(启动): 当应用程序组件(如Activity)调用startService方法启动的服务
  • Bound(绑定): 当引用程序组件调用bindService方法绑定的服务

这两者的区别在于:
Started Service由其他的组件调用startService的方法调用,常用于本地服务。此时Service的onStartCommand的方法被调用。并且在当前状态下,其生命周期与启动的组件无关,并且会在后台无限运行,甚至在调用者已经被销毁。因此,在完成任务后,必须通过调用stopSelf的发给发停止,或者其他的组件调用stopService的方法停止。

启动服务

1
2
			  第一次创建
startService ------------> onCreate -> onStart

终止服务

1
stopService -> onDestroy -> Service Stop

Bound Service主要是远程服务,调用者与服务绑定在一起,调用者一旦推出服务器也会终止。

启动服务

1
2
              第一次创建
bindService ------------> onCreate -> onBind -> onStart

终止服务

1
onUnbild -> onDestroy 

AndroidManifest

同样,Service也需要在此文件中进行声明。

Broadcast/Receiver

这两个作为一组使用,用于处理广播事件。当发生事件,比如说收到短信、电话呼入等等事件的时候,这个事件就会进行广播,此时所有对这个事件感兴趣的Receiver就能够对其进行接收。

广播种类

  • 无序广播(Normal Broadcasts): 异步广播,在逻辑上能够在同一时刻被所有的接收者接收到。缺点就是接收者不能将当前的消息处理结果交给下一个人

  • 有序广播(Ordered Broadcasts):根据优先级进行顺序传输,其中优先级是在Menifest中对类生明中的<intent-filter android:priority>设置,级别越高传输的优先级就越高。

发送广播

  • Context.sendContext(): 发送正常的广播,此时所有**订阅(register)**了当前广播的对象都将能够收到。
  • Context.sendOrderedBroadcast(): 发送有序广播,当前的接收者有权限终止广播,BroadcastReceiver.abortBroadcast())。当前的广播如果被终止了,那么后面的接收者就不能够接收到广播,从而阻止一些事件被其他对象收到。接收者可以使用函数setResultExtras(Bundle)将当前对广播的处理结果存入,然后传给下一个接收者,通过代码:Bundle bundle =getResultExtras(true))可以获得上一个对象存放的处理结果。

Receiver 实现办法

  • 定义一个类继承 BroadcastReceiver
  • 实现方法public void onReceive(Context context, Intent intent),通过函数intent.getAction()能够得到当前广播的名字。
  • 在Menifest中设置receiver,并且注册当前的权重。

监听广播的方法

主要两种方法——静态注册和动态注册

静态注册

在完成了直接在Menifest中添加代码:

1
2
3
4
5
6
<receiver android:name="clsReceiver"> 
<intent-filter>
<action
android:name="yourBroadcastName"/>
</intent-filter>
</receiver>

静态注册是常驻型,也就是说当应用程序关闭之后,如果有信息广播到来后,如果有信息广播来,程序也会被系统调用自动运行。

动态注册调用

首先获得一个filter对象IntentFilter filter = new IntentFilter();,然后往这个filter中加入filter.addAction(String ACTION);这之后设置当前的优先级filter.setPriority(Int);最后调用registerReceiver(Receiver, filter);完成注册。
动态注册不是常驻型的,也就是说activity生命周期结束的时候,这个注册的事件就会结束。

关于Receiver的生命周期

onReceiver的生命周期比较短,其对象在onReceive调用完成后结束,所以尽量不要在Receiver中开启多线程

ContentProvider

主要用于负责数据的交互,将程序内部的数据与外部的数据例如通话记录,短信等,它主要的作用就是将程序的内部的数据和外部进行共享,为数据提供外部访问接口,被访问的数据主要以数据库的形式存在,而且还可以选择共享哪一部分的数据。这样一来,对于程序当中的隐私数据可以不共享,从而更加安全。
(具体还没有用过,待完善)

参考博客:
(https://www.cnblogs.com/pepcod/archive/2013/02/11/2937403.html)[https://www.cnblogs.com/pepcod/archive/2013/02/11/2937403.html]
(https://www.jianshu.com/p/51aaa65d5d25)[https://www.jianshu.com/p/51aaa65d5d25]