导航:首页 > 操作系统 > androidactivity切换前台

androidactivity切换前台

发布时间:2023-06-29 08:26:39

‘壹’ android的生命周期

单个Actiivty正常的生命周期

onCreate -> onStart -> onResume -> onPause -> onStop -> onDestory

这就是一个Activity从被创建到被销毁过程。

其中正常运行状态为onResume

当Activity从前台被置于后台,
onResume -> onPause -> onStop

当从后台重新置于前台
onStop -> onPause -> onResatrt -> onStart-> onResume

其中可以发现,只要Activity置于前台都会执行onStart函数,所以我们可以考虑在这里做一下需要在前台就处理的逻辑

各个生命周期函数:
onCreate: Activity被创建,此时Activity处于不可见、不可交互
onStart: 此时Activity 部分可见不可交互
onRestart: Activity从后台重新回到前台,部分可见不可交互
onResume: 完全可见可交互,为Activity正常运行状态
onPause: Activity处于暂停,从前台被置于后台 部分可见部分不可见,不可交互
onStop: 完全置于后台,完全不可见,
onDestroy: Activity被销毁

上面就是一个正常的Activity的生命周期,

在Activity生命周期中,还设计一些其他:
Activity旋转:
onCreate -> onStart -> onResume
此时被旋转
-> onPause -> onSaveInstanceState -> onStop -> onDestroy -> onCreate -> onStart -> onRestoreInstanceState -> onResume

可以发现当Activity被旋转时,整个Activity是被销毁然后重新创建的。其中新增调用了两个生命周期函数
onSaveInstanceState: 当Activity被系统异常销毁时被调用,用于存储数据,用于系统恢复Activity时恢复数据
onRestoreInstanceState: 当Actiivty被系统异常销毁并重新创建时,取出在onSaveInstanceState时存储的数据

注意,在onCreate函数中,其实也是有参数的

此处的savedInstanceState也是在onSaveInstanceState时存储的数据,但此处可能为nll,
因为在正常的Activity时,此处就是null,只有在Activity被异常销毁然后被系统重新创建时,此处才有值。
如果要在此处使用,切记要判空。

onNewIntent与Activity的启动模式有关

当Activity未设置启动模式时,则不会触发该生命周期函数

当Activity已经处于应用的Activity栈中

onNewIntent只会在Activity设置了启动模式,并且Activity被复用时才会调起。

注意:只对startActivityForResult调起的Activity起作用,statActivity本质调用的也是startActivityForResult,Activity正常的切换前后台时不会触发的。

A -> B:
A正常运行处于 onResume,打开B

A onPause -> B onCreate -> B onStart -> B onResume -> A onStop
点击跳入B页面, 首先A进入暂停,B开始创建,到onResume完全可见可交互,于是A被完全遮挡,变成完全不可见、处于后台,进入onStop

A -> B ->goBack-> A

在B页再执行返回

B onPause -> A onRestart -> A onStart -> A onResume -> B Stop -> B onDestory
和A进入B类似,B返回A时,B进入暂停,A变得重新可见到A完全可见,进入onResume,然后B进入停止,并销毁

B启动模式设置为 SingleTop,B -> B
B onPause -> B onNewIntent -> B onResume
因为 B已经处于栈顶,启动模式为 SingleTop 则不会重新创建B的实例

将A的启动模式设置为SingleTask

可以通过在andorid studio的终端 Terminal中输入:adb shell mpsys activity
查看当前应用的Activity task栈

‘贰’ Android app后台回到前台时的监听

在一次项目,有个需求涉及到切后台回到app时,需要调起一个弹窗,以这个需求为例子,跟大家分享下我如何实现的(大牛轻拍 = = )

首先,我们在app初始化时,要注册activity生命周期的回调,我这边项目里在BaseApplication初始化时调用()

它需要一个ActivityLifecycleCallbacks类型的参数

这个接口涉及到所有activity生命周期的回调

回归正题,先初始化ActivityLifecycleCallbacks,

我们现在要做的是后台回前台,所以我们只选择onActivityStarted和onActivityPaused

我是这么做判断的,给个foregroundActivityCount去表示当前app有多少个activity处于启动的状态,给个Boolean值appInBackground判断app是否处于后台,每次打开app,当启动一个activity时,就统计开启activity的次数,并且调用你所需要的监听方法;只要在start 和 stop时判断有所activity都stop了,当当前activity启动次数为0时,说明app处于后台;

初始化已经完成,接下来就是怎么调用了。我们去到后台回来时需要操作的activity或者fragment,在初始化时调取BaseApplication里面刚才设定的方法

在里面写下你后台回来时你需要的操作

还有一个缺陷,假如是在指定fragment做监听怎么办?其实都差不多的,fragment在activity里,绑定 了activity的生命周期,假设我们要在指定的fragment才调取这个方法,我们需要在加一层判断,判断当前fragment是否可见

