Android 四大组件

文章目录

一、Activity 活动

在Android中,用户与程序的交互是通过Activity完成的,activity负责管理应用程序的用户界面。

Activity是Android程序中的四大组件之一,为用户提供可视化界面及操作。一个应用程序通常包含多个Activity,每个Activity负责管理一个用户界面。这些界面可以添加多个控件,每个控件负责实现不同功能。

Activity是一个应用程序的组件,他在屏幕上提供了一个区域,允许用户在上面做一些交互性的操作, 比如打电话,照相,发送邮件,或者显示一个地图!Activity可以理解成一个绘制用户界面的窗口, 而这个窗口可以填满整个屏幕,也可能比屏幕小或者浮动在其他窗口的上方!

1. Activity的创建

(1). Android studio创建Activity

在这里插入图片描述
创建Activity之后,重写oncreat()方法

注意:

  • 在Android中创建四大组件都需要在AndroidManifest.xml文件中注册

  • 创建完之后,Android studio会自动在AndroidManifest.xml文件中注册

      会自动添加一行 <activity android:name=".MainActivity">
    

(2). Activity使用流程

在这里插入图片描述

  • 注:可以继承Activity和AppCompatActivity,只不过后者提供了一些新的东西而已! 另外,切记,Android中的四大组件,只要你定义了,无论你用没用,都要在AndroidManifest.xml对 这个组件进行声明,不然运行时程序会直接退出,报ClassNotFindException…

2. Activity的生命周期

Activity的生命周期包含5种状态,涉及7中方法。

(1). 生命周期的状态

是一个Activity从创建到销毁的全过程,分为以下5个状态
在这里插入图片描述

1. 启动状态
2. 运行状态
3. 暂停状态
4. 停止状态
5. 销毁状态

(2). 生命周期的方法

在这里插入图片描述

1. onCreate()方法
2. onStart()方法
3. onResume()方法

运行(过渡)

4. onPause()方法

暂停

5. onStop()方法
6. onDestroy()方法
7.onRestart()方法

从停止状态到再次启动状态

3. Activity的启动模式

Activity是可以层叠摆放的,每启动一个新的Activity就会覆盖在原Activity上,如果单击返回按钮,最上面的Activity被销毁,下面的Activity重新显示。
原因是:Android系统同任务栈来管理Activity实例。
在这里插入图片描述

(1). Android任务栈

栈数据结构:先进先出
在Android中采用任务栈形式管理Activity。

通常一个应用程序对应一个任务栈,默认情况下每启动一个Activity都会入栈,并处于栈顶位置,用户操作的永远是栈顶的Activity。

  • Activity启动时压入栈
  • 用户单击返回弹出栈
    在这里插入图片描述

(2). Activity的四种启动模式

1. standard 模式

是Activity的默认启动模式,这模式的特点:

  • 每启动一个Activity就会在栈顶创建一个新的实例
    在这里插入图片描述
2. singleTop 模式

判断要启动的Activity实例是否位于栈顶,如果位于栈顶则直接复用,否则创建新的实例。

在这里插入图片描述

3. singleTask 模式

每次启动该Activity时,系统首先会检查栈中是否存在当前Activity实例,如果存在则直接使用,并把当前Activity之上的所有实例全部出栈,否则会重新创建一个实例

在这里插入图片描述

4. singleInstance 模式

指定为singleInstance 模式的Activity会启动一个新的任务栈来管理Activity实例,无论从哪个任务栈中启动该Activity,该实例在整个系统中只有一个。

  • 意义:为了在不同程序中共享同一个Activity实例
    在这里插入图片描述

4. Activity之间的跳转

在Android系统中,每个应用通常都由多个界面组成,每个界面就是一个Activity,在这些界面进行跳转时,实际上也就是Activity之间的跳转,Activity之间挑战需要用到Intent组件,通过Intent可以开启新的Activity实现页面的跳转功能。

根据开启目标组件的方式不同,Intent分类为:

1. 显示意图
  • 明确找的对象
  • 通过组件名指定启动的目标组件,比如startActivity(new Intent(A.this,B.class)); 每次启动的组件只有一个
Intent intent = new Intent(当前Act.this,要启动的Act.class);
startActivity(intent);
2. 隐式意图(隐式启动:通过Intent-filter的Action,Category或data来实现)
  • 模糊不明确对象
  • 不指定组件名,而指定Intent的Action,Data,或Category,当我们启动组件时, 会去匹配AndroidManifest.xml相关组件的Intent-filter,逐一匹配出满足属性的组件,当不止一个满足时, 会弹出一个让我们选择启动哪个的对话框
