安卓学习之四大组件之Activity

四大基本组件都需要注册才能使用,每个Activity、service、Content Provider都需要在AndroidManifest文件中进行配置。AndroidManifest文件中未进行声明的activity、服务以及内容提供者将不为系统所见,从而也就不可用。

而broadcast receiver广播接收者的注册分静态注册(在AndroidManifest文件中进行配置)和通过代码动态创建并以调用Context.registerReceiver()的方式注册至系统。需要注意的是在AndroidManifest文件中进行配置的广播接收者会随系统的启动而一直处于活跃状态,只要接收到感兴趣的广播就会触发(即使程序未运行)。

 

程序猿拉大锯视频第5P第一节了解AndroidManifest.xml文件

在<application>标签内部

四大组件之Activity

每一个要显示视图的java文件中都需要继承Activity(AppCompatActivity),并复写onCreate()方法。

每设置一个activity都需要进行注册,设置下图在AndroidManifest.xml

不添加任何意图的注册不需要<intent-filter>

一个应用程序有多个入口:测试(从上到下执行)

 

实现页面跳转

1)通过显示意图来实现页面跳转:显示意图:指定特定显示的类名)

2)通过隐式意图来实现页面跳转

需要跳转的页面在AndroidMainfest.xml的对应注册内容进行intent-filter配置

(不需要通过new Intent()指定具体的class,通过配置intent-filter实现)

①配置文件

<activity android:name=".SecondActivity">
<!--        通过设置该Activity的意图过滤器实现隐式跳转-->
            <intent-filter>
                <action android:name="com.example.qqlogindemo.LOGIN"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>

②实现页面跳转

另外一个页面获得数据的方法同显示意图展示的一致

实现界面之间对象传递

1.传递的对象需要实现Parcelable接口(所有的String,bitemap,等都实现了Parceable接口),并   实现其中的方法(读,写…)

2.实例化该对象,用putExtra()方法将对象传入

3.在跳转页面用getParcelableExtra()方法获取到key,即获取到该对象

结束数据传递: finish();

 

实现界面之间的数据回传

RequestCode请求码的分析:

ResultCode结果码分析:

1.数据回传首先由发起页传递意图,使用startActivityForResult(),包括传递的请求码

 

2.在接收方进行数据处理,进行回传时,也应进行意图传递,且用setResult()方法将结果码传回,最后调用finish()方法关掉该页面

 

3.在发起方重写onActivityResult()方法,进行数据回传,通过requestCode请求码判断是哪一个intend发起的意图(设置不同的请求码通过传递不同的意图对象到不同的意图页面,回传的结果也不同),再进行ResultCode结果码进行不同事件响应的处理

 

Activity是生命周期 

拉大锯的笔记

onCreate()方法:onCreate()这个方法是在Activity被创建的时候调用的.在这个方法里头,我们一般做一些初始化的动作,比如说,设置和获取到UI的控件,设置对应的监听事件等。在这个方法里,也应该通过setContentView这个方法来设置Activity加载的UI内容。使用findViewById来找到这个UI里的各控件。如果你在这个方法里头调用finish()方法,那么系统就会直接调用onDestroy()方法了,它会跳过onStart()方法,会跳过onResume()方法,也会跳过onPause()方法。一般来说,我们不会在onCreate方法里调用finish()方法的。

onDestory():做释放资源的动作,比如说,取消一些广播的注册,解绑服务。在onPause方法保存数据或者在onSaveInstanceState方法里保存数据。这个方法通常用于释放资源,比如说释放线程,释放掉的话就不会泄露了。有些情况下不会调用这个方法,所以这里不要使用一直在跑的进程。这个方法也要调用super的方法,否则的话会崩溃掉的。

onResume():这个方法会在onRestoreInstanceState方法或者onRestart方法或者onPause这个方法以后被调用。

onResume跟onCreate方法有一个区别,onCreate方法如果不销毁掉是不会再执行的,但是onResume,你退到了后台以后,再回来就会执行这个方法