这样,只要你每次从后台回来,都可以监听到,但如果不在当前fragment的话,就不会调用你设定的方法。

以上,是我刚接触不久的问题,分享给大家,写的不好的大家见谅,有问题可以评论或私信我,本人还是实习生,请轻拍= =

‘叁’ android 如何调用 底下的 activity 到前台 我不想新建

要达到这个需求,可以设置activity的启动模式为singleTask或者singleInstance

activity一共有4中启动模式

standard
默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。

例如:
若有一个Activity名为A1, 上面有一个按钮可跳转到A1。那么如果点击按钮,便会新启一个Activity A1叠在刚才的A1之上,再点击,又会再新启一个在它之上……
点back键会依照栈顺序依次退出。

singleTop
可以有多个实例,但是不允许多个相同Activity叠加。即,如果Activity在栈顶的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法。

例如:
若有两个Activity名为B1,B2,两个Activity内容功能完全相同,都有两个按钮可以跳到B1或者B2,唯一不同的是B1为standard,B2为singleTop。
若我意图打开的顺序为B1->B2->B2,则实际打开的顺序为B1->B2(后一次意图打开B2,实际只调用了前一个的onNewIntent方法)
若意图打开的顺序为B1->B2->B1->B2,则实际打开的顺序与意图的一致,为B1->B2->B1->B2。

singleTask
只有一个实例。在同一个应用程序中启动的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。
如果是在别的应用程序中启动它,则会新建一个task,并在该task中启动这个Activity,singleTask允许别的Activity与其在一个task中共存,也就是说,如果在这个singleTask的实例中再打开新的Activity,这个新的Activity还是会在singleTask的实例的task中。

例如:
若应用程序中有三个Activity,C1,C2,C3,三个Activity可互相启动,其中C2为singleTask模式,那么,无论在这个程序中如何点击启动,如:C1->C2->C3->C2->C3->C1-C2,C1,C3可能存在多个实例,但是C2只会存在一个,并且这三个Activity都在同一个task里面。
但是C1->C2->C3->C2->C3->C1-C2,这样的操作过程实际应该是如下这样的,因为singleTask会把task中在其之上的其它Activity destory掉。
操作:C1->C2 C1->C2->C3 C1->C2->C3->C2 C1->C2->C3->C2->C3->C1 C1->C2->C3->C2->C3->C1-C2
实际:C1->C2 C1->C2->C3 C1->C2 C1->C2->C3->C1 C1->C2

若是别的应用程序打开C2,则会新启一个task。
如别的应用Other中有一个activity,taskId为200,从它打开C2,则C2的taskIdI不会为200,例如C2的taskId为201,那么再从C2打开C1、C3,则C2、C3的taskId仍为201。
注意:如果此时点击home,然后再打开Other,发现这时显示的肯定会是Other应用中的内容,而不会是应用中的C1 C2 C3中的其中一个。

singleInstance
只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。

例如:
程序有三个ActivityD1,D2,D3,三个Activity可互相启动,其中D2为singleInstance模式。那么程序从D1开始运行,假设D1的taskId为200,那么从D1启动D2时,D2会新启动一个task,即D2与D1不在一个task中运行。假设D2的taskId为201,再从D2启动D3时,D3的taskId为200,也就是说它被压到了D1启动的任务栈中。

若是在别的应用程序打开D2,假设Other的taskId为200,打开D2,D2会新建一个task运行,假设它的taskId为201,那么如果这时再从D2启动D1或者D3,则又会再创建一个task,因此,若操作步骤为other->D2->D1,这过程就涉及到了3个task了。

‘肆’ Android之Activity全面解析,有些知识点容易忘记

Activity作为安卓四大组件之一,是最重要也是用得最多的组件,涉及的知识点非常多,有些知识点平时开发很少用到,但在某些场景下需要特别注意,本文详细整理了Activity涉及的知识点,供开发参考。

针对Activity可以提出很多问题,如:
Activity 的生命周期?
Activity 之间的通信方式?
Activity 各种情况下的生命周期?
横竖屏切换时 Activity 的生命周期?
前台切换到后台,然后再回到前台时 Activity 的生命周期?
弹出 Dialog 的时候按 Home 键时 Activity 的生命周期?
两个Activity之间跳转时的生命周期?
下拉状态栏时 Activity 的生命周期?
Activity 与 Fragment 之间生命周期比较?
Activity 的四种 LaunchMode(启动模式)的区别?
Activity 状态保存与恢复?
Activity的转场动画有哪些实现方式?
Activity的生命周期中怎么获取控件宽高?
onNewIntent的执行时机?
如何连续退出多个Activity?

如何把Acitivty设置成Dialog样式 ,android:theme="@android:style/Theme.Dialog"

