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中一种跨程序共享数据的重要组件。

  • 相关阅读:
    Bootstrap 网页乱码
    西游记人物
    球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
    利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
    s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由用户控制。
    实现判断字符串的开头和结尾
    值类型和引用类型
    随机生成4位验证码
    实现 从1-36中随机产生6个不重复的中奖号码
    冒泡排序
  • 原文地址:https://www.cnblogs.com/123blog/p/12589679.html
Copyright © 2011-2022 走看看