Android --- Activity

这篇具有很好参考价值的文章主要介绍了Android --- Activity。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

官方文档-activity

Activity 提供窗口,供应在其中多个界面。此窗口通常会填满屏幕,但也可能小于屏幕并浮动在其他窗口之上。

大多数应用包含多个屏幕,这意味着它们包含多个 Activity。通常,应用中的一个 Activity 会被指定主 Activity,即用户启动应用时显示的第一个屏幕。然后,每个 Activity 都可以启动另一个活动,以执行不同的操作。

Activity提供一个能让用户操作并与之交互的界面。

AppCompatActivity

AppCompatActivity 继承了 Activity 类,拥有了窗口的特性,是一个可视化界面,MainActivity是一个可视化界面正是由于它继承了 AppCompatActivity。

配置清单

声明文件 Activity

在清单文件中声明 Activity,添加<activity>元素作为<application>元素的子元素,如:

<manifest ... >
  <application ... >
      <activity android:name=".ExampleActivity" />
      ...
  </application ... >
  ...
</manifest >

 android:name,必需属性,用于指定Acitiviy的类名称。

该步骤在新建activity文件时会自动创建

IntentFilter 意图过滤器 

Android --- Activity,Android,android

<action android:name="xxxxx" />        action表示动作,就是想要做的事情的名称,给当前actitvity起别名,但不能乱起
<category android:name="android.intent.category.DEFAULT" />        指定当前活动的类型
<data android:mimeType="text/plain" />        指定活动能发送的类型

<intent-filter>
   <action android:name="android.intent.action.MAIN" />
   <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

 android.intent.action.MAIN -> 入口activity

Intent

Intent是 Activity、Serviece和 BroadcastReceiver三个应用组件之间进行通信的信使,它还可以携带数据。

Intent分类

显示意图:明确目标组件的意图

Intent(Context packageContext, Class<?> cls)

常用在操作当前应用的组件

隐式意图:没有明确目标组件的意图

Intent(String action)

常用在使用其他应用的组件时

activity 的启动(跳转)

 activity的跳转

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

一般启动 

隐式启动使用隐式意图

在运行时才知道能打开哪一个界面

隐式启动的两种构造方法
* public Intent(String action, Uri uri)
* public Intent(String action)
* action:Activity的别名 ,编译阶段无论写什么的都不会报错
* uri: Uri对象,打开的路径
// 打开百度 
Intent intentS = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com"));
startActivity(intentS);
显示启动使用显式意图

在运行前知道到底要启动哪一个界面-使用意图

Intent(Context packageContext, Class<?> cls)

一般返回

跳转后返回只需要使用 finish() 结束当前activity 

带回调启动

startActivityForResult(Intent intent,int requestCode);

跳转到第二个页面,设置请求码为1000

Intent intent = new Intent(this,ActivityLife.class);
// 参数2:请求码
startActivityForResult(intent,1000);

带结果的返回

setResult(int resultCode,Intent data) 设置要返回的结果 

第二个页面返回数据:

 // 通过startActivityForResult启动activity-返回结果
    public void backRes(View view) {
        // 设置结果
        Intent intent = new Intent();  //此时intent不作为跳转使用,而是用来传递返回的数据
        intent.putExtra("返回的数据","第二个界面返回的是10000000");
        /*参数1:请求码 参数2:返回的数据*/
        setResult(RESULT_OK,intent);
        finish(); //结束当前Acticity
    }

 在第一个页面调用 onActivityResult 方法处理返回的数据:

