
就是让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实现后台返回前台再次显示广告等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)