Android基础组件|青训营笔记

91 阅读5分钟

这是我参与「第四届青训营 」笔记创作活动的第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方法绑定相应的视图资源文件。

生命周期

image.png

上图为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); //停止服务

两种启动方式与生命周期

image.png

  • 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将在数据存储方式一章进行总结。