关于横竖屏切换的生命周期,对应不同的手机,由于厂商定制的原因,会有不同的效果,如设置了configChanges="orientation”在有些手机会执行各个生命周期,但有些手机却不会执行。
网上常见的结论如下:

但实际的测试如下:

可以看出,不同厂商的手机切屏生命周期会有差异。
从API 13以上,当设备在横竖切屏时,“屏幕尺寸”也会发生变化,因此为了杜绝切屏导致页面销毁重建,需要加上screenSize,使用设置4,即 android:configChanges="orientation|keyboardHidden|screenSize" .

Activity的四种状态如下:

在activity处于paused或者stoped状态下,如果系统内存紧张,可能会被销毁,当重回该activity时会重建,正常返回和被回收后返回的生命周期如下:

如果是回收后返回,onCreate的参数savedInstanceState不为空。

有哪些场景会触发onNewIntent回调呢?跟启动模式有关,首先该Activity实例已经存在,再次启动才可能触发。一种情况是启动模式是singleTask或者singleInstance,无论该activity在栈中哪个位置,都会触发onNewIntent回调,并且把上面其他acitivity移除,另一种情况是启动模式是singleTop或者以FLAG_ACTIVITY_SINGLE_TOP启动,并且该activity实例在栈顶,会触发onNewIntent,如果不在栈顶是重新创建的,不会触发。

在实际业务开发中,往往碰到需要连续退出多个activity实例,下面整理了几种常见方法:

● 发送特定广播
1、在需要处理连续退出的activity注册该特定广播;
2、发起退出的activity发送该特定广播;
3、接收到该广播的activity 调用finish结束页面。
● 递归退出
1、用startActivityForResult启动新的activity;
2、前一个页面finish时,触发onActvityResult回调,再根据requestCode和resultCode处理是否finish,达到递归退出的效果。
● FLAG_ACTIVITY_CLEAR_TOP
通过intent.setFlag(Intent.FLAG_ACTIVITY_CLEAR_TOP)启动新activity,如果栈中已经有该实例,则会把该activity之上的所有activity关闭,达到singleTop启动模式的效果。
● 自定义activity栈
1、自定义activity列表,新打开activity则加入栈中,关闭则移除栈;
2、需要退出多个activity时,则循环从栈中移除activity实例,并调用finish。

在讨论Activity启动模式经常提到任务栈,那到底什么是任务栈?
任务是一个Activity的集合,它使用栈的方式来管理其中的Activity,这个栈又被称为返回栈(back stack),栈中Activity的顺序就是按照它们被打开的顺序依次存放的。返回栈是一个典型的后进先出(last in, first out)的数据结构。下图通过时间线的方式非常清晰地向我们展示了多个Activity在返回栈当中的状态变化:

taskAffinity 任务相关性,可以用于指定一个Activity更加愿意依附于哪一个任务,在默认情况下,同一个应用程序中的所有Activity都具有相同的affinity, 名字为应用的包名。当然了,我们可以为每个 Activity 都单独指定 taskAffinity 属性(不与包名相同)。taskAffinity 属性主要和 singleTask 启动模式和 allowTaskReparenting 属性配对使用,在其他情况下没有意义。
taskAffinity 有下面两种应用场景:

分为显示启动和隐式启动。
(1)显示启动
直接指定待调整的Activity类名。

(2)隐式启动
Intent 能够匹配目标组件的 IntentFilter 中所设置的过滤信息,如果不匹配将无法启动目标 Activity。IntentFilter 的过滤信息有 action、category、data。
IntentFilter 需要注意的地方有以下:
● 一个 Activity 中可以有多个 intent-filter
● 一个 intent-filter 同时可以有多个 action、category、data
● 一个 Intent 只要能匹配任何一组 intent-filter 即可启动对应 Activity
● 新建的 Activity 必须加上以下这句,代表能够接收隐式调用
<category android:name="android.intent.category.DEFAULT" />

只要匹配一个action即可跳转,注意的是action要区分大小写。

规则:如果intent中有category,则所有的都能匹配到intent-filter中的category,intent中的category数量可用少于intent-filter中的。另外,单独设置category是无法匹配activity的,因为category属性是一个执行Action的附加信息。

intent不添加category会匹配默认的,即 “android:intent.category.DEFAULT”
如果上面例子,如果去掉intent.setAction("action_name"),则会抛出异常:

规则:类似action,但data有复杂的结构,只要匹配一个data并且与data中所有属性都一致就能匹配到Activity,只要有1个属性不匹配,都无法找到activity。
data的结构:

data 主要是由 URI 和 mimeType 组成的。
URI 可配置很多信息,的结构如下:

与url类似,例如:

