2021-08-31

Activity的基本概述

Activity是什么?

Activity是Android组件中最基本也是最为常见用的四大组件(Activity,Service服务,ContentProvider内容提供者,BroadcastReceiver广播接收器)之一。
2.Activity是一个应用程序组件,提供一个屏幕(即用户看到的手机页面就是一个Activity),用户可以用来交互为了完成某项任务。
3.Activity中所有操作都与用户密切相关,是一个负责与用户交互的组件,可以通过setContentView(View)来显示指定控件。
4.在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。

怎么配置Activity?
在AndroidManifest.xml中配置Activity
name:指定该Activity实现类的类名,如图name=“.MainActivity”该类继承了Activity
icon:指定该Activity对应的图标
label:指定该Activity对应的标签
exported:指定该Activity是否允许被其他应用调用。设置为true时可被调用
launchMode:指定该Activity的加载模式,该属性支持standard、singleTop、singleTask和singleInstance四种加载模式
Intent-filter:可为程序配置主Activity作为程序的入口,用于指定该Activity可响应的Intent。
在这里插入图片描述

Activity的使用
实际应用中,不同的 Activity 为用户提供不同的操作界面。一个 Android 应用中多个 Activity 组成 Activity 栈,当前活动的 Activity 位于栈顶。
建立 Activity 需要继承 Activity 基类,还继承了Context、ContextWrapper、ContextThemeWrapper 等基类。preferenceActivity 为 Activity 提供选项设置列表的布局文件。
Fragment拥有自己的生命周期,必须被嵌入到 Activity 中使用,生命周期受到 Activity 的控制。其特点如下:
1,总是作为 Activity 界面的组成部分,
2,一个 Activity 可以组合多个 Fragment
同理一个 Fragment 可以被多个 Activity 复用。
3,可以响应自己的输入事件,拥有自己的生命周期,但是受到 Activity 的控制。

Activity的生命周期
Activity的基本生命周期如右图所示
activity的四个状态
关于activity的四个状态:
running-poused-stopped-killed

  1. running->当前显示在屏幕的activity(位于任务栈的顶部),用户可见状态。
  2. poused->依旧在用户可见状态,但是界面焦点已经失去,此Activity无法与用户进行交互。
  3. stopped->用户看不到当前界面,也无法与用户进行交互 完全被覆盖.
  4. killed->当前界面被销毁,等待这系统被回收
    在这里插入图片描述
    由上图我们得知:
    Starting ——–>Running 所执行的生命周期顺序 onCreate()->onstart()->onResume()
    当前称为活动状态(Running),此activity所处于任务栈的top中,可以与用户进行交互。
    Running ——>Paused 所执行Activity生命周期中的onPause()
    当前称为暂停状态(Paused),该Activity已失去了焦点但仍然是可见的状态(包括部分可见)。
    Paused ——>Running所执行的生命周期为:OnResume()
    当前重新回到活动状态(Running),此情况用户操作home键,然后重新回到当前activity界面发生。
    Paused ——>Stoped所执行的生命周期为:onStop()
    该Activity被另一个Activity完全覆盖的状态,该Activity变得不可见,所以系统经常会由于内存不足而将该Activity强行结束。
    Stoped——>killed所执行的生命周期为:onDestroy()
    该Activity被系统销毁。当一个Activity处于暂停状态或停止状态时就随处可能进入死亡状态,因为系统可能因内存不足而强行结束该Activity。
    注:还有一种情况由于系统内存不足可能在Paused状态中直接被系统杀死达到killed状态。

Activity的四种加载模式
1.standard:标准模式,默认加载模式。
每次启动目标Activity总会创建一个新实例,并把该实例添加到当前Task栈中,他们所在的TaskID总是相同的,不会使用全新的Task。
2.singleTop:Task栈顶单例模式。
类似于standard每次启动船舰一个新实例添加在当前Task栈中,不同则是当前Task栈顶存在要启动的目标Activity时(用户当前看到的Activity即是要启动的Activity),可直接复用该实例。
3.singleTask:Task内单例模式。
在同一个Task中只能有同一个Activity实例,存在三种情况

  1. 要启动的目标Avtivity不存在:创建新实例放于Task栈顶
  2. 要启动的目标Avtivity存在且在Task栈顶:直接启动目标Activity(同singleTop模式)
  3. 要启动的目标Avtivity存在且不在Task栈顶:移出目标Activity顶上的Activity,再启动目标Activity。
    4.singleInstance:全局单例模式。
    使用全新的Task栈来加载目标Activity,只会创建一次目标Activity实例。存在两种情况
  4. 目标Activity不存在,会创建一个全新的Task,再创建目标Activity加入到Task栈顶
    目标Activity已经存在,会把该Avtivity所在的Task转到前台,使其显示出来。
    注:Activity任务的执行是通过解析Task栈的形式执行任务。

