这是我参与「第四届青训营 」笔记创作活动的第11天。
要想开发一个基本的Android程序,首先要了解Android的基础组件。Android有四大基础组件:
- Activity
- Service
- content provider
- Broadcast receiver
Activity
什么是Activity
在Android中,Activity相当于一个页面,可以在Activity中添加各种视图组件,用以实现与用户的交互。
创建Activity
在Android studio中新建一个项目,会自动生成一个主activity,作为应用的起始页面,也可以右键新建。
class MActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_mactivity)
}
}
新建类继承AppCompatActivity便可作为一个Activity,调用setContentView方法绑定相应的视图资源文件。
生命周期
上图为Activity经典生命周期流程图
- onCreate 当Activity第一次被运行时调用此方法,可用于加载布局视图,获取控件命名空间等一些初始化工作。
- onStart 表示Activity正在被启动,已经从不可见到可见状态,不是指用户可见,指Activity在后台运行,没有出现在前台,但还是无法与用户进行交互。
- onResume 表Activity已经变为可见状态了,并且出现在前台工作了,也就是指用户可见了。
- onPause 表示Activity正在暂停,但Activity依然部分可见,可以执行一些轻量级操作,但一般不会进行太多操作,因为这样会影响用户体验。
- onStop 表示Activity即将暂停,此时Activity工作在后台,已经不可见了,可以与onPause方法一样做一些轻量级操作,但依然不能太耗时。
- onRestart 当Activity被重新启动的时候,调用此方法。
- onDestroy 表示活动即将被销毁,并释放资源。
启动模式
- Standard模式 默认启动模式,一个activity可以有多个实例,每次启动Activity,无论任务栈中是否已经存在这个activity的实例,系统都会创建一个新的activity实例。
- SingleTop模式 栈顶模式,当一个singleTop模式的activity 已经位于栈顶时,再去启动它时,不再创建实例,如果不在栈顶,就会创建实例。
- SingleTask模式 单任务模式,如果启动的activity 已经存在于任务栈中,则会将activity移动到栈顶,并将上面的activity出栈,否则创建新的实例。
- SingleInstance模式 只有一个实例,创建时会新建一个栈,且此栈中不能有其它对象。
Service
什么是Service
Service是一个应用组件,它用来在后台完成一个时间跨度比较大的工作且没有关联任何界面。
Service通常用来完成如下工作:
- 访问网络
- 播放音乐
- 文件IO操作
- 大数据量数据库操作
Service特点
- Service在后台运行,不用与用户进行交互;
- 即使应用退出,服务也不会停止;
- 在默认的情况下,Service运行在应用程序进程的主线程(UI线程)中,如果需要在Service中处理一些网络连接等耗时的操作,那么应该将这些任务在分线程中处理,避免阻塞用户界面;
创建Service
Android Studio中右键项目文件,新建一个Service文件。
class MyService : Service() {
override fun onBind(intent: Intent): IBinder {
TODO("Return the communication channel to the service.")
}
}
使用Service需要在AndroidManifest.xml文件中注册才能生效:
<service
android:name=".MyService"
android:enabled="true"
android:exported="true"></service>
启动服务与停止服务
Intent startIntent = new Intent(this, MyService.class);
startService(startIntent); //启动服务
Intent stopIntent = new Intent(this, MyService.class);
stopService(stopIntent); //停止服务
两种启动方式与生命周期
- startService只是启动Service,启动它的组件(如Activity)和Service并没有关联,只有当Service调用stopSelf或者其他组件调用stopService服务才会终止。
- bindService方法启动Service,其他组件可以通过回调获取Service的代理对象和Service交互,而这两方也进行了绑定,当启动方销毁时,Service也会自动进行unBind操作,当发现所有绑定都进行了unBind时才会销毁Service。
Broadcast
什么是Broadcast
在Android中,广播是一种广泛运用的在应用程序之间传输信息的机制。而广播接收器是对发送出来的广播进行过滤接受并响应的一类组件。可以使用广播接收器来让应用对一个外部事件做出响应。
注册广播
静态注册
<receiver
android:enable="true"/"false"
//此broadcastReceiver 是否接受其他应用发出的广播
//默认值时由receiver中有无intent-filter决定,如果有,默认true,否则默认false
android:exported="true"/"false"
//继承BroadcastReceiver子类的类名
android:name=".mBroadcastReceiver"
//具有相应权限的广播发送者发送的广播才能被此BroadcastReceiver所接收;
android:permission="string"
//BroadcastReceiver运行所处的进程
//默认为app的进程,可以指定独立的进程
//注:Android四大基本组件都可以通过此属性指定自己的独立进程
android:process="string" >
//用于指定此广播接收器将接收的广播类型
//本示例中给出的是用于接收网络状态改变时发出的广播
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
动态注册 在程序中使用Context.registerReceiver() 方法注册。
mBroadcastReceiver mBroadcastReceiver = new mBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
// 2. 设置接收广播的类型
intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);
// 3. 动态注册:调用Context的registerReceiver()方法
registerReceiver(mBroadcastReceiver, intentFilter);
两种方式的区别 动态注册广播接收器特点是当用来注册的Activity关掉后,广播也就失效了。静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开着的。也就是说哪怕app本身未启动,该app订阅的广播在触发时也会对它起作用。
常见广播
- 收到短信广播:android.provider.Telephony.SMS_RECEIVED(发送一个有序广播);
- 开机完成广播:Intent.ACTION_BOOT_COMPLETED;
- 应用被卸载广播:Intent.ACTION_PACKAGE_REMOVED;
- 手机锁屏:Intent.ACTION_SCREEN_OFF;
- 手机开屏:Intent.ACTION+SEREEN_ON;
总结
这里只介绍了Android四大组件其中三个,Content provider将在数据存储方式一章进行总结。