通过隐式Intent打开百度网页

button.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setAction(intent.ACTION_VIEW);
                intent.setData(Uri.parse("http://www.baidu.com"));
                startActivity(intent);
            }
        });

5. Activity之间的数据传递

Android进行消息传递或数据传递,使用的也是Intent。

  • Intent不仅可以开启Activity、Service、BroadcastReceiver组件,还能在这些组件之间传递数据
    在这里插入图片描述

数据传递也有两种方式:

(1). 数据传递

使用Bundle在Activity之间交换数据
在这里插入图片描述
Bundle是键值对的组合
在这里插入图片描述
在这里插入图片描述

1. 商家配送

放数据
在这里插入图片描述
接受数据,并放到文本框
在这里插入图片描述

2. 中间小哥配送

(2). 数据回传(后一个传回给前一个)

在Activity中,使用Intent既可以将数据传给下一个Activity、还可以将数据回传给上一个Activity
在这里插入图片描述
Activity中提供了一个startActivityForResult(Intent intent,int requestCode)方法,该方法也用于启动Activity,并且这个方法可以在当前Activity销毁时返回一个结果给上一个Activity
在这里插入图片描述
MainActivity
在这里插入图片描述
DetailActivity
在这里插入图片描述

6. 系统给我们提供的常见的Activity

//1.拨打电话
// 给移动客服10086拨打电话
Uri uri = Uri.parse("tel:10086");
Intent intent = new Intent(Intent.ACTION_DIAL, uri);
startActivity(intent);

//2.发送短信
// 给10086发送内容为“Hello”的短信
Uri uri = Uri.parse("smsto:10086");
Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
intent.putExtra("sms_body", "Hello");
startActivity(intent);

//3.发送彩信(相当于发送带附件的短信)
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra("sms_body", "Hello");
Uri uri = Uri.parse("content://media/external/images/media/23");
intent.putExtra(Intent.EXTRA_STREAM, uri);
intent.setType("image/png");
startActivity(intent);

//4.打开浏览器:
// 打开Google主页
Uri uri = Uri.parse("http://www.baidu.com");
Intent intent  = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

//5.发送电子邮件:(阉割了Google服务的没戏!!!!)
// 给someone@domain.com发邮件
Uri uri = Uri.parse("mailto:someone@domain.com");
Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
startActivity(intent);
// 给someone@domain.com发邮件发送内容为“Hello”的邮件
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, "someone@domain.com");
intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
intent.putExtra(Intent.EXTRA_TEXT, "Hello");
intent.setType("text/plain");
startActivity(intent);
// 给多人发邮件
Intent intent=new Intent(Intent.ACTION_SEND);
String[] tos = {"1@abc.com", "2@abc.com"}; // 收件人
String[] ccs = {"3@abc.com", "4@abc.com"}; // 抄送
String[] bccs = {"5@abc.com", "6@abc.com"}; // 密送
intent.putExtra(Intent.EXTRA_EMAIL, tos);
intent.putExtra(Intent.EXTRA_CC, ccs);
intent.putExtra(Intent.EXTRA_BCC, bccs);
intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
intent.putExtra(Intent.EXTRA_TEXT, "Hello");
intent.setType("message/rfc822");
startActivity(intent);

//6.显示地图:
// 打开Google地图中国北京位置(北纬39.9,东经116.3)
Uri uri = Uri.parse("geo:39.9,116.3");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

//7.路径规划
// 路径规划:从北京某地(北纬39.9,东经116.3)到上海某地(北纬31.2,东经121.4)
Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=39.9 116.3&daddr=31.2 121.4");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

//8.多媒体播放:
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.parse("file:///sdcard/foo.mp3");
intent.setDataAndType(uri, "audio/mp3");
startActivity(intent);

//获取SD卡下所有音频文件,然后播放第一首=-= 
Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

//9.打开摄像头拍照:
// 打开拍照程序
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
startActivityForResult(intent, 0);
// 取出照片数据
Bundle extras = intent.getExtras(); 
Bitmap bitmap = (Bitmap) extras.get("data");

//另一种:
//调用系统相机应用程序,并存储拍下来的照片
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
time = Calendar.getInstance().getTimeInMillis();
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment
.getExternalStorageDirectory().getAbsolutePath()+"/tucue", time + ".jpg")));
startActivityForResult(intent, ACTIVITY_GET_CAMERA_IMAGE);