如果通过 startActivityForResult 启动了第二个activity,当第二个activity处理结束后,再回到当前activity时,一定会自动回调 onActivityResult 方法 。在 onActivityResult 方法中我们可以处理第二个activity返回的结果。(如。拍照后得到的照片,从图库中选取的图片)

  • 参数1 requestCode:请求码。当有多个 startActivityForResult 时,可以用来判断该结果来自于哪个activity,从而进行什么操作
  • 参数2 resultCode:结果码 0 = RESULT_CANCEL->取消 | -1 = RESULT_OK 正确处理后返回。判断它是为了判断新开的activity有没有处理完这些事
  • 参数3 Intent (可以为空):返回的结果存放在这里。通过 getStringExtra() 获取数据(此时已经知道结果是String类型的数据)
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // 判断新开的activity返回的结果
        /* 当返回结果都是成功时,请求码==1000则进行操作 */
        if(resultCode == -1){
            if(requestCode == 1000){
                assert data != null;
                Log.e("ActivityWithResults","自动进入onActivityResult requestCode:"+requestCode+",resultCode:"+resultCode+",返回的数据"+data.getStringExtra("返回的数据"));
            }
        }

Intent携带数据 

intent.putExtra(String name,XXX value) 保存数据

intent.getXXXExtra(String name) 获取数据

activity 之间数据传递

getIntent()获取携带数据的意图

  • 传递简单内容

A的activity(传递)

  Intent intent = new Intent(this,ActivityLife.class);
  //添加参数
  intent.putExtra("传递的String类型参数","这是上一个页面传递过来的String类型参数");
  intent.putExtra("传递的double类型参数",24.99);
  intent.putExtra("传递的int类型参数",24);
  intent.putExtra("传递的bool类型参数",false);
  startActivity(intent);

B的activity(接收)

// 获取上一个页面传递过来的数据,获取数据时有些需要给出默认值
Intent getIntent = getIntent();
String dataString = getIntent.getStringExtra("传递的String类型参数");
int dataInt = getIntent.getIntExtra("传递的int类型参数",1);
double dataDouble = getIntent.getDoubleExtra("传递的double类型参数",2.1);
boolean dataBool = getIntent.getBooleanExtra("传递的bool类型参数",true);

TextView textView = findViewById(R.id.show);
textView.setText("上一个页面传递是数据"+dataString+dataInt+dataDouble+dataBool);
  • 传递对象内容 

intent.getSerializableExtra(String name)  获取序列化对象数据

新建一个Student对象类

package com.example.androidstudiostudy.data;

import java.io.Serializable;

// 将对象序列化,序列化的作用
/* 1.想把内存中的对象保存到一个文件活数据库中时
 * 2.想利用套接字Socket在网络中传递对象*/
public class Student implements Serializable {
    private String name;
    private  int age;
    private  double money;
    private  boolean check;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    public boolean isCheck() {
        return check;
    }

    public void setCheck(boolean check) {
        this.check = check;
    }

    public Student(String name, int age, double money, boolean check) {
        this.name = name;
        this.age = age;
        this.money = money;
        this.check = check;
    }
}

A页面传递:

// 实例化一个新建的 Student 对象
Student student1 = new Student("沈成林",23,200000.999,true);
// 参数1:String name - 本次数据的名称
// 参数2:@Nullable Serializable value - 序列化数据对象
intentC.putExtra("data_object",student1);
startActivity(intentC);

B页面接收: 

