2023Android白名单保活(后台定位)分享

这篇具有很好参考价值的文章主要介绍了2023Android白名单保活(后台定位)分享。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android 系统已经更新到13了,各个Rom厂商也控制越来越严格了,还能做保活App。答案肯定是可以的,然而路线是很艰难的。

最近接到一个项目,需要安装一次app后,就需要一直获取定位。随着Android系统的不断完善,厂商rom的不断优化,想要实现后台不断定位的功能,要面临的问题很多。先总结下此次开发中遇到的难点和要点。首先确认的是一点,用白名单保活的方式来实现,如果是可以实现黑名单保活的大牛,此文请忽略。

需要解决的主要问题有以下几项:

1.白名单保活核心:权限-自启动管理 要求用户手动设置打开自启动和后台运行权限。

2.电池优化:关闭电池优化。或者说耗电管理

3.进程复活:即使开启了自启动权限也要有自身拉活机制。

4.维持cpu唤醒状态:此项很重要,某些机器不一定需要,但是某些机器不这么处理,程序百分之百死掉。比如华为的某些pad。

5.比保活还重要的是定位权限:如果是做后台定位的话,熄屏后失去定位权限的解决方案。

解决方案:

如果做白名单保活,那么在做权限获取的时候需要两部分来完成,软件自动调整权限设置页或者引导用户手动开启权限设置。

这套方案目前在大多数手机或pad中可以保证服务不死定位不停,个别设备需要单独进行设置或处理才行,文章末尾会说。

先看代码上能做的处理有哪些:

1.关闭电池优化

我的所有处理都是从MainActivity开始的,

int checkTime = 0;
在onCreate中执行
//忽略电池优化
KeepAliveUtils.Checkbattery(this, 0);
​​​​​​​checkTime++;
public static void Checkbattery(Activity activity, int time) {
        if (time > 1)
            return;

        PowerManager manager = (PowerManager) activity.getSystemService(Context.POWER_SERVICE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            boolean ignoringBatteryOptimizations = manager.isIgnoringBatteryOptimizations(activity.getPackageName());
            if (!ignoringBatteryOptimizations) {
                Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
                intent.setData(Uri.parse("package:" + activity.getPackageName()));
                activity.startActivityForResult(intent, 110);
            }


        }

    }

然后在MainActivity中处理

 @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == 110) {
            KeepAliveUtils.Checkbattery(this, checkTime);
        }
    }

这段代码会弹出提示框提示用户是否关闭电池优化功能。

2.提示框提示用户手动打开自启动权限管理

int checkGoTime = 0;

在onCreate中执行

checkGoTime = KvUtils.getInstance().getInt("checkGoTime", 0);
        if (checkGoTime == 0) {
            KvUtils.getInstance().put("checkGoTime", 1);
            //打开自启动
            new XPopup.Builder(this)
                    .isDestroyOnDismiss(true)
                    .asCustom(new ConfirmCenterPop(this, "为保证App正常运行,请打开应用自启动权限和后台弹窗权限", new ConfirmCenterPop.OnSubmitListenner() {
                        @Override
                        public void onClick() {
//                            CheckPermissionUtils.startToAutoStartSetting(MainActivity.this);
                            JumpPermissionManagement.GoToSetting(MainActivity.this);
                        }
                    }))
                    .show();
        }

这段加了次数管理,避免弹出多次。

3.检查并申请定位权限和通知并开启服务

