详解Android的四大应用程序组件

Android的一个核心特性就是一个应用程序可作为其他应用程序中的元素,可为其他应用程序提供数据。例如,如果程序需要用某些控件来加载一些图片,另一个程序已经开发出了此项功能,且可供其他程序使用,就可以直接使用跨进程通信方式调用那个程序的功能,而不是自己再开发一个。为了实现这样的功能,Android系统必须能够在需要应用程序中的任何一部分时启动它的进程,并且实例化那部分的Java对象。所以,不像大多数其他系统中的程序,Android程序不是只有单一的进入点,而是它们拥有系统实例化和运行必须的组件,Android中提供了4大组件;Android中的四大组件除了BroadcastReceiver之外,Activity、Service、ContentProvider都要必须在AndroidManifest.xml中注册,而BroadcastReceiver可以在AndroidManifest.xml文件中注册,也可以在Java代码或者kotlin代码中注册;在Android 8.0后,在AndroidManifest.xml文件中静态注册广播接收失效,是因为官方对耗电量的优化,避免APP滥用广播的一种处理方式。

1、Activity

Activty是一种展示型组件,Activity为用户提供了一个可视的用户界面。例如,一个拨打电话程序可能有一个Activity用来显示可以拨打电话的联系人,第二个Activity用来新建联系人写信息,其他的Activity用来查看具体的联系人,或者更改联系人信息,虽然应用程序中的各个Activity所提供的用户界面聚合性很强,但是每个Activity都独立于其他的Activity,每一个实例化的Activity都是Activity的子类,Intent可触发了Activity的启动,Intent可分为显式Intent触发和隐式Intent触发;显式Intent触发可明确的指向Activity组件,用如下代码表示:

 Intent in = new Intent(this,SecondActivity.class)
 MainActivity.this.startActivity(in)

隐式Intent触发是指向一个或者2个以上的Activity的目标组件,它也可以没有目标Activity,它的隐式触发用如下代码表示:

Intent intent = new Intent();
intent.setPackage("com.xe.launchmode");
intent.setAction("com.xe.actoin.MAP");
intent.addCategory("android.intent.category.APP_MAPS");
MainActivity.this.startActivity(intent);

2、Service

Service是一种后台处理任务型组件,它一直在后台运行,用于后台处理一系列的计算任务或者处理其他事情的时候播放背景音乐等,每个service都扩展自Service类;Service组件和Activity组件的开启是不同的,Activity只有一种启动状态,用如下代码表示:

Intent in = new Intent(this,SecondActivity.class)
startActivity(in)

而Service的开启却有2种,当处于启动状态时,它可以做一些后台任务,不需要和用户界面交互,它的生命周期和应用程序一样长,多媒体播放器播放音乐是应用Service的一个非常好的例子。多媒体播放器程序可能包含一个或者多个Activity,用户通过这些Activity选择并播放音乐。然而音乐回放并不需要一个Activity来处理,因为用户可能会希望音乐一直播放下去,即使退出了播放器去执行其他应用程序也不停止。为了让音乐一直播放,多媒体播放器Activity可能会启动一个Service在后台播放音乐。Android系统会使音乐回放Service一直运行,即使在启动这个Service的Activity退出之后。它的启动可用如下代码表示:

Intent in = new Intent(this,SecondActivity.class)
MainActivity.this.startService(in)

当它处于绑定状态时,它即可以做一些后台任务,也可以和用户界面做交互,它的生命周期和用户界面一样长,它的绑定可用如下代码表示:

ServiceConnection mBinderPoolConnection = new ServiceConnection() {
  @Override
  public void onServiceConnected(ComponentName name, IBinder service) {

  }

  @Override
  public void onServiceDisconnected(ComponentName name) {

  }
 };

Intent intent = new Intent(mContext, MyService.class);
MainActivity.this.bindService(intent,new ServiceConnection(),Context.BIND_AUTO_CREATE);

以上2中开启,不管是哪一种都不可以直接在Service中做耗时操作,因为它是运行在主线程中的,如果非要做耗时操作,应该开一个工作线程给它去执行。

3、BroadcastReceiver