mineType:指资源类型包括文本、图片、音视频等等,例如:text/plain、 image/jpeg、video/* 等

下面看下data匹配的例子:
只匹配scheme

只匹配scheme也是能匹配到activity的。

匹配scheme、host、port
将上面的data改为

匹配mineType

如果有mineType,则不能仅设置setData或setMineType了,因为setData会把mineType置为null,而setMineType会把data置为null,导致永远无法匹配到activity,要使用setDataAndType。

使用scheme的默认值contentfile

注意该方法需要在startAtivity方法或者是finish方法调用之后立即执行,不能延迟,但可以在子线程执行。

而在windowAnimationStyle中存在四种动画:
activityOpenEnterAnimation // 打开新的Activity并进入新的Activity展示的动画
activityOpenExitAnimation // 打开新的Activity并销毁之前的Activity展示的动画
activityCloseEnterAnimation //关闭当前Activity进入上一个Activity展示的动画
activityCloseExitAnimation // 关闭当前Activity时展示的动画

overridePendingTransition的方式比较生硬,方法也比较老旧了,不适用于MD风格,google提供了新的转场动画ActivityOptions,并提供了兼容包ActivityOptionsCompat。

我们知道在onCreate和onResume里面直接获取到控件宽高为0,那有什么办法获取到控件的实际宽高?只要有onWindowFocusChanged、view.post、ViewTreeObserver三种方式获取。

当用户点击桌面图标启动APP时,背后的流程如下:

我们看到的手机桌面是Launch程序的界面,点击应用图标会触发点击事件,调用startActivity(intent),然后通过Binder IPC机制,与ActivityManagerService(AMS)通讯,AMS执行一系列操作,最终启动目前应用,大概流程如下:

通过PackageManager的resolveIntent()收集跳转intent对象的指向信息,然后通过grantUriPermissionLocked()方法来验证用户是否有足够的权限去调用该intent对象指向的Activity。如果有权限,则在新的task中启动目标activity,如果发现没有进程,则先创建进程。

如果进程不存在,AMS会调用startProcessLocked创建新的进程,在该方法中,会通过socket的通讯方式通知zygote进程孵化新的进程并返回pid,在新的进程中会初始化ActivityThread,并依次调用Looper.prepareLoop()和Looper.loop()来开启消息循环。

创建好进程后下一步要将Application和进程绑定起来,AMS会调用上一节创建的ActivityThread对象的bindAppliction方法完成绑定工作,该方法会发送一条BIND_APPLICATION的消息,最终会调用handleBindApplication方法处理消息,并调用makeApplication方法处理消息,加载APP的classes到内存中。

通过前面的步骤,系统已经拥有了该Application的进程,后续的启动则是从已存在其他进程中启动Acitivity,即调用realStartAcitvityLocked,该方法会调用Application的主线程对象ActivityThread的sheleLaunchActivity方法,在方法中会发送LAUNCH_ACTIVITY到消息队列,最终通过handleLaunchActivity处理消息,完成Acitivty的启动。

Activity
Activity 的 36 大难点,你会几个?“建议收藏”
[译]Android Application启动流程分析

‘伍’ android 如何监听前后台切换

        这段时间有需求,需要利用aop切面技术完成数据统计的工作,其中需要统计活跃(定的规则是:用户从后台切换到前台就算一次活跃)。所以关于如何监听前后台切换就有以下的描写。

一.使用ActivityLifecycleCallbacks简单app进入后台

有时需要监听到应用在前后台切换并做些处理,一般的做法可能是建立一个BaseActivity,然后全部的Activity都继承它,在BaseActivity的onStart和onStop中计数去处理。这样并不是最好的方式,不做详细介绍,有更好的方式,道理其实差不多,就是借助ActivityLifecycleCallbacks来实现。

1)写了个帮助类:

2)Application中使用(注意:仅在Application中才能使用,因为Application的生命周期能监听到每个Activity)

原文地址: https://blog.csdn.net/bzlj2912009596/article/details/80073396

阅读全文

与androidactivity切换前台相关的资料

热点内容
生成360文件夹 浏览:1000
图库的文件夹是哪个 浏览:505
程序员为什么药学日语 浏览:423
熟悉linux常用命令 浏览:859
印度外卖小哥是程序员 浏览:411
绍兴程序员开发驻场流程 浏览:544
索纳塔8的压缩比 浏览:16
私有云主要服务器 浏览:939
为什么主题解压那么慢 浏览:860
怎么下载扫描二维码的手机app 浏览:727
云服务器创建私有镜像的时候一定要关机吗 浏览:115
php开发学习门户 浏览:385
传奇游戏服务器怎么设置 浏览:823
敲击东西解压完整版 浏览:401
刺络学pdf 浏览:868
怎么给手机文件夹设置封面 浏览:931
汽车保养app怎么用 浏览:62
线程javalock 浏览:898
c语言编译运行结果查看器 浏览:114
androidpx转dip 浏览:843