android 判断切换后台 判断按下home键

本文介绍了一种在Android应用中判断应用是否切换到后台的方法,并详细解释了如何通过判断当前最前台应用是否为本应用来实现这一功能。同时,还提供了具体的代码实现案例。

转载自:http://blog.youkuaiyun.com/weizongwei5/article/details/49076733

android 判断切换后台 判断按下home键

(本文是原来的博客用markdown进行重新排版)

写这个博客不是为了实现监听home键,而是判断切换后台 ,说过不写一些没意思的博客,监听home键 或者屏蔽home键的方法,请百度。

我这个篇博客只是想写两种状态的判断:

1.应用切换到后台的监听或者说是判断。
2.应用切换到后台后重新打开的监听判断。

那么,问题来了,假如你的公司有个需求:在app每次切换到后台之后,判断当前跟一个建立socket连接的服务器是否断开。 
卧槽,你们城里人需求真多,好烦,这个好难实现。

解决方案大概有两种方案,应用后台后重新开的的时候走了那些方法,这个看下activity的生命周期,看下好像没法做判断。有些情况比较复杂,每次都走resume,但又不是每次都走onreate onstart一些列的方法。

那么这个套路走步不通,我们试着在activity被隐藏的地方入手,activity a跳转到activity b的时候pause了,stop了,那么,在自己的应用内activity的跳转也会触发这个东西。

但是他跟按下home键,或者在我们的app里打开其他应用的区别在哪里呢? 
解:区别在于切换到其他应用,当前在前台的应用就不是我们自己的包了。那么,我们可以用过获取当前app的前台应用的包名来判断是否是我们自己的app,即可实现。

但是,问题又来了,如果我们最后一个页面finish了呢,不也是的吗 ? 
这个切换后台和finish能否区分分开呢?

解: 可以。 
那么,这样子所有的问题都解决了切换到后台的判断了。切换到后台的时候做一个记录就行了,记录下当前是否被后台,下次重新打开的时候判断下是否之前被后台过,如果被后台过,就去判断下sokect是否在连接中即可,还要把后台的记录给重置。

理论上流程就是这样子,stop的时候,判断activitymanage中获取最前台的那个应用是否是本应用 ,不是的话就被后台了,还有就是价格判断如果被finish了,就不做记录了。

好了,上代码:


    private boolean isFinished = false;
    private final String  RUN_SP_KEY="isRunningBackGround";
    @Override
    public void finish() {
        super.finish();
        isFinished = true;
    }
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
   //如果isFinished等于false,表示当前Activity仅切换到后台运行,并没有退出。
    @Override
    protected void onStop() {
        super.onStop();
        if (!isFinished) {
            //括号内部的代码请单独提成一个方法  我这里是为了视觉 懒了
            String packageName="com.XXX.mypackagename";//我们自己的应用的包名
            String topActivityClassName= PackageUtils.getTopActivityName(this);
            if (packageName!=null&&topActivityClassName!=null && !topActivityClassName.startsWith(packageName))
            {
                //app已经后台
                SPUtils.put(this, RUN_SP_KEY, true);
            }
        }
    }

   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

上面这是在stop的时候的处理,接下来的是启动的时候的处理。

    protected void onResume() {
        super.onResume();
        boolean isReOpen = (Boolean) SPUtils.get(this, RUN_SP_KEY, false);
        if (isReOpen) {已经断开
            if (isConnect()) {
                //这个值需要重置
                SPUtils.put(this, RUN_SP_KEY, false);

            }else {
                showConnectPopupWindow();//弹出断开连接提示的poupwindow
            }
        }

    }


   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值