一般不执行任何任务,仅仅是接收并相应广播通知一类的组件。大部分广播通知是由系统产生的,例如改变时区、闹钟提醒、用户选择了一幅图片或者用户改变了语言首选项。应用程序同样也可以发送广播通知,例如通知其他应用程序某些数据已经下载到设备上可以使用;一个应用程序的BroadcastReceiver来响应它的通知,所有的BroadcastReceiver的实现类都扩展自BroadcastReceiver类。BroadcastReceiver适合用于不同的组件以及不同的进程之间进行通信,它是没有用户界面的,是因为它在系统内部工作。下面介绍它的2种注册方式,首先是静态注册,它是在AndroidManifest.xml文件中完成的,安装应用时会被应用解析,不启动应用也能接收广播,用如下监听wifi状态改变的代码表示:

<receiver android:name=".myapplication.receiver.WifiReceiver">
 <intent-filter>
   <action android:name="android.net.wifi.RSSI_CHANGED" />
   <action android:name="android.net.wifi.STATE_CHANGE" />
   <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
  </intent-filter>
</receiver>

从以上代码可以发现,接收过程的匹配是通过<intent-filter>来描述的,可以总结出广播是一个低耦合的观察者模式这样的结论。
另外一种方式就是动态注册,需要启动应用程序才可以接收到广播,是通过在Java代码中完成注册的,用如下代码表示它的动态注册:

public class MyBroadcastReceiver extends BroadcastReceiver{
  @Override
  public void onReceive(Context context, Intent intent){

  }
 }

 MyBroadcastReceiver receiver = new MyBroadcastReceiver();
 IntentFilter filter=new IntentFilter();
 filter.addAction("com.xe.intent.action.ACTION_1");
 filter.addAction("com.xe.intent.action.ACTION_2");
 SecondActivity.this.registerReceiver(receiver,filter);

发送广播可用如下代码来实现:

Intent intent = new Intent();
intent.setAction("com.xe.intent.action.ACTION_2");
MainActivity.this.sendBroadcast(intent);

以上2种广播的注册方式中广播的接收是不可以做耗时操作的,因为接收广播的方法是在主线程中被调用的。

4、ContentProvider

ContentProvider是一种共享数据型组件,应用程序可以通过ContentProvider来访问其他应用程序的数据,包括其他应用程序的私有数据;和Service一样,它是没有用户界面的,它的内部需要实现insert、update、delete和query方法,它在内部使用一份数据集合并且对数据集合没有要求。ContentProvider是跨进程通信的,当Android系统收到一个需求某个组件进行处理的请求的时候,Android会确保处理此请求的组件的宿主进程是否已经在运行,如果没有,则立即启动这个进程。ContentProvider是提供一个外部接口ContentResolver给其他进程访问数据的,下面一部分代码简单的表示query方法的使用过程:

Uri bookUri = Uri.parse("content://com.zyb.provider/data");
ContentResolver cr = ContentProviderActivity.this.getContentResolver();
Cursor bookCursor = cr.query(bookUri,new String[]{"_id","name"},null,null,null);
while (bookCursor.moveToNext()) {
 int id = bookCursor.getInt(0);
 String name = bookCursor.getString(1);
}

以上代码,首先要创建要访问数据的Uri,然后通过应用程序获取ContentResolver接口,通过该接口获取数据集合Cursor对象,最后通过Cursor对象查找索引获取到最终所需的数据。好了,本章内容就写到这里,由于本人技术有限,文章难免会出现错误,还望批评指正;后面我会找个时间写一下Android四大组件工作过程的源码分析,谢谢大家的阅读。

