android之activity全面解析(1)

本文介绍了如何在Android中使用AppCompatActivity,包括ActionBar的使用和去除、toolbar的集成、activity的全屏模式、Intent传递数据、生命周期管理、启动模式、configChanges设置以及Activity间的隐式启动。
摘要由CSDN通过智能技术生成

继承AppCompatActivity的界面,界面会有一个默认的actionbar

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

}

如果继承activity的话,该actionbar会消失。ActionBar向前兼容,出现在support v7里,如果需要使用兼容版的actionbar,则继承support v7提供的ActionBarActivity ,不过点进去ActionBarActivity从源码看ActionBarActivity实际就是AppCompatActivity,就是带有标题栏的Activity. 但是目前的v7包下并没有ActionBarActivity,

所以现在最常用的还是AppcompaActivity,AppcompaActivity其实也是ActionBarActivity 修改而来。

AppcompaActivity相对于Activity的变化;

1、 主界面带有toolbar的标题栏;

2 、theme主题只能用android:theme=”@style/AppTheme (appTheme主题或者其子类),而不能用android:style

否则会提示错误:

Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.

activity实现全屏(去掉标题栏和状态栏)的两种方法

1、需要在setContentView方法调用之前设置。

requestWindowFeature(Window.FEATURE_NO_TITLE);

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

WindowManager.LayoutParams.FLAG_FULLSCREEN);

2、 定义一个主题,在styles.xml里面并引用。

Intent 启动Activity和传递数据


1.intent.putExtra(key,value):

//key一般是String,值为 java八大基本数据类型及对应的数组,String及对应的数组,序列化 Serializable Parcelable的对象及对应的数组等

2.intent.putExtras(bundle);

3.intent.putExtra(key,bundle)

Main2Activity(目标文件):

1.intent.getXXXExtra(key)获取值

2.bundle=intent.getExtras()

3.bundle=intent.getExtras(key)

//显式跳转

val intent= Intent(this,Main2Activity::class.java)

startActivity(intent)

//传参

val intent1= Intent(this,Main2Activity::class.java)

intent1.putExtra(“name”,“小明”)

startActivity(intent)

//Main2Activity中

val name=intent.getStringExtra(“name”)

//bundle传参

val bundle=Bundle()

bundle.putString(“name”,“小明”)

val intent2= Intent(this,Main2Activity::class.java)

intent2.putExtras(bundle)

startActivity(intent)

//Main2Activity中

val bundle1=intent.extras

val name1=bundle1.get(“name”)

startActivityForResult完成activity向第二个activity传递数据并且回传数据。

1.使用startActivityForResult(intent,requestCode(大于等于0))方法激活目标Activity

2.在目标Activity 中调用setResult(resultCode,intent) 设置回传到源Activity 的结果码和意图对象

3.在源Activity 中重写onActivityResult(requestCode,resultCode,intent)方法得到目标Activity 回传的数据

//发起者中写:

val intent3= Intent(this,Main2Activity::class.java)

intent3.putExtra(“name”,“小明”)

startActivityForResult(intent3,100)

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {

super.onActivityResult(requestCode, resultCode, data)

if (resultCode100&&resultCode200){

val name3=data?.getStringExtra(“name”)

}

//Main2Activity中

// 收到数据

val name2=intent.getStringExtra(“name”)

//回传数据

val intent4= Intent(this,Main2Activity::class.java)

intent4.putExtra(“name”,“小红”)

setResult(200,intent4)

}

}

传递对象时候,需要对对象进行序列化Serializable Parcelable

class Student(id:Int,name:String,age:Int) :Serializable{

var id:Int=0

var name:String=“”

var age:Int=0

}

val intent5= Intent(this,Main2Activity::class.java)

intent5.putExtra(“student”,Student(1,“小明”,10))

startActivity(intent)

//Main2Activity中

val student= intent.getSerializableExtra(“student”)

