【Android】四大组件归纳总结
【Android】四大组件归纳总结
随着学习持续更新
四大组件均可使用android:process="name"在Manifest中声明成独立进程
Activity#
生命周期#
4种启动模式#
Android使用回退栈来管理Activity实例。当前显示的Activity在栈顶,当点击后退或返回时,栈顶的Activity出栈。
可以指定Activity的启动模式来避免重复创建同一Activity
在AndroidManifest.xml中声明Activity的启动模式
Copy
android:lauchMode="singleTask"></activity>
standard
默认的启动模式,允许Activity被多次实例化,一个任务栈中会有多个Activity实例
singleTop
处于栈顶的Activity会被重用,若不在栈顶则会被重新创建。重用时会调用原来实例的onNewIntent()函数
singleTask(常用)
一个任务栈只允许存在一个Activity实例,当startActivity()时,若该Activity在栈内,则会将该Activity上的所有Activity销毁,使该Activity处于栈顶,并调用onNewIntent()方法
singleInstance
一个Activity在独立的任务中开启,保证在系统中只有一个实例,所有的startActivity()都会重用该实例,并回调onNewIntent()方法
两个Activity互相切换时的生命周期#
A:onCreate->onStart->onResume
这是在A中启动B活动,生命周期如下:
A: onPause
B: onCreate->onStart->onResume
A: onStop
从B中返回A活动时
B: onPause
A: onRestart->onStart->onResume
B: onStop->onDestroy
Service#
https://blog.csdn.net/javazejian/article/details/52709857
当程序进入后台运行时,所需要做的操作可以通过Service实现。
在任何位置调用startService()启动服务。
每个服务只存在一个实例,每次调用startService()时会回调onStartCommand();只需要调用一次stopService()或stopSelf()函数,服务会被停止。
普通Service运行在UI线程,若需要执行耗时操作需要新开线程。
生命周期#
onCreate()
onStartCommand(intent, flags, startId)
有三种返回值
START_STICKY:当服务因内存不足被kill掉后,内存空闲时会尝试重建服务,重建成功则回调onStartCommand(),这是传入的intent为null
START_NOT_STICKY:当Service因内存不足而被系统kill后,即使系统内存再次空闲时,系统也不会尝试重新创建此Service
START_REDELIVER_INTENT:当Service因内存不足而被系统kill后,则会重建服务,并通过传递给服务的最后一个 Intent 调用 onStartCommand(),这个值适用于主动执行应该立即恢复的作业(例如下载文件)的服务
onDestroy()
调用stopService()或stopSelf()
IntentService#
重写onHandleIntent()函数,在函数中完成耗时操作。IntentService会自动将操作执行在子线程中,并在完成时调用stopSelf()自我销毁
Copy
public class MyIntentService extends IntentService {
@Override
protected void onHandleIntent(Intent intent) {
...
}
}
Binder(与服务连接)#
当服务仅限本地应用使用,不需要跨进程工作,则可以实现自有的Binder类,让客户端通过该类直接访问服务中的公共方法。
首先需要创建ServiceConnection对象,代表与服务的连接,有两个方法
onServiceConnected(name, serivce)
系统会调用该方法传递服务的onBind()方法返回的IBinder, 通过该对象可以调用获取到Service的实例对象,进而调用服务端的公共方法。
onServiceDisconnected(name)
系统与服务意外中断时调用,unBind不会调用该方法
调用bindService(intent, ServiceConnection, flag)绑定相关服务,flag指绑定时是否自动创建Service,0表示不创建;BIND_AUTO_CREATE表示自动创建。
调用unbindService(ServiceConnection)
当最后一个客户端与服务取消绑定时,系统会将服务销毁
前台服务#
startForeground(int id, Notification notification)
将当前服务设成前台服务,id参数为唯一标识通知的整型数,不得为0
stopForeground(boolean removeNotification)
Android8.0后需要开启前台服务要在Activity中startForegroundService(i),且之后Service要在5s内调用startForeground()才能成功创建前台服务
如何保证Service不被杀死#
内存资源不足
将onStartCommand()返回值设成START_STICKY或START_REDELIVER_INTENT,这样内存组后也会恢复服务
将服务设成前台服务,具备较高优先级
用户手动干预
如果不是force stop则会调用生命周期中的onDestroy()方法,可以在方法中发送广播重启服务。完备一些的话就启动两个服务,相互监听,相互重启。
Broadcast#
https://www.jianshu.com/p/ca3d87a4cdf3
组成:发送广播的Broadcast,接受广播的BroadcastReceiver和传递消息的Intent。
类型:普通广播、有序广播、本地广播(LocalBroadcast)、Sticky广播
静态广播与动态广播#
广播可分为静态注册和动态注册两种形式
静态注册
在Manifest.xml中声明静态广播
Copy
<intent-filter android:priority=1000>
<action android:name="com.broadcast"
</intent-filter>
动态注册
可以在onCreate的时候注册
Copy
MyBroadcastReceiver receiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter("my.action");
context.registerReceiver(receiver, filter);
在onDestroy的时候注销
Copy
unregisterReceiver(receiver);
静态广播与动态广播的区别
静态广播在activity注销的时候也能够继续接收;动态广播在APP退出后就无法接收了
动态广播在相同Priority下优先级比静态广播高
普通广播#
异步广播,调用sendBroadcast(new Intent(ACTION))来发出广播
定义广播接收器
Copy
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
...
}
}
在AndroidManifest.xml中注册:
Copy
<intent-filter>
<action android:name=".."/>
</intent-filter>
动态注册接收器:
Copy
registerReceiver(new MyBroadcastReceiver(), new IntentFilter(MY_ACTION));
有序广播#
发送出去的广播被广播的接收者按照先后顺序接收
接收的顺序排序
按照Priority属性值从大到小
Priority相同则动态注册广播优先
本地广播#
只限于应用的广播
使用LocalBroadcastManager.getInstance(context)来使用关于广播的操作函数:
registerReceiver(receiver, intentFilter)
unregisterReceiver(receiver)
sendBroadcast(new Intent(INTENT_NAME))
sendBroadcastSync(new Intent())
注册本地广播
Copy
mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
mReceiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_MY_TYPE);
mLocalBroadcastManager.registerReceiver(mReceiver,filter);
需要在onDestory()的中进行注销:
Copy
mLocalBroadcastManager.unregisterReceiver(mReceiver)
ContentProvider#
ContentProvider可以将应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对应用中的数据进行增删改查。
也可以进行进程间数据的交互和共享,跨进程通信。
作者: y4ngyy

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
工作流引擎activiti和jbpm哪个比较好?
在常用的ERP系统、OA系统的开发中,工作流引擎是一个必不可少的工具。之前在选择工作流引擎时曾经在activiti和jbpm之间有过比较,当时做出的决定是使用jbpm,但实际开发过程中发现这个选择是不合适的。目前我们改为选择Activiti作为工作流模块的引擎,理由如下: 1、Activiti拥有更简洁健壮的接口 JBPM自从版本五后,便重启炉灶,完全抛弃了JBMP4的代码基础,重新基于drools进行了实现。JBPM5,JBPM6似乎缺少一个合格的系统架构师,其接口设计匪夷所思,基本上是按照drools的接口再提供了一套JBPM接口,同名的接口,实现类不断重复出现,代码体系十分混乱。 一个典型的例子,同样是查询待办事项,在JBPM中接口如下: List<TaskSummary> getTasksAssignedAsExcludedOwner(String userId, String language); List<TaskSummary> getTasksAssignedAsPotentialOwner(String userId, String langu...
-
下一篇
如何使用MQTT.fx接入物联网平台,实例教程来了!
云栖号快速入门:【点击查看更多云产品快速入门】不知道怎么入门?这里分分钟解决新手入门等基础问题,可快速完成产品配置操作! 本文档以MQTT.fx为例,介绍使用第三方软件以MQTT协议接入物联网平台。MQTT.fx是一款基于Eclipse Paho,使用Java语言编写的MQTT客户端工具。支持通过Topic订阅和发布消息。 前提条件 已在物联网平台控制台创建产品和设备,并获取设备证书信息(ProductKey、DeviceName和DeviceSerect)。创建产品和设备具体操作细节,请参考创建产品、单个创建设备或批量创建设备。 使用MQTT.fx接入 1.下载并安装MQTT.fx软件。请访问MQTT.fx官网。 2.打开MQTT.fx软件,单击设置图标。 3.设置连接参数。物联网平台目前支持两种连接模式,不同模式设置参数不同。 TCP直连:Client ID中 securemode=3,无需设置SSL/TLS信息。 TLS直连:Client ID中 securemode=2,需要设置SSL/TLS信息。 (1).设置基本信息。 (2).单击User Credentials,设置Us...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS8编译安装MySQL8.0.19
- MySQL数据库在高并发下的优化方案
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- MySQL8.0.19开启GTID主从同步CentOS8
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7,8上快速安装Gitea,搭建Git服务器