以上就是详解Android的应用程序组件的详细内容,更多关于Android 应用程序组件的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android的Service应用程序组件基本编写方法

    Service是什么 Service是一个android 系统中的应用程序组件,它跟Activity的级别差不多,但是他没有图形化界面,不能自己运行,只能后台运行,并且可以和其他组件进行交互如更新ContentProvider,Intent以及系统的通知等等.其启动方式有两种:context.startService() 和 context.bindService().Service通常用来处理一些耗时比较长的操作. Service的编写 创建一个类(这里为FirstService)继承andr

  • Android ListView UI组件使用说明

    一.ListView 该组件是android中最常用的一个UI组件,用于实现在屏幕上显示​多个内容,以便于我们用手指来回翻转. 先在layout中进行布局我们的组件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent

  • Android中butterknife的使用与自动化查找组件插件详解

    前言 Android开发中经常使用findViewById来获取控件然后进行一些列操作,当控件太多的时候代码就非常臃肿,今天就来学习一个新的开源库ButterKnife,真的可以帮助我们高效,快捷的开发,让我们的代码更加简洁. 首先我们来把ButterKnife集成在我们的项目中:ButterKnife的GitHub官方地址:github.com/JakeWharton- 一.集成分为了两部分: 1.仅仅在App主工程使用: 在App的 build.gradle 中添加如下代码: android

  • Android Jetpack架构组件 ViewModel详解

    前言 前面两篇文章我们已经学习了Lifecycle和DataBind,本篇文章我们来学习Jetpack系列中比较重要的ViewModel,Jetpack的很多很多组件都是搭配使用的,所以单独的知识点可能会有些"无意义"但却是我们项目实战的基础! ViewModel的使用 ViewModel类旨在以注重生命周期的方式存储和管理界面相关的数据.ViewModel类让数据可在发生屏幕旋转等配置更改后继续存在.这句话很好理解,还记得我们在讲解Lifecycle的时候 举的例子吗,我们还是使用那

  • android自定义组件实现仪表计数盘

    前几天开发公司项目,有个地方要做一个分数的仪表盘,根据分数跑分,(设计的人估计是看到招商银行App的账号总览) 网上好像找不到类似的组件,那就只能自己开发啦.趁着空余时间,把组件进行了一些改进,并封装成依赖库,分享给大家 效果展示 一款颜色,文字弧度大小,仪表角度都可以自定义的组件 项目集成:MeterView 项目目录-->build.gradle allprojects { repositories { ... maven { url 'https://jitpack.io' } } } a

  • Android列表组件ListView使用详解之动态加载或修改列表数据

    在使用ListView组件来显示列表数据时,有的时候我们需要改变列表中的数据,有以下方法: 1.重新给ListView组件设置适配器 这种方法重新创建了ListView,效率不好. 2.使用适配器中的方法 /** * Notifies the attached observers that the underlying data has been changed * and any View reflecting the data set should refresh itself. */ pu

  • Android应用程序四大组件之使用AIDL如何实现跨进程调用Service

    一.问题描述 Android应用程序的四大组件中Activity.BroadcastReceiver.ContentProvider.Service都可以进行跨进程.在上一篇我们通过ContentProvider实现了不同应用之间的跨进程调用,但ContentProvider主要是提供数据的共享(如sqlite数据库),那么我们希望跨进程调用服务(Service)呢?Android系统采用了远程过程调用(RPC)方式来实现.与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言

  • Android框架组件Lifecycle的使用详解

    1.前言 Lifecycle是Google推出的一系列的框架组件的其中一个,主要是用来感知Activity和Fragment的生命周期. 本文主要介绍如何使用Lifecycle. 2.一个常见的开发例子 public class TestActivity extends Activity{ @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceSta

  • Android四大组件之Service详解

    一.Service简介 Service是Android程序中四大基础组件之一,它和Activity一样都是Context的子类,只不过它没有UI界面,是在后台运行的组件. Service是Android中实现程序后台运行的解决方案,它非常适用于去执行那些不需要和用户交互而且还要求长期运行的任务.Service默认并不会运行在子线程中,它也不运行在一个独立的进程中,它同样执行在UI线程中,因此,不要在Service中执行耗时的操作,除非你在Service中创建了子线程来完成耗时操作. 二.Serv

  • Android开发中Button组件的使用

    前言 安卓系统中,Button是程序和用户进行交互的一个重要控件,今天我们就来简单的对Button进行学习,其中Button组件是文本按钮(继承自TextView),而ImageButton是图像按钮(继承自ImageView).两者之间的区别在于: 1.Button即可显示文本也可显示图形(通过设置背景图),而ImageButton只能显示图形不能显示文本: 2.Button可在文本周围区域显示小图,而ImageButton无法在某个区域显示小图: 3.ImageButton上的图像可按比例进

  • Android开发之组件GridView简单使用方法示例

    本文实例讲述了Android开发之组件GridView简单使用方法.分享给大家供大家参考,具体如下: 案例:简单的图片浏览器,保存图片到相册 保存图片到相册 方法代码:https://www.jb51.net/article/158668.htm 废话不多说先上效果: 具体实现: 首先是布局文件: 1.一个GridView(展示所有的图片) 2.一个ImageView(放选中的图片) <?xml version="1.0" encoding="utf-8"?&

  • Android UI新组件学习和使用

    今天来学习总结一下,Android 后添加的一些新的组件和UI效果,Material Dialog,SwipeRefreshLayout,ListPopupWindow,PopupMenu等. Material Dialog 你还在为使用 Material Dialog 去引用第三方的library包么?现在告诉你一个好消息,其实Android 在V7包里面已经实现了 Material 风格的对话框,并且兼容到底版本了.你只需要在你的代码中使用V7中的Dialog即可实现以上图片效果了.代码如下

随机推荐