//10.获取并剪切图片
// 获取并剪切图片
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
intent.putExtra("crop", "true"); // 开启剪切
intent.putExtra("aspectX", 1); // 剪切的宽高比为12
intent.putExtra("aspectY", 2);
intent.putExtra("outputX", 20); // 保存图片的宽和高
intent.putExtra("outputY", 40); 
intent.putExtra("output", Uri.fromFile(new File("/mnt/sdcard/temp"))); // 保存路径
intent.putExtra("outputFormat", "JPEG");// 返回格式
startActivityForResult(intent, 0);
// 剪切特定图片
Intent intent = new Intent("com.android.camera.action.CROP"); 
intent.setClassName("com.android.camera", "com.android.camera.CropImage"); 
intent.setData(Uri.fromFile(new File("/mnt/sdcard/temp"))); 
intent.putExtra("outputX", 1); // 剪切的宽高比为12
intent.putExtra("outputY", 2);
intent.putExtra("aspectX", 20); // 保存图片的宽和高
intent.putExtra("aspectY", 40);
intent.putExtra("scale", true);
intent.putExtra("noFaceDetection", true); 
intent.putExtra("output", Uri.parse("file:///mnt/sdcard/temp")); 
startActivityForResult(intent, 0);

//11.打开Google Market 
// 打开Google Market直接进入该程序的详细页面
Uri uri = Uri.parse("market://details?id=" + "com.demo.app");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

//12.进入手机设置界面:
// 进入无线网络设置界面(其它可以举一反三)  
Intent intent = new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS);  
startActivityForResult(intent, 0);

//13.安装apk:
Uri installUri = Uri.fromParts("package", "xxx", null);   
returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri);

//14.卸载apk:
Uri uri = Uri.fromParts("package", strPackageName, null);      
Intent it = new Intent(Intent.ACTION_DELETE, uri);      
startActivity(it); 

//15.发送附件:
Intent it = new Intent(Intent.ACTION_SEND);      
it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");      
it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/eoe.mp3");      
sendIntent.setType("audio/mp3");      
startActivity(Intent.createChooser(it, "Choose Email Client"));

//16.进入联系人页面:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(People.CONTENT_URI);
startActivity(intent);

//17.查看指定联系人:
Uri personUri = ContentUris.withAppendedId(People.CONTENT_URI, info.id);//info.id联系人ID
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(personUri);
startActivity(intent);

7. Fragment(碎片)

让程序更加合理的利用屏幕空间
在这里插入图片描述

(1). Fragment的生命周期

在这里插入图片描述

(2). 创建Fragment

(3). 在Activtiy中添加Fragment

1. 直接在布局文件中添加Fragment
2. 当Activity运行时添加Fragment

二、BroadcastReceiver 提供广播接收器

1. 广播接受者简介

2. 广播接受者入门

3. 自定义广播

4. 广播的类型

三、Service 服务

1. 服务的创建

2. 服务的生命周期

3. 服务的启动方式

4. 服务的通信

四、ContentProvider 内容提供者

  • Android四大组件之一,主要用于应用程序之间的数据交换,它可以将自己的数据共享给其他应用程序使用

1. 内容提供者简介

2. 内容提供者的创建

3. 内容提供者的使用

4. 内容观察者的使用

五. Intent(意图)

1. Intent简介

四大组件间的 枢纽——Intent(意图),Android通信的桥梁
在这里插入图片描述
Intent叫意图,是程序中各组件之间的交互方式,可以指定当前组件要执行的动作,还可以在不同组件之间进行数据传递。
一般用于启动Activity、Service、发送广播
在这里插入图片描述

2. Intent对象的属性

在这里插入图片描述

(1). Component Name属性

从MainActivity跳转到DetailActivity
在这里插入图片描述

public class MainActivity extends AppCompatActivity {
    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.qqlogin);

        button=(Button) findViewById(R.id.btn_one);
        button.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                ComponentName componentName = new ComponentName("com.pudding.hellow","com.pudding.DetailActivity");
                intent.setComponent(componentName);
                startActivity(intent);
            }
        });
    }
}

(2). Action和Data属性

在这里插入图片描述
之后还有在AndroidManifest设置Android权限

(3). Action和Category

在这里插入图片描述

(4). Extras属性

多个Activity之间进行交换数据

(5). Flags属性

3. Intent的种类

(1). 显式Intent

在这里插入图片描述

  • 直接指定目标组件的名称
  • 多用于在应用程序内部传递信息

(2). 隐式Intent

在这里插入图片描述

  • 不会用组件名称定义要激活的目标组件
  • 多用于在不同应用程序之间传递消息

4. Intent过滤器

在这里插入图片描述

通过<intent-filter>标记在AndroidManifest.xml文件中配置

在这里插入图片描述

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值