Android 程序后台运行和锁屏运行

Android 后台服务保活

推广一下我的个人博客小站:
Z同学 期待大家的围观

需求

1.在华为手机中应用切换到后台后,打开其他app。需要我的应用后台仍然能够访问http,传输数据。

2.息屏后服务没有退出的话,需要继续后台运行,并进行网络数据的传输和请求

方案

1.添加应用到白名单中。代码如下:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            try {
                String pn= getPackageName();
                PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
                if (!pm.isIgnoringBatteryOptimizations(pn)) {
                    Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
                    intent.setData(Uri.parse("package:" + pn));
                    if (intent.resolveActivity(getPackageManager()) != null) {
                        startActivityForResult(intent, REQUEST_CODE);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
       if (requestCode == REQUEST_CODE) {
            if (resultCode == RESULT_CANCELED) {
                Toast.makeText(this, "用户不允许程序后台运行~", Toast.LENGTH_LONG).show();
            }
        }
    }

这个方案是将项目添加到系统白名单中,实现不进行电池优化,解决后台运行的问题。

结果:失败,在vivo手机低版本中能够通过,但是华为就不行了

2.创建前台服务,startForegroundService()来允许服务后台一直运行。

结果:失败,服务是存活了,切换到后台后,也不会被清理,通过状态栏上可以看到Notification的存活。

但是线程被停止了,网络请求被关闭了。整个Service被系统执行了暂停。

解决方案:

参考了音乐播放器,实现了长时间常驻和回收问题。

1.创建startForegroundService()服务,启动一个前台服务,这个只是告诉你启动服务,而不代表你的服务一直是前台服务。

2.在service中创建线程,循环执行notification的刷新。你可以不改变notification的信息,执行statForeground()方法。不断的刷新

系统会将你的应用判断为正在与桌面activity进行交互的进程。从而保证你的service的存活,你的所有网络请求和后台操作都会存活。(实测有效)

3.如果不喜欢notification 可以尝试浮动框。也是在service中调用线程循环刷新浮动框(未实测,但预估有效)

上面的方法能够实现应用被切换到后台后,也一直在运行。

最后一步,

创建一个普通的Service,在你的应用启动的时候创建它,应用退出的时候销毁它。

在service中监听亮屏和息屏操作

 IntentFilter screenStatusIF = new IntentFilter();
        screenStatusIF.addAction(Intent.ACTION_SCREEN_ON);
        screenStatusIF.addAction(Intent.ACTION_SCREEN_OFF);
        // 注册
        registerReceiver(receiver, screenStatusIF);

然后在监听亮屏和息屏的时候 直接进行音视频的播放。
播放无声音音频文档。进行循环不断的播放。
自测可以和网易云音乐同样处于后台播放模式,服务都能一直稳定并进行发送网络。

由于项目原因就不提供代码了。代码比较简单 ,主要是想法和思路。

上面的方案执行后自测华为荣耀v10锁屏后运行30分钟,没有问题。
不用客户主动在电池权限中开启后台运行。就能保证服务稳定。

注意:如果非得追求客户无感的模式下,进行后台服务常驻,那应该算是非常流氓的行为了。或者你的app有微信的那么大的脸,让厂家将你的app添加到厂商版后台运行白名单。

否则给客户一个任务栏又有何妨。百度,网易云音乐等应用都是通过类似方式来实现后台运行。

    原文作者:Zswx98
    原文地址: https://blog.csdn.net/zy987654zy/article/details/100218061
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