zoukankan      html  css  js  c++  java
  • Android基础之四大组件

    Android中称为四大组件的为别为:Activity/Service/BroadCast Recevicer/Content  provider。下面就各解释一下。

     
    1. 1

      activity 显示界面

      service 服务 

      Broadcast Receiver 广播 

      Content Provider  数据通信

    2. 2

      Activity:activity是用户和应用程序交互的窗口,一个activity相当于我们实际中的一个网页,当打开一个屏幕时,之前的那一个屏幕会被置为暂停状态,并且压入历史堆栈中,用户可以通过回退操作返回到以前打开过的屏幕。activity的生命周期:即“产生、运行、销毁”,但是这其中会调用许多方法onCreate(创建) 、onStart(激活) 、onResume(恢复) 、onPause(暂停) 、onStop(停止) 、onDestroy(销毁) 、onRestart(重启)。

      Activity的四种启动模式

      Activity有四种启动模式 standard,singleTop,singleTask,singleInstance,这四种模式我们可以在清单文件的<Activity节点下通过android:launchMode来进行配置

      • standard模式:在这种模式下,activity默认会进入启动它的activity所属的任务栈中。这也是默认的一种模式
      • singleTop模式:栈顶复用模式。如果新activity位于任务栈的栈顶的时候,activity不会被重新创建,同时它的onNewIntent方法会被回调。
      • singleTask模式:栈内复用模式。只要activity在一个栈中存在,那么多次启动此activity不会被重新创建单例,系统会回调onNewIntent。这种模式可以称为单例模式,只会存在一种,有则直接从栈中调用,没有则创建并且压入栈中
      • singleInstance模式:单实例模式。这种模式的activity只能单独地位于一个任务栈中,这种与singleTask有点类似,其实也是有则直接调用,没有则创建并且放入栈中,只不过singleTask是可以和其他的Activity放在同一个栈中,singleInstance则是只会将创建的Activity放在一个栈中,并且这个栈中只会有这一个Activity实例。
    3. 3

      Service:Service是一种程序,它可以运行很长的时间,相当于后台的一个服务,通过startService(Intent service)可以启动一个Service,通过Context.bindService()可以绑定一个Service。

      Service分为两种,一种是Service(这一种是运行在主线程中的,如果要执行耗时操作,可在service中创建一个异步来执行),一种是IntentService(这是一种异步服务,是继承于Service的子类),所以推荐当要执行耗时操作时使用IntentService,如果不耗时,我们可以使用Service

      Service

      Service的两种启动方式

      1. 通过start方法开启服务
      • 创建一个类继承Service
      import android.app.Service;
      import android.content.Intent;
      import android.os.IBinder;
      
      public class MyService extends Service {
          public MyService() {
          }
      
          @Override
          public IBinder onBind(Intent intent) {
              // TODO: Return the communication channel to the service.
              throw new UnsupportedOperationException("Not yet implemented");
          }
      }
      
      • 在清单文件中注册这个服务
         <service
                  android:name=".MyService"
                  android:enabled="true"
                  android:exported="true"></service>
      
      • 通过startService方法启动服务
         Intent intent = new Intent(this, MyService.class);
         startService(intent);
      
      • 当不用服务的时候通过stopService()方法停止该服务
      stopService(intent);
      

      特点: 通过start方法启动的service一旦服务开启就跟调用者(开启者)没有任何关系了。开启者退出了,开启者挂了,服务还在后台长期的运行,开启者不能调用服务里面的方法。

      1. 通过bind的方式启动服务
      • 创建一个类继承Service
      import android.app.Service;
      import android.content.Intent;
      import android.os.IBinder;
      
      public class MyService extends Service {
          public MyService() {
          }
      
          @Override
          public IBinder onBind(Intent intent) {
              // TODO: Return the communication channel to the service.
              throw new UnsupportedOperationException("Not yet implemented");
          }
      }
      
      • 在清单文件中注册这个服务
         <service
                  android:name=".MyService"
                  android:enabled="true"
                  android:exported="true"></service>
      
      • 通过startService方法启动服务
         Intent intent = new Intent(this, MyService.class);
         bindService(Intent,ServiceConnection,int);
      
      • 当不用服务的时候通过stopService()方法停止该服务
      unbindService(ServiceConnection);
      

      特点:使用bind方法启动的服务,则调用者挂了,服务也挂了,调用者可以调用服务中的方法

      远程服务

      调用者与Service不在同一个进程,这是一种跨进程通信的方式Android绑定远程服务

      步骤:

      • 在服务的内部创建一个内部类,提供一个方法,可以间接调用服务的方法
      • 把暴露的接口文件的扩展名改为.aidl文件 去掉访问修饰符
      • 实现服务的onbind方法,继承Bander和实现aidl定义的接口,提供给外界可调用的方法
      • 在activity 中绑定服务。bindService()
      • 在服务成功绑定的时候会回调 onServiceConnected方法 传递一个 IBinder对象
      • aidl定义的接口.Stub.asInterface(binder) 调用接口里面的方法

      IntentService

      这个Service在上面也说过,是一个异步服务
      IntentService特征:

      • 会创建独立的worker线程来处理所有的Intent请求;
      • 会创建独立的worker线程来处理onHandleIntent()方法实现的代码,无需处理多线程问题;
      • 所有请求处理完成后,IntentService会自动停止,无需调用stopSelf()方法停止Service;
      • 为Service的onBind()提供默认实现,返回null;
      • 为Service的onStartCommand提供默认实现,将请求Intent添加到队列中;

      BroadcastReceiver

      广播分为两种,一种是普通广播,或者称为无序广播,另一种是有序广播

      无序广播与有序广播

      无序广播是完全异步的,在同一时刻在逻辑上是能够被所有的接收者接收到的,传递的效率高,缺点是接收者不能处理结果传给下个接收者,并且无法终止广播的传播(其实有序广播就是和这个相反的,有顺序的传播,两个广播的定义就是完全相反的,这个比较好记)

      Context.sendBroadcast()
      发送的是普通广播,所有订阅者都有机会获得并进行处理。
      

      广播的生命周期就是在处理完onReceive时,系统将认定他不是一个活动的对象了,就是杀掉他,由于广播的生命周期很短,所以不建议在onReceive中执行一些耗时操作

      创建一个广播的步骤:

      • 创建一个类继承BroadcastReceiver,并且重写其onReceive方法
      public class MyBroadcastReceiver extends BroadcastReceiver {
      
          @Override
          public void onReceive(Context context, Intent intent) {
              Log.i("fuck","intent-action : " + intent.getAction());
              if(intent.getAction().equals("test")){
                  Toast.makeText(context,"fuck",Toast.LENGTH_LONG).show();
              }
          }
      
      }
      
      • 在清单文件中注册(静态注册)
           //广播接收器
              <receiver android:name=".broadcast.MyBroadcastReceiver">
      
                  <intent-filter>
                      <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
                      <action android:name="test"/>//这里自定义一个广播动作
                  </intent-filter>
      
              </receiver>
      

      或者动态注册

      registerReceiver(new MyBroadcastReceiver(),new IntentFilter("test"));
      
      
      • 加上权限
      <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
      
      
      • 发送广播
       Intent intent = new Intent("test");
       sendBroadcast(intent);
      

      静态注册和动态注册区别

      动态注册广播不是常驻型广播,也就是说广播跟随activity的生命周期。注意: 在activity结束前,移除广播接收器。
      静态注册是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。

      • 当广播为有序广播时:
      1. 优先级高的先接收
      2. 同优先级的广播接收器,动态优先于静态
      3. 同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后注册的。
      • 当广播为普通广播时:
      1. 无视优先级,动态广播接收器优先于静态广播接收器
      2. 同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后注册的。

      Service小结:

      • 在Android 中如果要发送一个广播必须使用sendBroadCast 向系统发送对其感兴趣的广播接收器中。
      • 使用广播必须要有一个intent 对象必设置其action动作对象
      • 使用广播必须在配置文件中显式的指明该广播对象
      • 每次接收广播都会重新生成一个接收广播的对象
      • 在BroadCastReceiver中尽量不要处理太多逻辑问题,建议复杂的逻辑交给Activity 或者 Service 去处理
      • 如果在AndroidManifest.xml中注册,当应用程序关闭的时候,也会接收到广播。在应用程序中注册就不产生这种情况了。


    4. 4

      BroadCast Recevicer:接受一种或者多种Intent作触发事件,接受相关消息,做一些简单处理,转换成一条Notification,统一了Android的事件广播模型。可以使用BroadcastReceiver来让应用对外一个外部的事件作出响应。Broadcast Receiver通过NotificationManager来通知用户这些事情发生了,BroadcastReceiver注册的有两种方式,一种是可以在AndroidManifest.xml中注册,另一种可以在运行时的代码中使用Context.registerReceiver()进行注册。用户还可以通过Context.sendBroadcast()将他们自己的intent broadcasts广播给其他的应用程序。

       
       
    5. 5

      Content provider:内容提供者,可通过它来共享自己的数据给外部调用,给第三方应用提供数据访问的接口。

      contentprovider是android四大组件之一的内容提供器,它主要的作用就是将程序的内部的数据和外部进行共享,为数据提供外部访问接口,被访问的数据主要以数据库的形式存在,而且还可以选择共享哪一部分的数据。这样一来,对于程序当中的隐私数据可以不共享,从而更加安全。contentprovider是android中一种跨程序共享数据的重要组件。

  • 相关阅读:
    Jmeter之http性能测试实战 非GUI模式压测 NON-GUI模式 结果解析TPS——干货(十一)
    UI Recorder 自动化测试 回归原理(九)
    UI Recorder 自动化测试 录制原理(八)
    UI Recorder 自动化测试 整体架构(七)
    UI Recorder 自动化测试 配置项(六)
    UI Recorder 自动化测试 工具栏使用(五)
    UI Recorder 自动化测试 回归测试(四)
    UI Recorder 自动化测试 录制(三)
    UI Recorder 自动化测试工具安装问题疑难杂症解决(二)
    UI Recorder 自动化测试安装教程(一)
  • 原文地址:https://www.cnblogs.com/123blog/p/12589679.html
Copyright © 2011-2022 走看看