//请求权限开启定位
        XXPermissions.with(this)
                // 申请单个权限
                .permission(Permission.ACCESS_FINE_LOCATION)
                .permission(Permission.ACCESS_COARSE_LOCATION)
                .permission(Permission.ACCESS_BACKGROUND_LOCATION)
                // 申请多个权限
                // 设置权限请求拦截器(局部设置)
                //.interceptor(new PermissionInterceptor())
                // 设置不触发错误检测机制(局部设置)
                //.unchecked()
                .request(new OnPermissionCallback() {

                    @Override
                    public void onGranted(@NonNull List<String> permissions, boolean allGranted) {
                        if (!allGranted) {
                            ToastUtils.showShort("获取部分权限成功,但部分权限未正常授予");
                            return;
                        }
                        startService(new Intent(MainActivity.this, AliveService.class));
                        startService(new Intent(MainActivity.this, SAliveService.class));

                    }

                    @Override
                    public void onDenied(@NonNull List<String> permissions, boolean doNotAskAgain) {
                        if (doNotAskAgain) {
                            ToastUtils.showShort("被永久拒绝授权,请手动开启定位权限");
                            // 如果是被永久拒绝就跳转到应用权限系统设置页面
                            XXPermissions.startPermissionActivity(MainActivity.this, permissions);
                        } else {
                            ToastUtils.showShort("获取定位权限失败");
                        }
                    }
                });
        //获取通知权限,后台持续定位
        XXPermissions.with(this)
                // 申请单个权限
                .permission(Permission.POST_NOTIFICATIONS)
                // 申请多个权限
                // 设置权限请求拦截器(局部设置)
                //.interceptor(new PermissionInterceptor())
                // 设置不触发错误检测机制(局部设置)
                //.unchecked()
                .request(new OnPermissionCallback() {

                    @Override
                    public void onGranted(@NonNull List<String> permissions, boolean allGranted) {
                        if (!allGranted) {
                            ToastUtils.showShort("获取部分权限成功,但部分权限未正常授予");
                            return;
                        }
                        startService(new Intent(MainActivity.this, AliveService.class));
                        startService(new Intent(MainActivity.this, SAliveService.class));

                    }

                    @Override
                    public void onDenied(@NonNull List<String> permissions, boolean doNotAskAgain) {
                        if (doNotAskAgain) {
                            ToastUtils.showShort("被永久拒绝授权,请手动开启定位权限");
                            // 如果是被永久拒绝就跳转到应用权限系统设置页面
                            XXPermissions.startPermissionActivity(MainActivity.this, permissions);
                        } else {
                            ToastUtils.showShort("获取定位权限失败");
                        }
                    }
                });

之所以把定位权限和通知权限放在一起,是因为做后台定位的时候需要发送通知,将定位变成前台服务才能保证后台持续定位。

接下来就是核心中的核心

AliveService.class和SAliveService
双进程保活互相拉起,维持服务不死和定位权限不失的核心内容都在这两个服务里边处理

4.AliveService.class和SAliveService文章来源地址https://www.toymoban.com/news/detail-712486.html

public class AliveService extends Service {
    private MyBinder myBinder;
    /**
     * 连接对象
     */
    private Connection connection;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return myBinder;
    }

    private static final int NOTIFICATION_ID = 1;
    private Runnable runnable;
    private Handler handler;
    PowerManager pm;
    @SuppressLint("InvalidWakeLockTag")
    PowerManager.WakeLock wakeLock;


    @Override
    public void onCreate() {
        super.onCreate();
        //创建NotificationChannel
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            startForeground(1, LocationUtils.buildNotification());
        }
        myBinder = new MyBinder();
        