onPause():这个方法里不要做耗时操作,假设说,你要打开另外一个Activity,真到这个方法的onPause方法返回了,才会去启动另外一个Activity。在这个方法里头,一般保存正在编辑的数据,除了保存数据以外,还可以停止动画,因为它是跟onResume对应的嘛。在onResume开始动画,我们要是还有一些在循环播放的动画,我们可以在这个方法里头暂停掉它。在这个方法里头释放资源也是可以的,释放掉资源可以更快地启动到下一个界面。某些情况下系统可能会回收资源。所以有些东西你需要在这个地方进行保存。通常来说,如果是系统干的坏事,它会调用onSaveInstanceState这个方法的,在这个方法里头保存就好。这个方法被调用以后,当被启动的Activity可见的时候,接下来就会调用onStop方法了。但是有些情况下直接调用新的Activity的onResume方法,不会调用当前Activity的onStop方法.

onPause的调用另外一个activity(BActivity)在前台显示并且获取了焦点,但是之前的activity(AActivity)还是可见的。
即BActivity在AActivity的上面并且BActivity是部分透明的或者不覆盖整个屏幕。一个处于paused状态的Activity 是完全活着的,
(Activity对象保留在内存中,它保持着所有的状态和成员信息并且和windows Manager保持着相连接),但可以在低内存的时候被系统杀死

onStop():在你再也看不到当前Activity的时候调用,当上面的Activity是透明你的时候,那么是不会调用的. 这个方法后有两个可能,要么被onRestart,要么就被调用onDestroy,或者啥也不干,这取决于后面的操作。有些情况下这个方法可能不会被执行。比如说系统的内存不足以来跑当前的Activity的时候,调用了onPause就不调用onStop方法了,所以在这个方法里头不要做一些保存数据的东西,可能不安全,没有保障

onStop的调用是“The activity is no longer visible”,也就是完全不可见的时候调用的,这个完全不可见
真的就是指视觉上的完全看不到而已,无论是按home键返回桌面,还是启动另一activity把原activity完全遮
住,都会调用onStop。但是当启动的activity是透明的时候,原activity只会进入onPause状态,而不会走到
onStop状态,因为原acitivity还是可见的,虽然逻辑上被遮住了,但是视觉上确实是可见的,接下来要么运行
onResume()方法(如果Activity返回到前台),要么运行onStop()方法(如果Activity变得对用户不可见

OnDestroy():做释放资源的动作,比如说,取消一些广播的注册,解绑服务。不要在这个方法里保存数据。在onPause方法保存数据或者在onSaveInstanceState方法里保存数据。就是不要在这里保存数据就好。这个方法通常用于释放资源,比如说释放线程,释放掉的话就不会泄露

 

横竖屏切换时,Activity生命周期的变化会给开发带来的影响?

横竖屏切换时,Activity会销毁并且会重新创建。(比如视频进度条又会重新回到0的位置)

怎么解决?

1. 禁止屏幕旋转,指定屏幕方向。(适合只有一种屏幕状态的游戏开发配置,比如横屏游戏开发)

在AndroidManifest.xml中的<activity>标签中设置screenOreitation=“landscape”(横屏)/”portrait”(竖屏)

2.对配置不敏感。(适合有多种屏幕状态的应用开发配置,比如视频播放器)

在AndroidManifest.xml中的<activity>标签中设置configChanges为

keyboardHidden|screenSize|orientation。(屏幕发生变化时,不会改变Activity的生命周期)

 

Activity启动模式

①stardard模式:

1.Stardard模式就是会创建新的任务,并且置于当前的栈顶,当我们返回的时候,其实即使不断出栈的过程。

2.默认配置的启动模式就是Stardard模式.配置:

3.使用场景:大部分场景都是使用这个模式

②.singleTop模式

1.singleTop模式:如果栈顶是当前模式的话,不会再创建新的Activity.

2.使用场景:为了保证只有一个任务,而不会被多次创建,比如说浏览器是书签,通知应用推送(多条推送值=打开一个页面)

3.配置 :

③.singleInstance()模式

1.singleInstance()模式;不在一个任务栈中,单一的一个任务栈,独占一个栈,不会再创建。

2.应用对象:在整个应用系统中只有一个实例,比如有道词典的取词,每一个界面都可以取词

④.singleTask()模式

1.如果我们要创建的任务没有,就会直接创建一个任务,如果这个任务已经子栈中存在了,则会把这个任务以上的任务全部从栈中移除,使得当前任务成为最顶部的任务。

2.使用场景:当我们要创建的任务相对较大时,则使用该模式

============================================================================

                                      以上内容观看自b站UP主程序猿拉大锯视频学习并整理

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值