隐式启动常用于不同应用之间的跳转(例如打开支付宝微信的支付页面),也可用于H5与native之间的交互。隐式启动就是action,category和data的匹配,篇幅有限,请参考添加链接安卓Activity隐式启动全面解析

Intent在传递数据时是有大小限制的,这里官方并未详细说明,不过通过实验的方法可以测出数据应该被限制在1MB之内(1024KB)

activity生命周期


在这里插入图片描述

Activity的整个生命周期发生在onCreate()和onDestroy()之间,activity在此期间存在。

Activity的可见生命周期发生在onStart()和onStop()之间,activity在此期间状态可见。

Activity的前景生命周期发生在调用onResume()和调用之间onPause(),activity在此期间处于屏幕最上层,用户可以与之交互。

在这里插入图片描述

1、要保存用户输入数据,需要在onPause()中执行,而不是在onStop()和onDestroy()中.因为如果离开当前activity onPause()一定被调用。

2、onSaveInstanceState()

onCreate就是Android提供给开发者用来对Activity实例对象中的成员做初始化的,

某些设备配置可能会在运行时更改(例如屏幕方向,键盘可用性和语言)。发生此类更改时,Android会重新创建正在运行的活动(系统调用onDestroy(),然后立即调用

onCreate()).处理此类重新启动的最佳方法是使用onSaveInstanceState()和onRestoreInstanceState()(或onCreate())来保存和恢复Activity活动状态

//用来保存用户状态信息onSaveInstanceState() 在Activity受破坏之前,系统会自动调用。系统会传递一个Bundle对象,您可以使用诸如putString()和putInt()之类的方

法将关于Activity的状态信息保存为名称 - 值的键值对.

然后,如果系统终止您的应用程序进程,系统将重新创建活动并将其Bundle传递给Activity的onCreate()和

onRestoreInstanceState()。使用这些方法之一,您可以从中提取已保存的状态Bundle并恢复活动状态。如果没有要恢复的状态信息,则Bundle传递给您的是null

3、当dialog弹出来的时候,如果是单纯是创建的dialog,Activity并不会执行生命周期的方法,但是如果是跳转到一个不是全屏的Activity的话,当然就是按照正常的生

命周期来执行了,即onPasue()->onStop()。

4、设备横竖屏切换的时候。

不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次;

设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次;

设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法;

tips:还有一点,非常重要,一个Android的变更细节!

当API >12时,需要加入screenSize属性,否则屏幕切换时即使你设置了orientation系统也会重建Activity!

5、有时候activity界面如果有dialog经常会发生activity为空,直接崩溃,这个时候可以加个判断

if (!MainActivity.this.isDestroyed()) {

new AlertDialog.Builder(MainActivity.this).setMessage(“Show Dialog”).show();

}

Activity启动模式:


Activity四种启动模式的设定出于两种目的:

复用机制,节省系统资源,这种情况主要发生在除Standard模式外的三种模式上,通过他们的名字前缀Single也可以看出,跟Java中的单例模式有类似的思想,避免太多的实例对象创建开销。

根据用户的交互行为定义,因为Activity最终的目的还是完成用户在各种交互场景下的需求。

在android里,有4种activity的启动模式,分别为:standard (默认) singleTop singleTask singleInstance

当应用运行起来后就会开启一条线程,线程中会运行一个任务栈,当Activity实例创建后就会放入任务栈中。Activity启动模式的设置在AndroidManifest.xml文件中,通过配置Activity的属性android:launchMode=""设置。

1. Standared模式(默认)

我们平时直接创建的Activity都是这种模式的Activity,这种模式的Activity的特点是:只要你创建了Activity实例,一旦激活该Activity,则会向任务栈中加入新创建的实例,退出Activity则会在任务栈中销毁该实例。

standartd模式是activity的默认模式,大部分情况下,都应该使用这种模式,也就是在配置文件中什么都不用做,当确实有特殊需求时,再考虑其他模式。

