android 我的程序回到前台,怎么进入初始页,不是历史页,什么问题啊

android 我的程序回到前台,怎么进入初始页,不是历史页,什么问题啊,第1张

就是让app中所有的activity继承与一个公共的activity(例如:BaseActivity),然后在BaseActivity的onStop()中判断当前程序是否处于后台

代码片段

[java] view plaincopyprint

01/

02 文件名:BaseActivityjava

03 版本号:

04 日期:2012-6-20

05 创建人:

06 Copyright wadata 版权所有

07 变更:

08 /

09

10package comwadatamobilefollowupviewbase;

11

12import javautilList;

13import androidappActivity;

14import androidappActivityManager;

15import androidappActivityManagerRunningAppProcessInfo;

16import androidcontentContext;

17

18/

19 名称:BaseActivity

20 描述:

21 创建人:

22 日期:2012-6-20 下午5:53:35

23 变更:

24 /

25

26public class BaseActivity extends Activity {

27 @Override

28 protected void onStop() {

29 // TODO Auto-generated method stub

30 superonStop();

31

32 if (!isAppOnForeground()) {

33 //app 进入后台

34

35 //全局变量isActive = false 记录当前已经进入后台

36 }

37 }

38

39 @Override

40 protected void onResume() {

41 // TODO Auto-generated method stub

42 superonResume();

43

44

45 //if (!isActive) {

46 //app 从后台唤醒,进入前台

47

48 //isActive = true;

49 //}

50 }

51

52 /

53 程序是否在前台运行

54

55 @return

56 /

57 public boolean isAppOnForeground() {

58 // Returns a list of application processes that are running on the

59 // device

60

61 ActivityManager activityManager = (ActivityManager) getApplicationContext()getSystemService(ContextACTIVITY_SERVICE);

62 String packageName = getApplicationContext()getPackageName();

63

64 List<RunningAppProcessInfo> appProcesses = activityManager

65 getRunningAppProcesses();

66 if (appProcesses == null)

67 return false;

68

69 for (RunningAppProcessInfo appProcess : appProcesses) {

70 // The name of the process that this object is associated with

71 if (appProcessprocessNameequals(packageName)

72 && appProcessimportance == RunningAppProcessInfoIMPORTANCE_FOREGROUND) {

73 return true;

74 }

75 }

76

77 return false;

78 }

79}

adb shell "dumpsys window | grep mCurrentFocus"

adb命令获取比较简单直接(对于获取单个页面比较方便)

打开android studio 连接手机,打开您想查看的App,之后在android studio中点击

Tools > Layout Inspector (用Layout Inspector功能)

————————————————

参考链接: >

市面上主流的APP都是在启动页做广告展示的,即通常都是叫SplashActivity的是APP的launcher页面,在manifest文件中配置, 2017年以来, 你会发现越来越多的APP在进入后台时隔一定时间后再次回到前台会再次显示广告界面, 3s自动播放, 或者手动点击跳过

比如网易云音乐, 淘宝, 京东商城啦, 似乎现在都是很主流的做法了,刚好最近项目中也有这样的需求, 我们也实现了一遍,所以写出来分享下,相互学习借鉴

要实现后台返回前台显示广告的逻辑, 主要的点在于监听APP进入后台的时间点, 和APP从后台返回到前台的时间点

我们是在Application子类中完成的, 定义三个常量记录当前APP状态

在Application中需要监听Activity的生命周期变化, registerActivityLifecycleCallbacks是application类已经提供好的一个方法, 它可以非常方便的监听整个项目中的所有activity的生命周期

可以很清晰的看到Activity的生命周期函数都会回调到ActivityLifecycleCallbacks接口来, 我们让Application实现此接口, 并在相应的回调方法中的完成具体的后台状态的监听

定义几个需要用的变量记录相关状态和时间

在onResume回调中监听回到前台的判断, 只要activity一旦获取焦点这个方法都会触发,并且会触发多次

在onStop回调中监听程序进入后台的判断

在onTrimMemory中监听应用程序的切换,这也是一种监听方式因为有时候onStop的回调不一定会完全执行(尤其是切换最近使用APP列表时),所以这个方法也是必须的

最后, 就可以得到当前APP的准确状态(sAppState)了, 是否可以再次显示广告

测试过程中,发现大部分品牌的手机都是OK的, 但是也有意外的,OPPO R9在切换应用时,一个回调都没触发,一定是Color OS改动太大, 目前尚无法处理OV手机适配起来就是费劲啊

最后补充一个判断程序是否前台的API

各位大佬们如果有更好的实现,欢迎提供思路!

按返回或Home键退出应用程序的界面时,应用程序会在后台被挂起。这么设计的好处是,由于应用被系统缓存在内存中,那么在用户打开启动应用时就可以通过调用缓存,快速启动应用。当然,由于当今内存和处理器能力的限制,系统会自动关闭一些进程。那么我如何判断这个应用程序在前台还是后台,应用从后台回到前台了?看到一般都是runningProcess或者runningTasks来判断应用在前台还是后台事实上,Android在SDK 14的时候提供了一个Callback。ActivityLifecycleCallbacks,你可以通过这个Callback拿到App所有Activity的生命周期回调。

public class Application extends androidappApplication {

private int activityCount;//activity的count数

private boolean isForeground;//是否在前台

@Override public void onCreate() {

superonCreate();

registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {

@Override

public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

}

@Override public void onActivityStarted(Activity activity) {

activityCount++;

} @Override

public void onActivityResumed(Activity activity) {

} @Override

public void onActivityPaused(Activity activity) {

} @Override

public void onActivityStopped(Activity activity) {

activityCount--; if(0==activityCount){

isForeground=false; }

} @Override

public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

} @Override

public void onActivityDestroyed(Activity activity) {

} }); } }

这个Callback写在Application里的,你可以在Application初始化的时候来注册。通过这些回调我们可以将这个计数放在onStart()和onStop()中去。activityCount==1,那么就是前台,activityCount==0,那就是后台。这样判断很很简单了吧。

public abstract class BaseClass extends AppCompatActivity {

判断当前的应用程序是不是在运行

//需要申请GETTask权限

private boolean isApplicationBroughtToBackground() {

ActivityManager am = (ActivityManager) getSystemService(ContextACTIVITY_SERVICE); List<ActivityManagerRunningTaskInfo> tasks = amgetRunningTasks(1);

if (!tasksisEmpty()) { ComponentName topActivity = tasksget(0)topActivity;

if (!topActivitygetPackageName()equals(getPackageName())) {

return true; } } return false; }

public boolean wasBackground= false; //声明一个布尔变量,记录当前的活动背景

@Override public void onPause(){

superonPause();

if(isApplicationBroughtToBackground())

wasBackground= true; }

public void onResume(){

superonResume();

if(wasBackground){//

Loge("aa","从后台回到前台"); } wasBackground= false; }}

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

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

它需要一个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的话,就不会调用你设定的方法。

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

要达到这个需求,可以设置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中,this就是当前的Activity,例如thisstartActivity。

在Fragment中可以通过 getActivity()来得到当前装载这个Fragment的Activity。

通过Activity堆栈来获取当前显示的这个Activity

ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);

ComponentName cn = amgetRunningTasks(1)get(0)topActivity;

以上就是关于android 我的程序回到前台,怎么进入初始页,不是历史页,什么问题啊全部的内容,包括:android 我的程序回到前台,怎么进入初始页,不是历史页,什么问题啊、adb笔记3:Android获取App当前页面的Activity名称、Android实现后台返回前台再次显示广告等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/web/10091675.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存