Activity A 跳转Activity B,Activity B再按back键回退,两个过程各自的生命周期

Activity A 跳转Activity B,Activity B再按back键回退,两个过程各自的生命周期,第1张

ActivityB是个窗口Activity的情况下,1、2的结论呢?

若ActivityB是个窗口,ActivityA跳转到ActivityB时,ActivityA失去焦点部分可见,故不会调用onStop,此时生命周期顺序: A.onPause ->B.onCreate ->B.onStart->B.onResume

按下Back键后:B.onPause->A.onResume->B.onStop->B.onDestory

切换横竖屏时,onCreate会调用吗?几次?

程序在运行时,一些设备的配置可能会改变,如:横竖屏的切换、键盘的可用性或语言的切换等,此时Activity会重新启动。其中的过程是:在销毁之前会先调用onSaveInstancestate()去保存应用中的一些数据,然后调用 onDestory(),最后才会去调用onCreate()或者onRestoreInstanceState方法重新启动Activiy。在切换屏幕时候会重新调用各个生命周期, 切横屏时会执行一次onCreate,切竖屏时会执行两次onCreate。

本文我们来学习Activity之间的跳转

主界面放一个Button,用于跳转,Second界面就放一个TextView

MainActivity.java

activity_main.xml

SecondActivity.java

activity_second.xml

AndroidMainfest.xml

界面跳转主要是通过构建Intent,然后调用Activity的startActivity方法去启动

Intent接收两个参数,一个是Context,一个是需要跳转的Activity(Context有三种,分别是Application、Activity、Service,具体区别之后会发专门的文章来分析)

隐式启动也需要构建Intent,不过Intent传入的参数是一串字符,这串字符是由你自己定义的

我们先来修改AndroidManifest.xml

action自定义一个字符串,按自己喜欢的风格命名就行了

categroy也是由自己定义,但这里我们就用一个默认的字符串

接着修改MainActivity.java

注意这个Intent传入的参数要和之前定义的action一样

如果在AndroidManifest.xml中加了自己的category,那么就要这样写

我们在启动时要匹配所有的category才能启动

这时,你会发现我没有将android.intent.category.DEFAULT加进去

这是因为startActivity的时候,系统会自动自动帮我们加上

这个就是隐式启动。

android中intent实现两个不同应用Activity跳转,可以用以下的方法:开发有时需要在一个应用中启动另一个应用,比如Launcher加载所有的已安装的程序的列表,当点击图标时可以启动另一个应用。一般我们知道了另一个应用的包名和MainActivit y的名字之后便可以直接通过如下代码来启动:[java] view plaincopyIntent intent = new Intent(Intent.ACTION_MAIN)intent.addCategory(Intent.CATEGORY_LAUNCHER)ComponentName cn = new ComponentName(packageName, className)intent.setComponent(cn)startActivity(intent)但是更多的时候,我们一般都不知道目标应用程序的启动Activity的类名,而只知道包名,接下来就需要这么做了,我封装成了一个方法,如下所示:[java] view plaincopyprivate void doStartApplicationWithPackageName(String packagename) {// 通过包名获取此APP详细信息,包括Activities、services、versioncode、name等等PackageInfo packageinfo = nulltry {packageinfo = getPackageManager().getPackageInfo(packagename, 0)} catch (NameNotFoundException e) {e.printStackTrace()}if (packageinfo == null) {return}// 创建一个类别为CATEGORY_LAUNCHER的该包名的IntentIntent resolveIntent = new Intent(Intent.ACTION_MAIN, null)resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER)resolveIntent.setPackage(packageinfo.packageName)// 通过getPackageManager()的queryIntentActivities方法遍历List<ResolveInfo>resolveinfoList = getPackageManager().queryIntentActivities(resolveIntent, 0)ResolveInfo resolveinfo = resolveinfoList.iterator().next()if (resolveinfo != null) {// packagename = 参数packnameString packageName = resolveinfo.activityInfo.packageName// 这个就是我们要找的该APP的LAUNCHER的Activity[组织形式:packagename.mainActivityname]String className = resolveinfo.activityInfo.name// LAUNCHER IntentIntent intent = new Intent(Intent.ACTION_MAIN)intent.addCategory(Intent.CATEGORY_LAUNCHER)// 设置ComponentName参数1:packagename参数2:MainActivity路径ComponentName cn = new ComponentName(packageName, className)intent.setComponent(cn)startActivity(intent)}}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12013005.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-20
下一篇2023-05-20

发表评论

登录后才能评论

评论列表(0条)

    保存