Android 实现类似IOS App唤醒的代理方法

Posted 独立开发者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 实现类似IOS App唤醒的代理方法相关的知识,希望对你有一定的参考价值。

缘由

android系统并没有类似ios中App被唤醒后的代理方法,所以需要自己通过一些手段来达到类似唤醒的代理方法
需求驱动下,实现的此功能;

实现思路


目的

不管App是被按Home键后,应用退出到后台;还是长时间停止在App,导致锁屏进入休眠,都属于App休眠,所以如果重新进入应用或解开锁屏,都需要唤醒一下App的代理方法。

思路分析

1、由于用户可能在应用中的任何界面让App进入到后台,所以App被唤醒的时候也肯定在App中的任意一个界面; 所以,我们要在BaseActivity中做手脚实现我们的目的。
2、需要判断当前应用是否是前台进程
3、判断当前是否是锁屏状态

实现

创建一个BaseActivity.java类,然后让该继承于Activity或者FragmentActivity;

package org.coolspan.base;

import android.app.Activity;
import android.app.ActivityManager;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.os.PowerManager;

import java.util.List;

/**
  *Coolspan
**/
public class BaseActivity extends Activity 

    //是否是前台进程
    private boolean isActive = false;

    @Override
    protected void onResume() 
        super.onResume();

        if (!isActive) 
//            Log.e("qxs", "进入前台");
            CoolEngine.getInstance().setFOREGROUND(true);
            isActive = true;
        
    

    @Override
    protected void onPause() 
        super.onPause();
    

    /**
    *   判断App是否是前台进程
    **/
    public boolean isAppOnForeGround() 
        ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
        //获取当前应用的包名
        String packageName = getApplicationContext().getPackageName();
        //获取当前手机的所有运行的进程
        List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
        if (appProcesses == null) 
            return false;
        

        for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) 
            //判断应用的当前进程是否是前台进程
            if (appProcess.processName.equals(packageName) && appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) 
                PowerManager manager = (PowerManager) getApplicationContext()
                        .getSystemService(Activity.POWER_SERVICE);
                if (!CoolEngine.getInstance().isScreenOn(manager)) 
                    CoolLogsUtils.e("关闭状态");
                    return false;
                 else 
                    CoolLogsUtils.e("dakai状态");
                    return true;
                
            
        

        return false;
    

    @Override
    protected void onStop() 
        super.onStop();
        if (!isAppOnForeGround()) 
//            Log.e("qxs", "进入后台");
            CoolEngine.getInstance().setFOREGROUND(false);
            isActive = false;
        
    

CoolEngine定义:

package org.coolspan.utils;

/**
  *Coolspan
**/
public class CoolEngine

    private boolean FOREGROUND;

    private volatile static CoolEngine INSTANCE;

    public static CoolEngine getInstance()
         if (INSTANCE == null) 
            synchronized (CoolEngine.class) 
                if (INSTANCE == null) //懒加载方式
                    INSTANCE = new CoolEngine();
                
            
        
        return INSTANCE;
    

    /**
    *   前后台进程切换的代理方法
    **/
     public synchronized void setFOREGROUND(boolean FOREGROUND) 
        CoolLogsUtils.e(FOREGROUND + "");
        if (this.isFOREGROUND() == false && FOREGROUND == true) 
            this.FOREGROUND = FOREGROUND;
            //TODO : 应用被唤醒,处理你的事情吧
         else 
            this.FOREGROUND = FOREGROUND;
        
    

    public boolean isScreenOn(PowerManager pm) 
        boolean screenState;
        try 
             Method mReflectScreenState = PowerManager.class.getMethod("isScreenOn", new Class[]);
            screenState = (Boolean) mReflectScreenState.invoke(pm);
         catch (Exception e) 
            screenState = false;
        
        return screenState;
    

答疑

大家可能对这部分代码可能会产生疑问:

if (appProcess.processName.equals(packageName) && appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) 
                PowerManager manager = (PowerManager) getApplicationContext()
                        .getSystemService(Activity.POWER_SERVICE);
                if (!CoolEngine.getInstance().isScreenOn(manager)) 
                    CoolLogsUtils.e("关闭状态");
                    return false;
                 else 
                    CoolLogsUtils.e("dakai状态");
                    return true;
                
            

为什么判断出应用是前台进程了,还要判断PowerManager的状态?

下面我给大家简单说一下:

当应用处于前台进程状态时,自动黑屏进入锁屏状态;如果你这个时间进行判断是否是前台进程,你的结果就是:前台进程。为了达到解锁后可以唤醒App,所以加入了对PowerManager状态的判断;这样,就可以达到不管是按Home键或者自动锁屏,都可以实现App被唤醒后调用代理方法。

使用的实现方法很简单,如果你有更好的方式,欢迎来拍砖。

文章出处:

Coolspan CSDN博客:http://blog.csdn.net/qxs965266509

欢迎关注我的公众号,实时给你推送文章,谢谢支持;

以上是关于Android 实现类似IOS App唤醒的代理方法的主要内容,如果未能解决你的问题,请参考以下文章

JS唤醒APP功能(ios,Android)

iOS 代理设计模式的应用——反向传值

iOS/Android 浏览器(h5)及微信中唤起本地APP

在Android系统上启动知乎app时会唤醒微信是啥原因?

如何修改源码android 实现按键唤醒屏幕

点击APP外部链接唤醒APP的研究