zoukankan      html  css  js  c++  java
  • 【Android】四大组件归纳总结

    随着学习持续更新

    四大组件均可使用android:process="name"在Manifest中声明成独立进程

    Activity

    生命周期

    image-20200122100121384

    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对应用中的数据进行增删改查。

    也可以进行进程间数据的交互和共享,跨进程通信。

  • 相关阅读:
    java wait 与 notify sleep
    java线程安全总结
    ubuntu安装遇到的问题
    python时间处理函数
    js获取当前时间
    sql如何将同个字段不同值打印在一行
    django models数据类型
    django上传图片和文字记录
    django form使用学习记录
    django中request对象详解(转载)
  • 原文地址:https://www.cnblogs.com/y4ngyy/p/12496745.html
Copyright © 2011-2022 走看看