Android将后台应用唤起到前台的方法

article/2025/10/8 4:30:34

在我们开发的过程中,经常遇到app进入后台,或者切换到前台的情况。
比如:

  1. 从后台切换到前台显示全屏广告实践
  2. 来电显示从后台切换到前台

如图显示:压后台10秒钟,自动弹出
在这里插入图片描述

实现主要分为两个步骤:

第一步通过ActivityLifecycleCallbacks判断是否在前后台显示


private void registerActivityLifecycleCallbacks() {registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {@Overridepublic void onActivityCreated(Activity activity, Bundle savedInstanceState) {}@Overridepublic void onActivityStarted(Activity activity) {mCount++;if (!mFront) {mFront = true;Log.e("", "AppContext------->处于前台");}}@Overridepublic void onActivityResumed(Activity activity) {}@Overridepublic void onActivityPaused(Activity activity) {}@Overridepublic void onActivityStopped(Activity activity) {mCount--;if (mCount == 0) {mFront = false;Log.e("", "AppContext------->处于后台");timerTask();}}@Overridepublic void onActivitySaveInstanceState(Activity activity, Bundle outState) {}@Overridepublic void onActivityDestroyed(Activity activity) {}});}

第二部通过

 List<ActivityManager.RunningTaskInfo> taskInfoList = activityManager.getRunningTasks(20)

的RunningTasks,

ActivityManager的moveTaskToFront(rti.id, ActivityManager.MOVE_TASK_WITH_HOME);

方法将应用唤起到前台

@SuppressLint("NewApi")public static void isRunningForegroundToApp1(Context context, final Class Class) {ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);List<ActivityManager.RunningTaskInfo> taskInfoList = activityManager.getRunningTasks(20);/**枚举进程*/for (ActivityManager.RunningTaskInfo taskInfo : taskInfoList) {//*找到本应用的 task,并将它切换到前台if (taskInfo.baseActivity.getPackageName().equals(context.getPackageName())) {Log.e("timerTask", "timerTask  pid " + taskInfo.id);Log.e("timerTask", "timerTask  processName " + taskInfo.topActivity.getPackageName());Log.e("timerTask", "timerTask  getPackageName " + context.getPackageName());activityManager.moveTaskToFront(taskInfo.id, ActivityManager.MOVE_TASK_WITH_HOME);Intent intent = new Intent(context, Class);intent.addCategory(Intent.CATEGORY_LAUNCHER);intent.setAction(Intent.ACTION_MAIN);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);context.startActivity(intent);break;}}}

然后通过Intent 跳转到对应界面 Class的启动模式一定是singleTask

 Intent intent = new Intent(context, Class);intent.addCategory(Intent.CATEGORY_LAUNCHER);intent.setAction(Intent.ACTION_MAIN);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);context.startActivity(intent);

完成代码如下:

package com.click.backdesk;import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;import androidx.annotation.RequiresApi;import java.util.List;
import java.util.Timer;
import java.util.TimerTask;public class MyAppliction extends Application {public static MyAppliction sInstance;public static int mCount;public static boolean mFront;//是否前台private static Timer mTimer;static int cntStart = 0;static int waitTime = 10;static TimerTask mTask = null;protected void attachBaseContext(Context base) {super.attachBaseContext(base);}@Overridepublic void onCreate() {super.onCreate();sInstance = this;registerActivityLifecycleCallbacks();}private void registerActivityLifecycleCallbacks() {registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {@Overridepublic void onActivityCreated(Activity activity, Bundle savedInstanceState) {}@Overridepublic void onActivityStarted(Activity activity) {mCount++;if (!mFront) {mFront = true;Log.e("", "AppContext------->处于前台");}}@Overridepublic void onActivityResumed(Activity activity) {}@Overridepublic void onActivityPaused(Activity activity) {}@Overridepublic void onActivityStopped(Activity activity) {mCount--;if (mCount == 0) {mFront = false;Log.e("", "AppContext------->处于后台");timerTask();}}@Overridepublic void onActivitySaveInstanceState(Activity activity, Bundle outState) {}@Overridepublic void onActivityDestroyed(Activity activity) {}});}private static void timerTask() {if (mTimer == null && mTask == null) {mTimer = new Timer();mTask = new TimerTask() {@RequiresApi(api = Build.VERSION_CODES.Q)@Overridepublic void run() {cntStart++;Log.e("timerTask", "timerTask   " + cntStart);if (waitTime == cntStart) {
//                        go();isRunningForegroundToApp1(sInstance.getBaseContext(), FristActivity.class);cancelTimer();Log.e("timerTask", "timerTask 30  " + cntStart);}}};mTimer.schedule(mTask, 0, 1000);}}@SuppressLint("NewApi")public static void isRunningForegroundToApp1(Context context, final Class Class) {ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);List<ActivityManager.RunningTaskInfo> taskInfoList = activityManager.getRunningTasks(20);/**枚举进程*/for (ActivityManager.RunningTaskInfo taskInfo : taskInfoList) {//*找到本应用的 task,并将它切换到前台if (taskInfo.baseActivity.getPackageName().equals(context.getPackageName())) {Log.e("timerTask", "timerTask  pid " + taskInfo.id);Log.e("timerTask", "timerTask  processName " + taskInfo.topActivity.getPackageName());Log.e("timerTask", "timerTask  getPackageName " + context.getPackageName());activityManager.moveTaskToFront(taskInfo.id, ActivityManager.MOVE_TASK_WITH_HOME);Intent intent = new Intent(context, Class);intent.addCategory(Intent.CATEGORY_LAUNCHER);intent.setAction(Intent.ACTION_MAIN);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);context.startActivity(intent);break;}}}private static void cancelTimer() {cntStart = 0;if (mTimer != null) {mTimer.cancel();mTimer = null;}if (mTask != null) {mTask.cancel();mTask = null;}}
}
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" /><uses-permission android:name="android.permission.REORDER_TASKS" /><applicationandroid:name=".MyAppliction"android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activityandroid:name=".FristActivity"android:launchMode="singleTask" /></application>