到了这里,关于2023Android白名单保活(后台定位)分享的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android App保活的方式

    在Android系统中,当应用程序进入后台或者被用户关闭后,系统会自动回收该应用程序的资源,以达到优化系统性能的目的。但是,有些应用程序需要在后台长时间运行,比如音乐播放器、即时通讯等,这时就需要使用一些技术手段来保持应用程序的运行状态,以确保应用程序

    2024年02月16日
    浏览(46)
  • Android 原生定位开发(解决个别手机定位失败问题)

    在android开发中地图和定位是很多软件不可或缺的内容,这些特色功能也给人们带来了很多方便。定位一般分为三种发方案:即GPS定位、Google网络定位以及基站定位。 本文分别介绍GPS定位、以及基于Google的网络Wifi定位的详细步骤,(小米手机获取位置信息locationManager.getLastK

    2024年02月06日
    浏览(50)
  • Android开发之百度地图定位

    调试版本(debug)和发布版本(release)下的 SHA1 值是不同的,发布 apk 时需要根据发布 apk 对应的 keystore 重新配置 Key。(注意:我们这里使用的是调试版本,在开发时请使用调试版本) 。 Android Studio场景使用keytool (1)进入cmd控制台,执行”cd .android”定位到”.android”文件夹下。

    2023年04月08日
    浏览(48)
  • Android 应用进程保活方案实战

    前台服务:将应用运行的服务设置为前台服务,让用户知道应用正在后台运行,系统会给予一定的优先级,减少被系统杀掉的概率。但是需要注意,使用前台服务保活不能大量占用用户的通知栏,否则用户可能会感到烦躁而卸载应用。 JobScheduler:Android 5.0 开始引入的一种调度

    2024年02月15日
    浏览(44)
  • 关于Android 11、12和13服务保活问题

    物联网环境,为了解决不同厂商、不同设备、不同网络情况下使用顺畅,同时也考虑到节约成本,缩小应用体积的好处,我们需要一个服务应用一直存在系统中,保活它以提供服务给其他客户端调用。 开机自启动,通过广播通信, 必要权限 开机自启动Service相关代码 注意

    2023年04月08日
    浏览(87)
  • Android问题解决方案(一):Android 打空包提交开发者后台提示没有”android:exported“的属性设置

    今日了解到了一个新内容,意指打一个新的空包提审,来实现同个应用二次提审的效果;通过一系列操作后,成功打出了所谓aab格式的安装包。(至于为什么是aab格式,相信有所了解的朋友自然也知道什么原因,还未曾了解的朋友可以先了解相关的信息,这里就不赘述了,自

    2023年04月11日
    浏览(54)
  • Android问题笔记四十三:JNI 开发如何快速定位崩溃问题

    Unity3D特效百例 案例项目实战源码 Android-Unity实战问题汇总 游戏脚本-辅助自动化 Android控件全解手册 再战Android系列 Scratch编程案例 软考全系列 Unity3D学习专栏 蓝桥系列 ChatGPT和AIGC 专注于 Android/Unity 和各种游戏开发技巧,以及 各种资源分享 (网站、工具、素材、源码、游戏等

    2024年02月05日
    浏览(51)
  • Uniapp-APP后台保活插件(安卓后台保活)

    目录 1.插件导入项目 2.项目中使用保活插件 3.打包自定义调试基座 4.代码配置 5.项目运行 6.测试效果 相关插件:安卓保活         注:可以先试用哦,大佬直接购买也可以哦!我是先试用的哦。          试用--勾选项目(仔细核对)--勾选隐私--确定--关闭成功提示弹窗 注

    2023年04月22日
    浏览(92)
  • android 12.0设置上网应用白名单(上网app白名单)

    在12.0的产品rom定制开发中,在对产品进行网络模块开发中,有功能需要要求设置某些app可以上网,某些app不可以上网,就是所谓的网络应用白名单功能 在12.0系统中整个网络模块都是由NetworkManagementService.java服务负责通讯的 接下来先看下NetworkManagementService.java

    2024年02月10日
    浏览(39)
  • Android开发—布局LinearLayout,布局RelativeLayout常见属性根据父容器定位,兄弟组件定位,FrameLayout帧布局的绘制原理是,TableLayout

    1. orientation  布局中组件的排列方式 2. gravity  控制组件所包含的子元素的对齐方式,可多个组合 3. layout _ gravity  控制该组件在父容器里的对其方式 4. background  为该组件设置一个背景图片,或者是直接用颜色覆盖 5. divider  分割线 6. showDividers 设置分割线所在的位置,

    2024年02月03日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包