【Android】四大组件归纳总结
随着学习持续更新
四大组件均可使用android:process="name"
在Manifest中声明成独立进程
Activity
生命周期
4种启动模式
Android使用回退栈来管理Activity实例。当前显示的Activity在栈顶,当点击后退或返回时,栈顶的Activity出栈。
可以指定Activity的启动模式来避免重复创建同一Activity
在AndroidManifest.xml中声明Activity的启动模式
<activity android:name=".MyActivity"
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
当程序进入后台运行时,所需要做的操作可以通过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()
,这个值适用于主动执行应该立即恢复的作业(例如下载文件)的服务
- START_STICKY:当服务因内存不足被kill掉后,内存空闲时会尝试重建服务,重建成功则回调
onDestroy()
调用
stopService()
或stopSelf()
IntentService
重写onHandleIntent()
函数,在函数中完成耗时操作。IntentService会自动将操作执行在子线程中,并在完成时调用stopSelf()
自我销毁
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
组成:发送广播的Broadcast,接受广播的BroadcastReceiver和传递消息的Intent。
类型:普通广播、有序广播、本地广播(LocalBroadcast)、Sticky广播
静态广播与动态广播
广播可分为静态注册和动态注册两种形式
静态注册
在Manifest.xml中声明静态广播
<receiver android:name=".MyReceiver">
<intent-filter android:priority=1000>
<action android:name="com.broadcast"
</intent-filter>
</receiver>
动态注册
可以在
onCreate
的时候注册MyBroadcastReceiver receiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter("my.action");
context.registerReceiver(receiver, filter);
在
onDestroy
的时候注销unregisterReceiver(receiver);
静态广播与动态广播的区别
- 静态广播在activity注销的时候也能够继续接收;动态广播在APP退出后就无法接收了
- 动态广播在相同Priority下优先级比静态广播高
普通广播
异步广播,调用sendBroadcast(new Intent(ACTION))
来发出广播
定义广播接收器
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
...
}
}
在AndroidManifest.xml中注册:
<receiver android:name=".broadcast.MyBroadcastReceiver">
<intent-filter>
<action android:name=".."/>
</intent-filter>
</receiver>
动态注册接收器:
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())
注册本地广播
mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
mReceiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_MY_TYPE);
mLocalBroadcastManager.registerReceiver(mReceiver,filter);
需要在onDestory()
的中进行注销:
mLocalBroadcastManager.unregisterReceiver(mReceiver)
ContentProvider
ContentProvider可以将应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对应用中的数据进行增删改查。
也可以进行进程间数据的交互和共享,跨进程通信。
【Android】四大组件归纳总结的更多相关文章
- Android 四大组件之" ContentProvider "
前言 ContentProvider作为Android的四大组件之一,是属于需要掌握的基础知识,可能在我们的应用中,对于Activity和Service这两个组件用的很常见,了解的也很多,但是对Con ...
- Android四大组件之一“广播”
前言 Android四大组件重要性已经不言而喻了,今天谈谈的是Android中的广播机制.在我们上学的时候,每个班级的教室里都会装有一个喇叭,这些喇叭都是接入到学校的广播室的,一旦有什么重要的通知,就 ...
- Android 四大组件 与 MVC 架构模式
作为一个刚从JAVA转过来的Android程序员总会思考android MVC是什么样的? 首先,我们必须得说Android追寻着MVC架构,那就得先说一下MVC是个啥东西! 总体而来说MVC不能说是 ...
- android四大组件(简单总结)
activity 一个Activity通常就是一个单独的屏幕(窗口) Activity之间通过Intent进行通信 android应用中每一个Activity都必须要在AndroidManifest. ...
- android四大组件之Broadcast
广播的概念 现实中:我们常常使用电台通过发送广播发布消息,买个收音机,就能收听 Android:系统在产生某个事件时发送广播,应用程序使用广播接收者接收这个广播,就知道系统产生了什么事件.Androi ...
- Android 四大组件之再论service
service常见的有2种方式,本地service以及remote service. 这2种的生命周期,同activity的通信方式等,都不相同. 关于这2种service如何使用,这里不做介绍,只是 ...
- Android四大组件及activity的四大启动模式
Android四大组件 1. 广播接收者的两种类型: (1)系统广播接收者,就是继承BroadcastReceiver这个类,然后还要在清单文件中注册,注册之后给他一个action.当系统发生了这个a ...
- Android成长日记-Android四大组件之Service组件的学习
1.什么是Service? Service是Android四大组件中与Activity最相似的组件,它们都代表可执行的程序,Service与Activity的区别在于:Service一直在后台运行,它 ...
- Android四大组件之Activity(活动)及其布局的创建与加载布局
Android四大组件之Activity(活动)及其布局的创建与加载布局 什么是Activity ? 活动(Activity)是包含用户界面的组件,主要用于和用户进行交互的,一个应用程序中可以包含零个 ...
- Android四大组件之——Activity的生命周期(图文详解)
转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai 联系方式:JohnTsai.Work@gmail.com [Andro ...
随机推荐
- java开发环境搭建(jdk安装)和经常出现问题的探讨
面对许多java初学者环境搭建出现的问题 第一步: 1,首先在可以百度jdk进入oracle的官网也可以进入这个网站 https://www.oracle.com/technetwork/java/j ...
- java 面向对象 购物车
一个商城包括多个商品.多个用户.拥有销售商品.展示商品和查找商品功能.2) 一个用户拥有一个购物车,购物车具有结算功能.3) 商城具有名称,静态字符串类型4) 用户类是抽象类,两个子 ...
- Hadoop什么?
Hadoop是什么?Hadoop是一个开发和运行处理大规模数据的软件平台,是Appach的一个用java语言实现开源软件框架,实现在大量计算机组成的集群中对海量数据进行分布式计算. Hadoop框架中 ...
- MongoDB的图形化连接工具MongoDB VUE
MongoDB的图形化连接工具MongoDB VUE 类似mysql的navicat.
- 吴裕雄--天生自然HTML学习笔记:HTML 脚本
JavaScript 使 HTML 页面具有更强的动态和交互性. <!DOCTYPE html> <html> <head> <meta charset=&q ...
- 谁来破解公交WiFi的尴尬困局?
在咖啡馆.饭店坐定,菜单可以待会再看,远远看见服务员迎上来,赶紧先问一句:"这里有无线网吗,密码是多少",和笔者一样养成类似习惯的人越来越多.所以,当公交WiFi"大 ...
- Oil Deposits(油田)(DFS)
题目: The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. G ...
- 从赴美IPO绝迹 看那些烧成泡沫的互联网企业
曾经,赴美上市是很多中国企业的终极梦想.然而在当下,随着中概股在美国股市股价的不断走低.中国赴美上市企业私有化速度的加快,大众才发现,原来美国股市并不是那么好混的.但不管怎样,赴美上市始终是一种荣耀. ...
- 一致性哈希算法(consistent hashing)PHP实现
一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简单哈希 ...
- songCMS 3.15 cookie SQLINJ
./code/profile.php ... $db = new db(); $SQL = "SELECT * FROM `{$dbprefix}user` WHERE `ID` = {$_ ...