Android的Intent总结
Intent机制是用来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。
Intent不仅可用于应用程序之间,也可用于应用程序内部的 Activity / Service之间的交互。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
在这里插入图片描述
Intent是一个将要执行的动作的抽象的描述,一般来说是作为参数来使用,由 Intent来协助完成 Android各个组件之间的通讯。比如说调用startActivity()来启动一个Activity,或者由broadcaseIntent()来传递给所有感兴趣的BroadcaseReceiver,再或者由startService() / bindservice()来启动一个后台的 service。所以可以看出来,Intent 主要是用来启动其他的 activity 或者 service,所以可以将 intent 理解成 activity 之间的粘合剂。

Intent作用的表现形式为:
启动Activity
通过Context.startActvity() / Activity.startActivityForResult()启动一个Activity;
启动Service
通过Context.startService()启动一个服务,或者通过Context.bindService()和后台服务交互;
发送Broadcast
通过广播方法Context.sendBroadcasts() / Context.sendOrderedBroadcast() / Context.sendStickyBroadcast()发给Broadcast Receivers。

Intent的两种类型
1.显示Intent
显式,即直接指定需要打开的activity对应的类。
显式Intent通过Component可以直接设置需要调用的Activity类,可以唯一确定一个Activity,意图特别明确,所以是显式的。
1)构造方法传入Component,最常用的方式

Intent intent = new Intent(this, SecondActivity.class);  
startActivity(intent); 

2)setComponent方法设置

ComponentName componentName = new ComponentName(this, SecondActivity.class);  
Intent intent = new Intent();  
intent.setComponent(componentName);  
startActivity(intent);

3)setClass / setClassName 方法

Intent intent = new Intent();   
 intent.setClass(this, SecondActivity.class);  
// 或 intent.setClassName(this, "com.example.app.SecondActivity");  
// 或 intent.setClassName(this.getPackageName(),"com.example.app.SecondActivity");            startActivity(intent); 

2.隐式Intent
隐式,不明确指定启动哪个Activity,而是设置Action、Data、Category,让系统来筛选出合适的Activity。筛选是根据所有的来筛选。
下面以Action为例:AndroidManifest.xml文件中,首先被调用的Activity要有一个带有并且包含的Activity,设定它能处理的Intent,并且category设为"android.intent.category.DEFAULT"。action的name是一个字符串,可以自定义,例如这里设成为"mark":



然后,在MainActivity,才可以通过这个action name找到上面的Activity。下面两种方式分别通过setAction和构造方法方法设置Action,两种方式效果相同。1)setAction 方法Intent intent = new Intent(); intent.setAction(“mark”); startActivity(intent); 2)构造方法直接设置 ActionIntent intent = new Intent(“mark”); startActivity(intent);

Intent的使用
1)通过浏览器打开网页// 打开百度主页
Uri uri = Uri.parse(“https://www.baidu.com”);Intent intent = new Intent(Intent.ACTION_VIEW, uri);startActivity(intent);
2)进入设置界面// 进入系统设置界面
Intent intent = new Intent(android.provider.Settings.ACTION_SETTINGS);
startActivity(intent);
3)选择图片
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType(“image/*”);
startActivityForResult(intent, 2);

Service的生命周期
IBinder onBind(Intent intent):该方法时Service子类必须实现的方法。该方法返回一个IBinder对象,应用程序可通过该对象与Service组件通信。通过创建Intent启动来启动Service。
Service有两种启动方式:如果应用通过startService()来启动Service生命周期如图左,会调用onStartCommand()方法;如果应用通过bindService()方法来启动Service如图右,则不会调用onStartCommand()方法,而是调用onbind()方法。
Service是不能自己启动的(被动被调用),只有通过 Context 对象调用startService() 和bindService() 方法来启动。
在Service每一次的开启关闭过程中,只有onStartCommand()可被多次调用(通过多次startService调用),其他onCreate()、onBind()、onUnbind()、onDestory()在一个生命周期中只能被调用一次。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值