Android 当应用程序处于后台时,服务暂停&&;屏幕已锁定

Android 当应用程序处于后台时,服务暂停&&;屏幕已锁定,android,android-service,Android,Android Service,在前台服务中,我使用它对媒体进行编码。通过记录编码进度,我注意到进程被暂停(在某些设备中) 当设备通过wifi(非USB)连接到adb时,&屏幕被锁定 我试过: try { final PowerManager mgr = (PowerManager) getSystemService(Context.POWER_SERVICE); if (mgr != null) { wakeLock = mgr.newWakeLock(Powe

在前台服务中,我使用它对媒体进行编码。通过记录编码进度,我注意到进程被暂停(在某些设备中)

设备通过wifi(非USB)连接到adb时,&屏幕被锁定

我试过:

    try {
        final PowerManager mgr = (PowerManager) getSystemService(Context.POWER_SERVICE);
        if (mgr != null) {
            wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "TAG:WakeLock");
            if (!wakeLock.isHeld()) {
                wakeLock.acquire();
                Log.i("AppController","Engaging WakeLock");
            }else{
                Log.i("AppController","WakeLock was already engaged");

            }

        }
    } catch (Exception ignored) {
    }
尝试了
AlarmManager
内部
应用程序
类| |
我的服务

我试过了

已尝试
忽略电池优化

一分钟后,CPU仍进入休眠状态

服务

public class CompressionService extends Service {

private Messenger _activityMessenger;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    _activityMessenger = intent.getParcelableExtra(MESSENGER_INTENT_KEY);
    return START_STICKY;
}

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

private final IFFmpegProcessService.Stub mBinder = new IFFmpegProcessService.Stub() {
    @Override
    public void startEncode(final List<String> ffmpegArgs, final String outputFile)  {
        ExecuteBinaryResponseHandler handler = new ExecuteBinaryResponseHandler() {
            @Override
            public void onProgress(String s) {
                long progress = FFmpegUtil.getProgres(s);
                Log.d("JOB_PROGRESS: " + progress);
                sendMessage(progress);

            }
        };
        FFmpegUtil.call(handler);
    }
    @Override public void cancel() throws RemoteException { }
    @Override public boolean isEncoding() throws RemoteException {return false; }
};



private void sendMessage(@Nullable Object params) {
    Message m = Message.obtain();
    m.what = MessageId.JOB_PROGRESS.ordinal();
    m.obj = params;
    try {
        _activityMessenger.send(m);
    } catch (RemoteException e) { e.printStackTrace();}
}


}
公共类压缩服务扩展服务{
私人信使(activityMessenger),;
@凌驾
公共int onStartCommand(Intent Intent、int标志、int startId){
_activityMessenger=intent.getParcelableExtra(MESSENGER\u intent\u键);
返回开始时间;
}
@凌驾
公共IBinder onBind(意向){
返回mBinder;
}
private final IFFmpegProcessService.Stub mBinder=新的IFFmpegProcessService.Stub(){
@凌驾
公共无效起始代码(最终列表ffmpegArgs,最终字符串输出文件){
ExecuteBinaryResponseHandler=新的ExecuteBinaryResponseHandler(){
@凌驾
public void onProgress(字符串s){
长进度=FFmpegUtil.getProgres;
日志d(“作业进度:+进度”);
发送消息(进度);
}
};
调用(处理程序);
}
@重写public void cancel()引发远程异常{}
@重写公共布尔ISencode()引发RemoteException{return false;}
};
私有void sendMessage(@Nullable Object params){
Message m=Message.get();
m、 what=MessageId.JOB_PROGRESS.ordinal();
m、 obj=参数;
试一试{
_activityMessenger.send(m);
}catch(远程异常e){e.printStackTrace();}
}
}

API24 | | API26
荣誉8 Lite
上运行时,您需要将其实现为
ForegroundsService
。至少需要避免API级别26的暂停。

代码中的所有指示表明服务器不是“真实”背景。。。首先,为什么是服务而不是意向服务。。第二,您正在使用START\u NOT\u STICKY,它表示可以暂停。。另外,Android正在关闭/暂停服务,以便为其他进程分配cpu。。你也需要考虑这一点。我尝试过<代码> > StasdStyky。我将尝试
IntentService
,“加上Android正在关闭/暂停服务,为其他进程分配cpu”,是的,但不是当用户想在夜间执行长任务时。这是
ForegroundService
@Mehran不,不是。您需要创建一个通知并调用
startForeground
,检查文档:对不起,为了便于阅读,我删除了通知代码。请改用WorkManager?它取代了AlarmManager和JobScheduler。