Intent getIntent = getIntent();
// 获取对象数据 - 强转成 Student 对象
Student student = (Student) getIntent.getSerializableExtra("data_object");
if (student != null) {
  TextView textView2 = findViewById(R.id.show2);
  textView2.setText("上一个页面传递是数据"+student.getName()+student.getAge()+student.getMoney()+student.isCheck());
else {
 // 处理student对象为空的情况,比如给出一个默认值或者显示错误信息
   TextView textView2 = findViewById(R.id.show2);
   textView2.setText("上一个页面未传递有效的Student对象");
        }

activity 的生命周期

Android --- Activity,Android,android

  • onCreate() 在系统创建 activity 时触发,完成加载布局和初始化的工作。
  • onStart() 可以理解为启动状态,此时的界面还没能完全的展示出来, 还在准备中
  • onResume() 说明activity已经完全进入到了前台准备完成,可以和用户进行交互了,只有经历此方法,才能进入运行状态。
  • onPause() 当activity进入到不可操作的状态时,会回调该方法。

何时会进入到不可操作的状态?

有另一个activity进入到了前台(本activity被部分挡住了)。此时虽然不可操作,但是部分可见的

  • onRestart()
  • onStop() 当activity完全看不到了,就会回调该方法
  • onDestory() 当要退出activity的时候,就会执行这个方法

当有一个活动A来到前台完全启动后,有一个活动B也来到前台,慢慢启动时,A就会进入到onPause()方法,暂停活动,当B完全准备好后,A就会彻底的停止,进入onStop()方法

activity的四种状态

  • 运行状态:可见且可操作
  • 暂停状态:可见但不可操作
  • 停止状态:不可见,但对象存在
  • 死亡状态:对象不存在

activity 状态变化

运行-死亡:onPause() ->onStop()->onDestory()

死亡-运行:onCreate() ->onStart()->onResume()

运行-停止:onPause() ->onStop()

停止-运行:onRestart()->onStart()->onResume()

运行-暂停:onPause()

暂停-运行:onResume()

activity的Task Stack(任务栈 )

栈:后进先出

一个应用启动,系统就会为其创建一个对应的任务栈来存储并管理该应用的Activity对象。

只有栈顶的activity才会被显示。

系统中会有多个应用,同时也会有多个任务栈。

当前应用的任务栈会在我们打开其他应用或者转到主屏幕时转移到后台,在后台时,任务中的所有 activity 都会停止,但任务的返回堆栈保持不变,即当其他任务发生时,任务会失去焦点。

 当它回到前台时,会从上次停下的地方继续执行。

Android --- Activity,Android,android

Android --- Activity,Android,android

Android --- Activity,Android,android

由于返回堆栈中的 activity 绝不会重新排列,因此,应用中的一个 activity 可能会多次实例化,即使来自不同的任务也是如此,如果不想启动多次,可以管理activity的启动模式。

activity 的四种启动(加载)模式

Standard  标准模式 (默认)

每一次调用startActivity()都会创建一个新的实例,不管栈内是否存在该实例,打开就会放入任务栈,返回时依次从后退栈。

Android --- Activity,Android,android

在清单文件中设置启动模式:

android:launchMode="standard"

Android --- Activity,Android,android

Android --- Activity,Android,android

SingleTop 顶部复用

顶部是你正想要打开的activity,直接复用,不会新建实例,如果没有,则会新建实例再放入栈中。

注意,一定要在顶部,不然退栈顺序和标准模式一样

 在清单文件中设置启动模式:

android:launchMode="singleTop"

从MainActivity -> MainActivity->MainActivity-> MainActivity

此时顶部就是要打开的activity,直接复用,所以只返回一次就到了主页

Android --- Activity,Android,android

SingleTask 栈内复用模式

想打开已经打开过的 activity B,此模式会保证栈中只有一个,会弹出B之后的所有activity,保证它重回栈顶

Android --- Activity,Android,android

android:launchMode="singleTask"

MainActivity ->ButtonActivity ->ConstraintActivity ->MainActivity

只返回一次就回到主页,因为此时想打开MainActivity,但栈中此时已经有了,根据栈内复用的特性它会退出MainActivity后的所有activity, ButtonActivity ->ConstraintActivity

Android --- Activity,Android,android

SingleInstance 全局唯一模式

想要打开新activity,会放在一个新的任务栈中且该Task有且只有一个activity实例,如果已经创建过该activity实例,则不会再创建新的任务栈,只会将之前的唤醒。

Android --- Activity,Android,android

<activity
    android:launchMode="singleInstance"
    android:name=".MainActivity"
    android:exported="true" >
    <intent-filter>
         <action android:name="android.intent.action.MAIN" />
         <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

MainActivity ->ButtonActivity ->ConstraintActivity ->MainActivity

返回到ButtonActivity后再返回就直接回到了主页。这是由于MainActivity在一个单独的任务栈中,在第一次返回的时候已经被撤销了。

Android --- Activity,Android,android文章来源地址https://www.toymoban.com/news/detail-855939.html

到了这里,关于Android --- Activity的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android复习(Android基础-四大组件)——Service与Activity通信

    我们前面学会了启动和停止服务的方法,但是服务虽然是在活动里启动的,但是启动服务之后,活动与服务之间基本没什么关系了。 正常情况,我们在Activity里调用startService()方法启动MyService这个服务,然后MyService的onCreate()和onStartCommand()方法就会得到执行。之后服务会一直处

    2024年02月13日
    浏览(44)
  • Android Studio系列-Activity单元测试,字节Android高级岗

    新建Activity单元测试类 =============== package com.devilwwj.unittestdemo; import android.content.Intent; import android.test.ActivityUnitTestCase; import android.test.suitebuilder.annotation.MediumTest; import android.widget.Button; /** Created by wwj_748 on 2016/2/22.17.12 */ public class LoginActivityTest extends ActivityUnitTestCase { private Inten

    2024年04月25日
    浏览(60)
  • Android Activity启动过程详解

    1,《android系统启动流程简介》 2,《android init进程启动流程》 3,《android zygote进程启动流程》 4,《Android SystemServer进程启动流程》 5,《android launcher启动流程》 6,《Android Activity启动过程详解》 1,《Android 源码下载和编译》 2,《android 11源码编译和pixel3 刷机》 3,《Andro

    2024年02月09日
    浏览(52)
  • Android 后台启动Activity适配

    在Android 9及以下版本,后台启动Activity相对自由,但是如果在Activity上下文之外启动Activity会有限制。 所以此时需要给intent添加flag:FLAG_ACTIVITY_NEW_TASK。 在Android版本10及以后版本, 引入了后台执行限制,限制了应用在后台执行操作的能力。非核心任务的后台启动 Activity 可能会

    2024年02月10日
    浏览(45)
  • Android Activity 动画如何实现

    在 Android 中,你可以使用 Activity 转场动画来实现 Activity 之间的切换动画效果。以下是一些常见的 Activity 转场动画的实现方法: 1. 使用 XML 文件定义动画效果: 首先,在 res/anim 目录下创建 XML 文件来定义你的动画效果。例如,你可以创建 fade_in.xml 和 fade_out.xml 文件来定义淡入

    2024年02月09日
    浏览(49)
  • Android内嵌Unity (Activity)

    Unity2019.4.4 AndropidStudio4.2.1 参考文档: Android内嵌Unity并实现互相跳转的实例代码_Android_脚本之家 Android Fragment中加载,嵌套Unity视图_unity 导入并作为fragment_周灬浩的博客-CSDN博客 本文只实现了Activity整个切换过去,而Fragment,这种像h5似的与app共存,目前还未实现,可参考的第二

    2024年01月18日
    浏览(42)
  • Android Activity启动流程一:从Intent到Activity创建

    关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 学习前,建议有相关知识储备: 【Android 基础】 应用(Application)启动流程 通过本文你可以学习到Activity启动流

    2024年02月10日
    浏览(47)
  • Activity 的启动流程(Android 13)

    Activity 的启动过程分为两种:一种是普通 Activity 的启动过程,另一种是根 Activity 的启动过程。普通 Activity 指的是除应用程序启动的第一个 Activity 之外的其他 Activity。 根 Activity 指的是应用程序启动的第一个 Activity,因此,根 Activity 的启动过程一般情况下也可以理解为应用程

    2024年02月11日
    浏览(50)
  • Android开发笔记(三)—Activity篇

    (1)从当前页面跳到新页面: startActivity(new Intent(源页面.this,目标页面.class)) (2)从当前页面回到上一个页面,相当于关闭当前页面: finish() onCreate:创建活动。把页面布局加载到内存,进入了初始状态。 onStart:开始活动。把活动页面显示在屏幕上,进入了就绪状态。 on

    2024年02月06日
    浏览(39)
  • android 如何从后台启动activity

            从事开发android的工程师都知道 从android 10之后的系统是不允许从后台启动activity,这就导致很多功能实现不了,比如android 10的手机,app在后台,收到一条推送,是可以把自己拉起到前台,从而提高用户时长。         那么,有没有办法解决呢?所谓,上有政策,下游

    2024年02月10日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包