随着学习持续更新

四大组件均可使用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

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()自我销毁

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中声明静态广播

    <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);
  • 静态广播与动态广播的区别

    1. 静态广播在activity注销的时候也能够继续接收;动态广播在APP退出后就无法接收了
    2. 动态广播在相同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】四大组件归纳总结的更多相关文章

  1. Android 四大组件之" ContentProvider "

    前言 ContentProvider作为Android的四大组件之一,是属于需要掌握的基础知识,可能在我们的应用中,对于Activity和Service这两个组件用的很常见,了解的也很多,但是对Con ...

  2. Android四大组件之一“广播”

    前言 Android四大组件重要性已经不言而喻了,今天谈谈的是Android中的广播机制.在我们上学的时候,每个班级的教室里都会装有一个喇叭,这些喇叭都是接入到学校的广播室的,一旦有什么重要的通知,就 ...

  3. Android 四大组件 与 MVC 架构模式

    作为一个刚从JAVA转过来的Android程序员总会思考android MVC是什么样的? 首先,我们必须得说Android追寻着MVC架构,那就得先说一下MVC是个啥东西! 总体而来说MVC不能说是 ...

  4. android四大组件(简单总结)

    activity 一个Activity通常就是一个单独的屏幕(窗口) Activity之间通过Intent进行通信 android应用中每一个Activity都必须要在AndroidManifest. ...

  5. android四大组件之Broadcast

    广播的概念 现实中:我们常常使用电台通过发送广播发布消息,买个收音机,就能收听 Android:系统在产生某个事件时发送广播,应用程序使用广播接收者接收这个广播,就知道系统产生了什么事件.Androi ...

  6. Android 四大组件之再论service

    service常见的有2种方式,本地service以及remote service. 这2种的生命周期,同activity的通信方式等,都不相同. 关于这2种service如何使用,这里不做介绍,只是 ...

  7. Android四大组件及activity的四大启动模式

    Android四大组件 1. 广播接收者的两种类型: (1)系统广播接收者,就是继承BroadcastReceiver这个类,然后还要在清单文件中注册,注册之后给他一个action.当系统发生了这个a ...

  8. Android成长日记-Android四大组件之Service组件的学习

    1.什么是Service? Service是Android四大组件中与Activity最相似的组件,它们都代表可执行的程序,Service与Activity的区别在于:Service一直在后台运行,它 ...

  9. Android四大组件之Activity(活动)及其布局的创建与加载布局

    Android四大组件之Activity(活动)及其布局的创建与加载布局 什么是Activity ? 活动(Activity)是包含用户界面的组件,主要用于和用户进行交互的,一个应用程序中可以包含零个 ...

  10. Android四大组件之——Activity的生命周期(图文详解)

        转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:JohnTsai.Work@gmail.com       [Andro ...

随机推荐

  1. 使用这些高效Java工具类享受开发乐趣

    使用这些高效Java工具类享受开发乐趣导语在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.在开发中,使用这些工具类,不仅可以提高编码效率,还可以提高 ...

  2. python库之-------Pandas

    包括两个数据结构:DataFrame和Series 官方文档地址: pandas https://pandas.pydata.org/pandas-docs/stable/index.html ser ...

  3. Contig|scaffold|N50|L50|NG50|贪心算法|de bruiji graph|

    生物信息学 Contig是reads拼成的连续的DNA片段,连续表达一个gene.通过双端测序的contig可确定contig之间的关系得到scaffold,Scaffold是reads拼成的有gap ...

  4. elasticsearch5.4安装

    1.从官网下载ES 安装包: elasticsearch-.tar.gz 2.解压到要安装的目录 注意:一定要切换用户,不能用root用户解压,不能用root用户启动 tar -zxvf elasti ...

  5. 点分治——POJ 1741

    写的第一道点分治的题目,权当认识点分治了. 点分治,就是对每条过某个点的路径进行考虑,若路径不经过此点,则可以对其子树进行考虑. 具体可以看menci的blog:点分治 来看一道例题:POJ 1741 ...

  6. Java 的 LinkedList 的底层数据结构

    1. 数据结构--LinkedList源码摘要 public class LinkedList<E> extends AbstractSequentialList<E> imp ...

  7. JavaScript学习总结(七)Ajax和Http状态字

    转自:http://segmentfault.com/a/1190000000691919 Ajax及其工作原理 AJAX 是一种与服务器交换数据无需刷新网页的技术,最早由Google公司在谷歌地图里 ...

  8. Django中查询相关操作

    查询集特性 1)惰性查询:只有在实际使用查询集中的数据的时候才会发生对数据库的真正查询. 2)缓存:当使用的是同一个查询集时,第一次使用的时候会发生实际数据库的查询,然后把结果缓存起来,之后再使用这个 ...

  9. MongoDB的初级安装和使用

    对于非关系型数据库,很多人不是很清楚,我也是作为新手慢慢摸索, 外网地址下载贼慢:我烦放在自己的百度网盘里 软件链接:https://pan.baidu.com/s/1A7h4VOfvm8N2gnlJ ...

  10. 将配置好的虚拟机文件导入VMware

    第一步:打开VMware Workstation Pro 第二步:  选择文件,图示: 第三步:点击打开,选择配置好的虚拟机文件目录 点击打开就ok了,图示