2. SingleTop 栈顶复用模式

栈顶模式,阅读类app经常会使用。这种模式会考虑当前要激活的Activity实例在任务栈中是否正处于栈顶,如果处于栈顶则无需重新创建新的实例,会重用已存在的实例,否则会在任务栈中创建新的实例。

3. SingleTask 栈内复用模式

如果任务栈中存在该模式的Activity实例,则把栈中该实例以上的Activity实例全部移除,调用该实例的newInstance()方法重用该Activity,使该实例处於栈顶位置,否则就重新创建一个新的Activity实例。

4. SingleInstance模式

当该模式Activity实例在任务栈中创建后,只要该实例还在任务栈中,即只要激活的是该类型的Activity,都会通过调用实例的newInstance()方法重用该Activity,此时使用的都是同一个Activity实例,它都会处于任务栈的栈顶。此模式一般用于加载较慢的,比较耗性能且不需要每次都重新创建的Activity。

后台堆栈

后台堆栈指的是Activitys在后台任务中的排列规则,按"后进先出"排列.

例如当前Activity启动另一个Activity时,新Activity将被推到堆栈顶部并获得焦点。之前的Activity仍在堆栈中,但已停止。当活动停止时,系统将保留其用户界面的当前状态。当用户按下“ 返回” 按钮时,当前Activity将从堆栈顶部弹出(活动被销毁),之前的Activity将恢复(其UI的先前状态将恢复)。堆栈中的活动永远不会重新排列,只能在当前Activity启动时从堆栈推送和弹出到堆栈中,并在用户使用Back按钮退出时弹出.因此,后台堆栈作为“后进先出”对象结构操作。

当此Activity的实例已经存在,并且此时的启动模式为SingleTask和SingleInstance,另外当这个实例位于栈顶且启动模式为SingleTop时也会触发onNewInstent()。此方法会把activity带到前台。

activity进入退出动画


淡入淡出为例:

首先在res文件夹下建立anim文件夹,然后在里面建立fade_in.xml和fade_out.xml两个动画资源

<?xml version="1.0" encoding="utf-8"?>

<alpha xmlns:android=“http://schemas.android.com/apk/res/android”

android:duration=“500”

android:fromAlpha=“0.0”

android:interpolator=“@android:anim/accelerate_interpolator”

android:toAlpha=“1.0” />

<?xml version="1.0" encoding="utf-8"?>

<alpha xmlns:android=“http://schemas.android.com/apk/res/android”

android:duration=“1000”

android:fromAlpha=“1.0”

android:interpolator=“@android:anim/accelerate_interpolator”

android:toAlpha=“0.0” />

然后在values文件夹下的styles.xml中的resources标签内写:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

题外话,我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在IT学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多程序员朋友无法获得正确的资料得到学习提升,故此将并将重要的Android进阶资料包括自定义view、性能优化、MVC与MVP与MVVM三大框架的区别、NDK技术、阿里面试题精编汇总、常见源码分析等学习资料。

【Android思维脑图(技能树)】

知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。

Android开发8年,阿里、百度一面惨被吊打!我是否应该转行了?

【Android进阶学习视频】、【全套Android面试秘籍】

希望我能够用我的力量帮助更多迷茫、困惑的朋友们,帮助大家在IT道路上学习和发展

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

H4lCoPEF.jpg" />

最后

题外话,我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在IT学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多程序员朋友无法获得正确的资料得到学习提升,故此将并将重要的Android进阶资料包括自定义view、性能优化、MVC与MVP与MVVM三大框架的区别、NDK技术、阿里面试题精编汇总、常见源码分析等学习资料。

【Android思维脑图(技能树)】

知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。

[外链图片转存中…(img-SxxjEuk5-1712210664043)]

【Android进阶学习视频】、【全套Android面试秘籍】

希望我能够用我的力量帮助更多迷茫、困惑的朋友们,帮助大家在IT道路上学习和发展

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值