http://chatgpt.dhexx.cn/article/xhJnrKKd.shtml

相关文章

后台功能

#&#x1f30c; 后台功能 后台功能模块&#xff0c;包含主控面板&#xff0c;开发管理&#xff0c;日志管理&#xff0c;系统监控&#xff0c;通知公告&#xff0c;文件管理&#xff0c;定时任务。 #1. 主控面饭 主控面板展示了系统的一些统计信息&#xff0c;采用默认的ant…

如何让应用保持后台运行,做到保活?

其实&#xff0c;我们无法做到真正意义上的保活&#xff0c;应为系统进程会自动杀死占用过大内存的某个应用。 但我们还有一种选择&#xff0c;就是过滤该应用的包名&#xff0c;做到后台任务键清理不掉它&#xff0c;单独去除不掉它&#xff0c;只有返回键才能做到真正的退出…

【已解决】Android 如何让应用在后台运行

应用在后台跑&#xff0c;这种说法可能不够准确&#xff0c;就是说应用没有finish退出&#xff0c;但也不在前台的状态&#xff0c;例如应用执行中点击了home键一样。如何实现呢&#xff1f; 要点&#xff1a; 退回后台是执行了home键&#xff0c;activity分别执行了onPause和…

如何让安卓APP一直在后台运行?

本文摘自微信公众号“android高心星的私塾” 一 声明 1 网上很多的保活手段&#xff0c;但是不靠谱的居多 2 本文只是进行保活知识的推广&#xff0c;不是在教你做永生不死的进程 二 保活手段 1 业界保活手段&#xff1a;黑色保活&#xff0c;灰色保活&#xff0c;白色保活 2…

Android | 判断App处于前台还是后台的方案

很多场景下&#xff0c;都需要判断某个App处于前台还是后台。本文集网上编写的前台判断方案于一体。 目前&#xff0c;有6种方案&#xff1a; 方 法 判断原理需要权限可以判断其他应用位于前台特点①RunningTask否Andorid4.0系列可以&#xff0c;5.0以上机器不行Android5.0此方…

fastapi_No.18_后台应用

文章目录 简介使用场景 创建后台应用步骤第一步&#xff1a;定义后台应用函数第二步&#xff1a;使用后台应用函数 在依赖项中的后台应用示例代码示例代码说明 简介 后台应用就是在发送响应后运行的函数。通常用在请求后需要耗费较长时间处理&#xff0c;且客户端不需要在接收…

win11如何禁用后台应用权限 Windows11禁用后台应用权限的设置方法

我在使用Win11系统的电脑时经常会遇到自动打开应用程序情况&#xff0c;很多小伙伴都不知道到如何关闭&#xff0c;那么遇到这种情况应该要如何解决呢?下面就和小编一起来看看Win11系统要如何去禁用软件的后台权限吧。更多windows11系统教程&#xff0c;可以参考小白一键重装网…

提高软件CPU占用率

案例&#xff1a; 独立线程以5ms一包的速率接收指令&#xff08;一共大概70-80种指令类型&#xff09;&#xff0c;并放入一个队列A 主线程中&#xff0c;根据定时器去队列A中取数据&#xff0c;并解析/计算/显示&#xff08;速率&#xff1a;200包/秒&#xff09; 现象&…

CPU使用率100%,如何解决

文章目录 CPU使用率概念CPU使用率的重要指标计算公式 查看CPU使用率CPU 使用率过高总结 CPU使用率 概念 单位时间内CPU使用情况的统计&#xff0c;以百分比方式显示 Linux是一个多任务操作系统&#xff0c;将每个CPU的时间划分为很短的时间片&#xff0c;通过调度器轮流分配…

