-
2021-06-06 11:00:38
在正常情况下,Android系统会让程序和服务进入休眠状态以节约电量使用。然而在开发Android程序时,有时候在程序运行的时候,不能让系统休眠,否则有一些运行会停止,因此我们需要设置禁止休眠。
Android中设置禁止休眠有两种方式:
1.
在View中设置FLAG_KEEP_SCREEN_ON。
实现上可以在代码中设置,也可以在XML文件中设置。
代码如下所示:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
或者配置文件对该View设置:
android:layout_height="fill_parent"
android:keepScreenOn="true" android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
这样可以保持当前View所在的Activity一直在活动状态运行,而且屏幕是高亮的。非常耗电!!
2.通过PowerManager来精细控制。
首先在Manifest.xml文件里面用user-permission声明
android:name="android.permission.WAKE_LOCK"/>
android:name="android.permission.DEVICE_POWER"
/>
之后通过PowerManager服务来获取电量控制锁:
private void
acquireWakeLock()
{ if (wakeLock == null)
{ PowerManager
pm = (PowerManager)
getSystemService(Context.POWER_SERVICE); wakeLock =
pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
this.getClass().getCanonicalName()); wakeLock.acquire(); } }
关键代码在newWakeLock的第一个参数,可以有:
*PARTIAL_WAKE_LOCK参数和其他不同,如果选择了这个参数,那即时用户按了关机键,CPU仍保持运行;而其他参数在用户按了关机键之后,CPU即停止运行,如果不按关机键,系统在过一段时间休眠后,CPU仍保持运行。
在程序退出时,必须释放WakeLock:
private void releaseWakeLock()
{ if (wakeLock != null
&& wakeLock.isHeld())
{ wakeLock.release(); wakeLock =
null; }
}
这两个方法分别在OnCreate/OnDestroy或者OnResume/OnPause中调用。
更多相关内容 -
Android后台服务在屏幕休眠保持运行
2021-01-03 14:15:37Android App中的Service可以保持后台运行,比如音乐播放就是Service的典型应用,在开发移动APP时,很多业务场景需要用到Service保持在后台运行,在实现过程中让Service在屏幕休眠下继续保持运行,往往没有按照预期... -
保持Android Service在手机休眠后继续运行的方法
2020-08-27 19:59:15下面小编就为大家分享一篇保持Android Service在手机休眠后继续运行的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 -
Android app后台服务在锁屏情况下一直运行的方法
2022-03-09 09:39:01在休眠时保持cpu唤醒状态,来运行service,而PowerManager.WakeLock中api可以实现这个功能 而wake lock一共有四个等级: 所以如果想要保持cpu唤醒 使用PARTIAL_WAKE_LOCK就可以了 自定义服务 import android.app....在开发app中,不让音乐播放器,即使在锁屏的情况下 也要保持音乐不能停止播放,这就需要
在休眠时保持cpu唤醒状态,来运行service,而PowerManager.WakeLock中api可以实现这个功能而wake lock一共有四个等级:
所以如果想要保持cpu唤醒 使用PARTIAL_WAKE_LOCK就可以了
自定义服务
import android.app.Service; import android.content.Context; import android.content.Intent; import android.os.IBinder;
-
如何让安卓APP一直在后台运行?
2016-04-23 10:30:23本文摘自微信公众号“android高心星的私塾” 一 声明 1 网上很多的保活手段,但是不靠谱的居多 2 本文只是进行保活知识的推广,不是在教你做永生不死的进程 二 保活手段 1 业界保活手段:黑色...本文摘自微信公众号“android高心星的私塾”
一 声明
1 网上很多的保活手段,但是不靠谱的居多
2 本文只是进行保活知识的推广,不是在教你做永生不死的进程
二 保活手段
1 业界保活手段:黑色保活,灰色保活,白色保活
2 黑色保活:
1 不同的APP进程,用广播相互唤醒,包括利用系统广播进行唤醒
2 常见手段:
1 开机,网络切换,拍照,拍视频等利用系统广播唤醒APP
此场景Google已经意识到,在Android N 取消了 拍照,视频,网络切换的广播
2 接入第三方的SDK也会唤醒相应的APP进程
3 假如你手机里装了支付宝,淘宝,UC等阿里系的APP,那么你打开任何一个,都有可能唤醒其他的阿里系的APP
3 白色保活:
就是调用系统的API启动一个前台Service进程,这样会在通知栏生成一个Notification,用户知道哪些进程正在运行
4 灰色保活
1 保活领域应用最为广泛,利用系统的漏洞来启动一个前台的Service进程,与“白色保活”不同的是,它不会在通知栏生成一个Notification,用户无法察觉,但是优先级要高于普通的后台进程。
2 实现思路
思路一:当API<18,启动前台的Service直接传入new Notification();
思路二:当API >= 18,同时启动两个id相同的前台Service,然后再将后启动的Service做stop处理
代码这样写:
import android.app.Notification; import android.app.Service; import android.content.Intent; import android.os.Build; import android.os.IBinder; /** * APP灰色保活 * Created by fflin on 2016/4/23. */ public class GrayService extends Service { private final static int GRAY_SERVICE_ID = 1001; @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { //API < 18,此方法能有效地隐藏notification的图标 if (Build.VERSION.SDK_INT < 18) { startForeground(GRAY_SERVICE_ID, new Notification()); } else { Intent intent1 = new Intent(this, GrayInnerService.class); startService(intent1); startForeground(GRAY_SERVICE_ID, new Notification()); } return super.onStartCommand(intent, flags, startId); } //给API >= 18 的平台上做灰色保护手段 public class GrayInnerService extends Service { @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { startForeground(GRAY_SERVICE_ID, new Notification()); stopForeground(true); stopSelf(); return super.onStartCommand(intent, flags, startId); } } }
3 检验方法:
首先看系统通知栏有没有Notification,如果没有,就进入手机adb shell模式,输入命令dumpsys activity services PackageName
打印出指定包名的所有进程中的service信息,看下有没有isForground=true的信息,如果有,就说明了该APP使用了灰色保活
4 使用灰色保活手段并不意味着你的应用就能永生不死,只能说提高了进程的优先级,如果应用占用了很大的内存,还是会被回收的
三 进一步理解保活
1 进程回收机制系统出于体验和性能上的考虑,APP在退出后台时系统并不会真正的kill掉这个进程,而是将其缓存起来,打开的应用越多,后台缓存的进程也就越多。在系统内存不足的情况下,系统开始根据自身的一套进程回收机制来判断要回收掉哪些进程,这套杀死进程回收内存的机制叫 Low Memory Killer,它是基于Linux内核的OOM killer机制诞生的,该机制为每个系统分配了一个值,叫做oom_adj,代表了进程的优先级,oom_adj越大,代表优先级越低,越容易被回收,普通APP进程的oom_adj >=0,系统的可能会小于0.2 查看oom_adj的值,需要用到两个shell命令ps | grep 包名$cat /proc/进程id/oom_adj3 结果发现,APP推到后台,UI进程的值降低最为明显,因为它占用的内存资源最多,因此,为了避免后台UI进程被杀,需要尽可能的释放一些不用的图片,音频资源
-
Android应用程序保持后台唤醒(使用WakeLock实现)
2021-01-20 09:52:28但是,一般情况下手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段时间后会使系统进入休眠状态,这时,Android系统中CPU会保持在一个相对较低的功耗状态。针对前面的例子,收到新消息必定有网络请求,而网络... -
Android进程保活/息屏后后台保持定位、网络运行
2021-05-26 13:30:07Android 设备在黑屏的分钟后可能会发生多种情况:应用程序切后台后进程资源被系统回收,导致不能持续定位。解决办法:长连接定时唤醒cpu(解决黑屏定位、黑屏断网问题)对于原生Android系统可采用google给出的提升后台...Android 设备在黑屏的分钟后可能会发生多种情况:
应用程序切后台后进程资源被系统回收,导致不能持续定位。
解决办法:
长连接定时唤醒cpu(解决黑屏定位、黑屏断网问题)
对于原生Android系统可采用google给出的提升后台应用进程优先级的解决方案来解决,可参考google Android 开发者官网。
对于国内厂商提供的Android系统需要联系到对应的厂商进行系统底层应用白名单授权,才可以保证App进程在后台处于活跃状态。
CPU会处于休眠状态(不同厂商生产的设备CPU休眠时间不尽相同)(包含AP[Application Processor,ARM架构的处理器,用于支撑Android系统运行]和BP[Baseband Processor,运行实时操作系统,通讯协议栈等])。一旦当CPU处于休眠状态,设备将无法正常链接网络,APP的定位请求也将无法正常发送。
解决办法:
通过创建Timer来保持CPU唤醒状态:
Android 的 Timer 类可以用来计划需要执行的任务。但 Timer 的问题是比较消耗手机电量(实现是用 WakeLock 让 CPU 保持唤醒状态);另外一点是:部分厂商将WakeLock也设置了休眠时间,就是说 Timer 很可能和CPU一起处于休眠状态。Timer 类只能解决一小部分问题。
通过AlarmManager保持CPU处于唤醒状态:
AlarmManager 是 Android 系统封装的用于管理 RTC 的模块,RTC (Real Time Clock) 是一个独立的硬件时钟,可以在 CPU 休眠时正常运行,在预设的时间到达时,通过中断唤醒 CPU。用 AlarmManager 来定时执行任务,CPU 可以正常的休眠,需要运行定位时醒来即可。但部分厂商为了使设备更加省电,将AlarmManager也做出了修改,例如5s一次的响应更改为50s或者是几分钟,有些干脆在CPU休眠后彻底停掉了。
通过心跳长链接保持client端CPU处于唤醒状态:(推荐)
最佳唤醒CPU的方法是通过server端与client端的长链接通信。例如每次长链接保持5分钟时间,每30s通信一次,这样可以有效确保CPU处于唤醒状态。
开启前台server(进程保活)
思路:模仿一个音乐类软件,开启一个前台server并循环播放无声音乐
package com.guoshikeji.xiaoxiangDriver.services;
import android.annotation.SuppressLint;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import com.guoshikeji.xiaoxiangDriver.MainActivity;
import com.guoshikeji.xiaoxiangDriver.R;
import static android.app.Notification.PRIORITY_MAX;
/**
* Created by tyl
* 2019/11/12/012
* Describe:
*/
public class BackGroundService extends Service {
Notification notification;
private Context mContext;
private static Thread uploadGpsThread;
private MediaPlayer bgmediaPlayer;
private boolean isrun = true;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mContext = this;
Intent notificationIntent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0,
notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
//1.通知栏占用,不清楚的看官网或者音乐类APP的效果
notification = new Notification.Builder(mContext)
.setSmallIcon(R.mipmap.ic_launcher)
.setWhen(System.currentTimeMillis())
.setTicker(getResources().getString(R.string.app_name))
.setContentTitle(getResources().getString(R.string.app_name))
.setContentText("正在后台运行")
.setOngoing(true)
.setPriority(PRIORITY_MAX)
.setContentIntent(pendingIntent)
.setAutoCancel(false)
.build();
/*使用startForeground,如果id为0,那么notification将不会显示*/
startForeground(2479, buildNotification());
2.开启线程(或者需要定时操作的事情)
//if(uploadGpsThread == null){
// uploadGpsThread = new Thread(new Runnable() {
// @Override
// public void run() {
// //这里用死循环就是模拟一直执行的操作
// while (isrun){
//
// //你需要执行的任务
// //doSomething();
//
// try {
// Thread.sleep(10000L);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// }
// }
// });
//}
//3.最关键的神来之笔,也是最投机的动作,没办法要骗过CPU
//这就是播放音乐类APP不被杀的做法,自己找个无声MP3放进来循环播放
//slient自己百度找一个无声的mp3即可
if(bgmediaPlayer == null){
bgmediaPlayer = MediaPlayer.create(this,R.raw.slient);
bgmediaPlayer.setLooping(true);
bgmediaPlayer.start();
}
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void onDestroy() {
isrun = false;
stopForeground(true);
bgmediaPlayer.release();
stopSelf();
super.onDestroy();
}
private NotificationManager notificationManager;
private boolean isCreateChannel = false;
@SuppressLint("NewApi")
private Notification buildNotification() {
Notification.Builder builder = null;
Notification notification = null;
if (android.os.Build.VERSION.SDK_INT >= 26) {
if (null == notificationManager) {
notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
}
String channelId = getPackageName();
if (!isCreateChannel) {
NotificationChannel notificationChannel = new NotificationChannel(channelId,
"BackgroundLocation", NotificationManager.IMPORTANCE_DEFAULT);
notificationChannel.enableLights(false);//是否在桌面icon右上角展示小圆点
notificationChannel.setShowBadge(true); //是否在久按桌面图标时显示此渠道的通知
notificationManager.createNotificationChannel(notificationChannel);
isCreateChannel = true;
}
builder = new Notification.Builder(getApplicationContext(), channelId);
} else {
builder = new Notification.Builder(getApplicationContext());
}
builder.setSmallIcon(R.mipmap.icon_notifacation_log)
.setColor(getResources().getColor(R.color.main_color))
.setContentTitle(getResources().getString(R.string.app_name))
.setContentText("正在后台运行")
.setWhen(System.currentTimeMillis());
if (android.os.Build.VERSION.SDK_INT >= 16) {
notification = builder.build();
} else {
return builder.getNotification();
}
return notification;
}
}
清单文件注册:
android:name=".services.BackGroundService"
android:enabled="true"
android:exported="true"/>
启动server:
Intent forgroundService = new Intent(this,BackGroundService.class);
startService(forgroundService);
-
Android变相拦截Home键,使app一直运行在前端
2019-07-31 15:11:18首先,声明一下楼主不是流氓程序猿,也很痛恨流氓软件。主要是媳妇最近要考试,想让我写个程序把她手机锁一段时间,让她安心看书。。。好吧主观能动性太差的表现==。于是楼主就琢磨起来怎么能够实现这样的需求。 ... -
安卓开发如何让蓝牙设备连接后台一直保持连接
2021-03-15 09:00:33<p>APP只要把程序放到后台或者黑屏,蓝牙就会断开连接,有合适呢么办法能让他一直保持连接</p> -
【Android】【应用保活】保证应用在后台继续运行
2020-09-01 18:40:16网上关于保证Service在后台持续运行的方法有很多,但有些其实作用并不大,仅适合原生系统 实际Service的运行,不完全是由代码控制的,很大程度上取决于操作系统的进程管理策略,和手机型号和性能息息相关 这里根据我... -
Android_常驻进程(杀不死的进程)
2016-08-05 14:38:23刚接触android的时候,我也是认为这是很流氓的做法,可是慢慢发现很多场景(应用),要为用户服务,就必须用到常驻进程,就好像微信,QQ,360安全手机卫士这些现在比较火,比较常用的软件来说,他们都是实现了常驻... -
安卓APP锁定后台运行的方法
2021-05-26 08:03:56因为安卓系统后台程序限制,软件在长时间挂后台运行时会被系统杀掉,可以将程序加入清理白名单中,并在手机系统设置中的“电池->后台高耗电中允许软件后台高耗电”具体方法如下:1.将应用加入到清理白名单中方法... -
AndroidStudio运行app需要运行两次生效
2022-07-31 15:40:06Android每次运行app两次才能正确安装 -
怎么让 Android 程序一直后台运行,像 QQ 一样不被杀死?
2017-08-21 20:31:37作者:闭关写代码 ... 来源:知乎 著作权归作者所有。...强烈建议不要这么做,不仅仅从用户角度考虑,作为Android开发者也有责任去维护Android的生态环境。现在很多Android开发工程师,主力机居然是iPhone而 -
android 熄屏 后台运行,Android进程保活/息屏后后台保持定位、网络运行
2022-05-26 18:07:08Android 设备在黑屏的分钟后可能会发生多种情况: 应用程序切后台后进程资源被系统回收,导致不能持续定位。 解决办法: 长连接定时唤醒cpu(解决黑屏定位、黑屏断网问题) 对于原生Android系统可采用google给出的... -
Android编程防止进程被第三方软件杀死的方法
2020-09-03 05:58:58主要介绍了Android编程防止进程被第三方软件杀死的方法,涉及Android进程操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下 -
安卓APP让屏幕保持常亮,不息屏的方法
2021-04-13 09:18:15uses-permission android:name="android.permission.WAKE_LOCK" /> 然后通过PowerManager获取WakeLock后,在onResume以及onPause执行相应操作: @Override protected void onCreate(Bundle savedInstanceState)... -
向日葵Android客户端保持在线设置(华为手机安卓6.0篇)
2021-05-28 08:04:43下面就由小编来给大家讲解下,华为手机如何设置向日葵客户端保持在线。准备:演示设备:华为Mate7系统版本:EMUI4.0.1(安卓6.0)向日葵客户端版本:3.9.16若不是相同版本的用户,设置界面会有出入,故本文仅供参考。... -
安卓9 怎么运行老程序_国外团队成功把iOS运行在安卓手机,苹果怎么应对?
2020-10-22 19:19:21其实这件事情,还有个缘起:早在2017年,一个开发团队依靠虚拟化技术,成功在安卓手机上面流畅的运行了iOS系统,并且比同时期的iPhone运行流畅,响应速度等都还要好。其实可以想到,同时期的安卓手机在硬件配置上... -
安卓手机锁屏后程序自动关闭,怎么设置手机app允许锁屏后台运行
2021-06-05 17:16:06原标题:安卓手机锁屏后程序自动关闭,怎么设置手机...但很多人需要让手机上某些app不间断的程序运行,如我们的IP这类的软件,我们需要一直运行,才能起到作用,但是每次手机一锁屏,app就自动退出了,所以很麻烦 ,... -
保持应用后台,熄屏状态下继续运行
2017-12-04 10:44:04如何让你的App永远在后台...但是,我们知道,android系统很坑爹,不同的厂商对rom的定制,导致对进程的管理都不太相同,但是如何做到在各个手机上都能一直保持后台执行呢?。 为了解决这个问题,特地去研究了各种保持 -
opencv for android中如何实现Android系统后端启动摄像头(一直保持启动状态)
2018-12-12 12:27:54为sdk供别人调用我直接返回摄像头抓到的人脸帧图片,现在问题是Android端opencv开启摄像头必须绑定activity才能开启,一但离开此页面摄像头就关闭了,如何后台一直开启摄像头并抓取图片帧数据,不影响调用方的apk。 -
怎么让 Android 程序一直后台运行,像 QQ 一样不被杀死
2018-09-19 20:09:00强烈建议不要这么做,不仅仅从用户角度考虑,作为Android开发者也有责任去维护Android的生态环境。现在很多Android开发工程师,主力机居然是iPhone而不是Android设备,感到相当悲哀。 从技术角度概括一下现在普遍... -
Android开发保持屏幕常亮和CPU不休眠唤醒状态
2021-06-03 18:03:32安卓手机 APP 开发,有的时候需要屏幕长时间亮着,也就是不锁屏,这时CPU会一直处于不休眠唤醒状态。下面介绍两种方法。方法一:通过 PowerManager 实现。此种方法会在软件安装时用户可以看到屏幕选项。首先,在 ... -
android如何长久保持后台server活跃
2020-10-26 15:13:23} public void onDestroy() { // 在onDestroy中再次启动service,当service直接被调用销毁停止service的时候,此方法可以再次启动service,保证service可以一直在后台运行。 Log.v("==============", "******... -
Android app 保持竖屏显示
2021-12-11 10:51:49android app java 保持竖屏 -
如何让程序在锁屏后还一直运行
2017-08-15 11:25:18但是,一般情况下手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段时间后会使系统进入休眠状态,这时,android系统中CPU会保持在一个相对较低的功耗状态,但是上传位置信息需要网络请求来消耗CUP的。... -
APP界面保持屏幕常亮方法
2021-06-04 08:43:55和您一起终身学习,这里是程序员Android经典好文推荐,通过阅读本文,您将收获以下知识点:一、申请WAKE_LOCK 权限二、Activity 中设置FLAG_KEEP_SCREEN_ON FLAG一、申请WAKE_LOCK 权限在AndroidMainfest.xml 中申请 ...