精华内容
下载资源
问答
  • 安卓保持软件一直运行
    千次阅读
    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 App中的Service可以保持后台运行,比如音乐播放就是Service的典型应用,在开发移动APP时,很多业务场景需要用到Service保持在后台运行,在实现过程中让Service在屏幕休眠下继续保持运行,往往没有按照预期...
  • 下面小编就为大家分享一篇保持Android Service在手机休眠后继续运行的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 在休眠时保持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 使用灰色保活手段并不意味着你的应用就能永生不死,只能说提高了进程的优先级,如果应用占用了很大的内存,还是会被回收的

      三  进一步理解保活

                   进程回收机制 
                       系统出于体验和性能上的考虑,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_adj
             3 结果发现,APP推到后台,UI进程的值降低最为明显,因为它占用的内存资源最多,因此,为了避免后台UI进程被杀,需要尽可能的释放一些不用的图片,音频资源       

                           
                       
            
    展开全文
  • 但是,一般情况下手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段时间后会使系统进入休眠状态,这时,Android系统中CPU会保持在一个相对较低的功耗状态。针对前面的例子,收到新消息必定有网络请求,而网络...
  • Android 设备在黑屏的分钟后可能会发生多种情况:应用程序切后台后进程资源被系统回收,导致不能持续定位。解决办法:长连接定时唤醒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);

    展开全文
  • 首先,声明一下楼主不是流氓程序猿,也很痛恨流氓软件。主要是媳妇最近要考试,想让我写个程序把她手机锁一段时间,让她安心看书。。。好吧主观能动性太差的表现==。于是楼主就琢磨起来怎么能够实现这样的需求。 ...
  • <p>APP只要把程序放到后台或者黑屏,蓝牙就会断开连接,有合适呢么办法能让他一直保持连接</p>
  • 网上关于保证Service在后台持续运行的方法有很多,但有些其实作用并不大,仅适合原生系统 实际Service的运行,不完全是由代码控制的,很大程度上取决于操作系统的进程管理策略,和手机型号和性能息息相关 这里根据我...
  • Android_常驻进程(杀不死的进程)

    万次阅读 2016-08-05 14:38:23
    刚接触android的时候,我也是认为这是很流氓的做法,可是慢慢发现很多场景(应用),要为用户服务,就必须用到常驻进程,就好像微信,QQ,360安全手机卫士这些现在比较火,比较常用的软件来说,他们都是实现了常驻...
  • 因为安卓系统后台程序限制,软件在长时间挂后台运行时会被系统杀掉,可以将程序加入清理白名单中,并在手机系统设置中的“电池->后台高耗电中允许软件后台高耗电”具体方法如下:1.将应用加入到清理白名单中方法...
  • Android每次运行app两次才能正确安装
  • 作者:闭关写代码 ... 来源:知乎 著作权归作者所有。...强烈建议不要这么做,不仅仅从用户角度考虑,作为Android开发者也有责任去维护Android的生态环境。现在很多Android开发工程师,主力机居然是iPhone而
  • Android 设备在黑屏的分钟后可能会发生多种情况: 应用程序切后台后进程资源被系统回收,导致不能持续定位。 解决办法: 长连接定时唤醒cpu(解决黑屏定位、黑屏断网问题) 对于原生Android系统可采用google给出的...
  • 主要介绍了Android编程防止进程被第三方软件杀死的方法,涉及Android进程操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
  • uses-permission android:name="android.permission.WAKE_LOCK" /> 然后通过PowerManager获取WakeLock后,在onResume以及onPause执行相应操作: @Override protected void onCreate(Bundle savedInstanceState)...
  • 下面就由小编来给大家讲解下,华为手机如何设置向日葵客户端保持在线。准备:演示设备:华为Mate7系统版本:EMUI4.0.1(安卓6.0)向日葵客户端版本:3.9.16若不是相同版本的用户,设置界面会有出入,故本文仅供参考。...
  • 其实这件事情,还有个缘起:早在2017年,一个开发团队依靠虚拟化技术,成功在安卓手机上面流畅的运行了iOS系统,并且比同时期的iPhone运行流畅,响应速度等都还要好。其实可以想到,同时期的安卓手机在硬件配置上...
  • 原标题:安卓手机锁屏后程序自动关闭,怎么设置手机...但很多人需要让手机上某些app不间断的程序运行,如我们的IP这类的软件,我们需要一直运行,才能起到作用,但是每次手机一锁屏,app就自动退出了,所以很麻烦 ,...
  • 如何让你的App永远在后台...但是,我们知道,android系统很坑爹,不同的厂商对rom的定制,导致对进程的管理都不太相同,但是如何做到在各个手机上都能一直保持后台执行呢?。 为了解决这个问题,特地去研究了各种保持
  • 为sdk供别人调用我直接返回摄像头抓到的人脸帧图片,现在问题是Android端opencv开启摄像头必须绑定activity才能开启,一但离开此页面摄像头就关闭了,如何后台一直开启摄像头并抓取图片帧数据,不影响调用方的apk。
  • 强烈建议不要这么做,不仅仅从用户角度考虑,作为Android开发者也有责任去维护Android的生态环境。现在很多Android开发工程师,主力机居然是iPhone而不是Android设备,感到相当悲哀。 从技术角度概括一下现在普遍...
  • 安卓手机 APP 开发,有的时候需要屏幕长时间亮着,也就是不锁屏,这时CPU会一直处于不休眠唤醒状态。下面介绍两种方法。方法一:通过 PowerManager 实现。此种方法会在软件安装时用户可以看到屏幕选项。首先,在 ...
  • } public void onDestroy() { // 在onDestroy中再次启动service,当service直接被调用销毁停止service的时候,此方法可以再次启动service,保证service可以一直在后台运行。 Log.v("==============", "******...
  • Android app 保持竖屏显示

    千次阅读 2021-12-11 10:51:49
    android app java 保持竖屏
  • 如何让程序在锁屏后还一直运行

    万次阅读 2017-08-15 11:25:18
    但是,一般情况下手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段时间后会使系统进入休眠状态,这时,android系统中CPU会保持在一个相对较低的功耗状态,但是上传位置信息需要网络请求来消耗CUP的。...
  • 和您一起终身学习,这里是程序员Android经典好文推荐,通过阅读本文,您将收获以下知识点:一、申请WAKE_LOCK 权限二、Activity 中设置FLAG_KEEP_SCREEN_ON FLAG一、申请WAKE_LOCK 权限在AndroidMainfest.xml 中申请 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,278
精华内容 6,911
关键字:

安卓保持软件一直运行