解决 服务器cpu使用率100%,变成矿鸡之我与病毒crypto斗智斗勇,宝塔面板cpu使用率100%爆红

关于 简单解决宝塔面板显示CPU使用率 100%&#xff0c;但top却没找到相关进程这件事&#xff01;&#xff01;&#xff01; 如图&#xff1a; 作为一个小白&#xff0c;我只是想简单的搭建一个个人网站&#xff0c;结果碰到这个闹心的事。 服务器: 阿里云服务器 面板&#xff…

linux的mysql占用cpu过高_关于在Linux环境下,Mysql占用CPU使用率100%的优化

今天使用 MobaXterml 连接上一台物联网的Linux服务器的使用&#xff0c;发现该服务器的CPU使用率一直在100%左右。 使用top 命令发现Mysql占用了大量的CPU 用数据库工具 Navicat premium 以 root 的身份连接数据库&#xff0c;执行查询语句&#xff1a; show PROCESSLIST; 发现…

CPU使用率到100%,有哪些因素影响?

关注星标公众号&#xff0c;不错过精彩内容 转自 | 涛哥依旧 最近&#xff0c;一位同事急匆匆跑过来跟我说&#xff1a;糟糕了&#xff0c;服务器CPU的使用率达100%了。 我心想不可能啊&#xff0c;CPU有那么多核&#xff0c;怎会跑满&#xff1f;于是看了一眼&#xff0c;结果…

记一次golang cpu 占用100%

最近重新部署了下测试服务器&#xff0c;发现其负载达到了4.*&#xff0c; cpu 使用率达到了100%&#xff0c;吓的瑟瑟发抖&#xff0c;马上起来查看情况。 1&#xff0c; 想到了使用go性能查看工具&#xff1a; pprof&#xff0c;因为项目是用gin开发的&#xff0c;所在直接安…

Mysql CPU占用100%查询

这几天每天都会收到服务器负载报警&#xff0c;抽出时间查看一下原因。 进入到服务器使用top命令查看&#xff1a; 能够看到是mysql常年霸居榜首&#xff0c;导致服务器负载变高。理论上来讲&#xff0c;数据量没有那么大&#xff0c;因为很多数据都是没用的&#xff0c;前一段…

【故障排查】如何排查CPU占用100%

线上后台报警CPU占用100%&#xff0c;CPU占用过高&#xff0c;本文介绍一下如何排查CPU占用过高原因。 步骤1. top 输入top命令&#xff0c;找到占用CPU最高的进程。按ShiftP键排序&#xff1a; 可以看到CPU占用最高的pid是92129。 步骤2. top -Hp pid 查看指定进程内线程信…

vmware虚拟机WinXp sp3的系统cpu占用100%的解决方案

0x00 问题场景 1. 环境配置 角色版本位数备注虚拟机软件VMware Workstation15\原始版本12&#xff0c;升到15Host OSWindows 7 Professional6.1.7601, Service Pack 164-bit\Guest OSWindows XPservice Pack 332 bit\ 2. 环境说明 VMware在很久以前是version12&#xff0c;…

Win10环境VMware开WinXP虚拟机CPU占用100%

解决办法 网上试了各种方法&#xff0c;还是不太行&#xff0c;最后莫名其妙的好了。而这之前我只做了一件事&#xff0c;在windows的功能里打开hyper-V服务。 后续 某一天&#xff0c;windows系统自动更新了&#xff0c;然后本来运行得好好的win xp虚拟机变得巨卡。我在w…

IDEACPU占用100%_卡顿 解决办法

解决IDEA占用CPU100%的问题 直接上答案为什么会占用CPU如何查找占用CPU的原因 直接上答案 绝大部分的原因是你打开了一个有非常非常多的代码的类&#xff0c;并且你并不编辑这个类&#xff0c;你只是打开了。。。 当然&#xff0c;如果不是这样&#xff0c;你才能去排查是不是…

linux的cpu使用率100%?

1&#xff1a;背景 在linux环境中&#xff0c;我们都会通过top指令获取当前实例的进场占用cpu情况&#xff0c;如下所示 [123456789root ~]$ top top - 11:48:13 up 622 days, 15:51, 2 users, load average: 0.22, 0.19, 0.11 Tasks: 788 total, 1 running, 787 sleepin…

【最实用实战】如何排查CPU占用100%

线上后台报警CPU占用100%&#xff0c;CPU占用过高&#xff0c;本文介绍一下如何排查CPU占用过高原因。 步骤1. top 输入top命令&#xff0c;找到占用CPU最高的进程。按ShiftP键排序&#xff1a; 可以看到CPU占用最高的pid是92129。 步骤2. top -Hp pid 查看指定进程内线程信…