继承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里面并引用。
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的整个生命周期发生在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四种启动模式的设定出于两种目的:
复用机制,节省系统资源,这种情况主要发生在除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带到前台。
淡入淡出为例:
首先在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移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://i-blog.csdnimg.cn/blog_migrate/5d2967195d6dca9a00c555d815f5da24.jpeg)
最后
题外话,我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在IT学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多程序员朋友无法获得正确的资料得到学习提升,故此将并将重要的Android进阶资料包括自定义view、性能优化、MVC与MVP与MVVM三大框架的区别、NDK技术、阿里面试题精编汇总、常见源码分析等学习资料。
【Android思维脑图(技能树)】
知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。
【Android进阶学习视频】、【全套Android面试秘籍】
希望我能够用我的力量帮助更多迷茫、困惑的朋友们,帮助大家在IT道路上学习和发展
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
H4lCoPEF.jpg" />
最后
题外话,我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在IT学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多程序员朋友无法获得正确的资料得到学习提升,故此将并将重要的Android进阶资料包括自定义view、性能优化、MVC与MVP与MVVM三大框架的区别、NDK技术、阿里面试题精编汇总、常见源码分析等学习资料。
【Android思维脑图(技能树)】
知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。
[外链图片转存中…(img-SxxjEuk5-1712210664043)]
【Android进阶学习视频】、【全套Android面试秘籍】
希望我能够用我的力量帮助更多迷茫、困惑的朋友们,帮助大家在IT道路上学习和发展