WINext
WINext
  • 发布:2021-11-29 17:04
  • 更新:2022-07-07 10:48
  • 阅读:1288

强制安卓进入前台运行,完整代码及遇到的坑

分类:uni-app

​最近突发奇想,想做一个给自己用的app,主要时做一些个人记录和强制停止无脑刷屏==。
在每次解锁手机或刷视频超过一定时间,后台就把自己开发的app进入前台,提醒自己的目标及可以做其他的事有什么。
网上的资料并不能完整的解决问题,然后就自己撸了一下代码。
todo 之后有空的话把这部分打包成一个uniapp的插件。

完整代码

    Timer topTimer=null;  

    public void startTopTimer(){  
        stopTopTimer();  
        topTimer=new Timer();  
        TimerTask timerTask=new TimerTask() {  
            @Override  
            public void run() {  
                activityInTop();  
            }  
        };  
        topTimer.schedule(timerTask,0,500);  
    }  

    public void stopTopTimer(){  
        if(topTimer!=null){  
            topTimer.cancel();  
            topTimer=null;  
        }  
    }  

    public void activityInTop() {  
        /**获取ActivityManager*/  
        ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(ACTIVITY_SERVICE);  

        /**获得当前运行的task(任务)*/  
        int nowPosition=0;  
        List<ActivityManager.RunningTaskInfo> taskInfoList = activityManager.getRunningTasks(100);  
        for (ActivityManager.RunningTaskInfo taskInfo : taskInfoList) {  
            /**找到本应用的 task,并将它切换到前台*/  
            if (taskInfo.topActivity.getPackageName().equals(getApplicationContext().getPackageName())) {  
                if(nowPosition==0){  
                    stopTopTimer();  
                    return;  
                }  
                activityManager.moveTaskToFront(taskInfo.id, 0);  
                Log.d(TAG, "找到本应用的 task,并将它切换到前台");  
                return;  
            }  
            nowPosition++;  
        }  
        // 应用需要置顶且前台应用被关闭时,重新打开应用  
        Intent intent=getPackageManager().getLaunchIntentForPackage(getPackageName());  
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
        startActivity(intent);  
    }

使用

startTopTimer();

碰到的坑

应用被关闭时,service需要拉起一个新的应用

// 应用需要置顶且前台应用被关闭时,重新打开应用  
        Intent intent=getPackageManager().getLaunchIntentForPackage(getPackageName());  
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
        startActivity(intent);

moveTaskToFront需要在应用进入后台5-7s后执行

解决方案:执行moveTaskToFront方法后,判断是否成功。不成功每间隔500ms再执行一次,直到成功为止。

0 关注 分享

要回复文章请先登录注册

2***@qq.com

2***@qq.com

神奇,我看懂了 这个不错 我要做保活
2022-07-07 10:48
9***@qq.com

9***@qq.com

回复 WINext :
大佬还没弄吗
2022-04-07 09:52
WINext

WINext (作者)

回复 1***@qq.com :
还没呢,最近没啥时间搞
2022-01-12 15:01
1***@qq.com

1***@qq.com

大佬这个插件上架插件市场了 吗
2022-01-11 08:34
WINext

WINext (作者)

回复 1***@qq.com :
插件发布还在审核,可以加我微信canger_nine,先发你一个本地插件
2021-11-30 09:11
1***@qq.com

1***@qq.com

楼主有uniapp的方法吗
2021-11-30 00:51