gpt4 book ai didi

android - 前台服务在华为 (GRA-UL00) 上终止 - 已启用 protected 应用程序

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:44:29 24 4
gpt4 key购买 nike

我的前台粘性服务在几个小时后被终止而没有重新启动。我知道这个问题已经被问过几次了,我已经阅读并验证了我设备上的所有检查。需要注意的是,这似乎只发生在华为设备上。

所以请允许我提供以下详细信息。

定期服务

public class PeriodicService extends Service {
@Override
public void onCreate() {
super.onCreate();
acquireWakeLock();
foregroundify();
}

private void foregroundify() {
// Omitted for brevity. Yes it does starts a foreground service with a notification
// verified with adb shell dumpsys activity processes > tmp.txt
// entry in tmp.txt => "Proc # 1: prcp T/S/SF trm: 0 14790:my.app.package.indentifier/u0a172 (fg-service)"
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
acquireWakeLock();
if (!isServiceRunningInForeground(this, this.getClass())){
foregroundify();
}

PeriodicAlarmManager alarmManager = PeriodicAlarmManager.get(this);
alarmManager.setAlarm();
return START_STICKY; // after a few hours, service terminates after this returns. verified in my local logs
}

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

@Override
public void onDestroy() {
releaseWakeLock();
stopForeground(true);
super.onDestroy();
}

}

PeriodicAlarmManager

public void setAlarm() {
Intent intent = new Intent(mContext, PeriodicAlarmReceiver.class);
intent.setAction("repeat");
mAlarmIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0);
mAlarmManager.cancel(mAlarmIntent);
long triggerAtMillis = System.currentTimeMillis() + ALARM_INTERVAL_MINUTES;

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
mAlarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerAtMillis, mAlarmIntent);
} else {
mAlarmManager.set(AlarmManager.RTC_WAKEUP, triggerAtMillis, mAlarmIntent);
}

ComponentName receiver = new ComponentName(mContext, PeriodicBootReceiver.class);
PackageManager pm = mContext.getPackageManager();

pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}

PeriodicAlarmReceiver

public class PeriodicAlarmReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent service = new Intent(context, PeriodicService.class);
service.putExtra("source", "PeriodicAlarmReceiver");
intent.getAction()));
startWakefulService(context, service);
}
}

申请

    public class MyApp extends Application {

@Override
public void onCreate() {
super.onCreate();
}

@Override
public void onLowMemory(){
super.onLowMemory(); // never gets called
}

@Override
public void onTrimMemory(int level){
super.onTrimMemory(level); // only gets called on app launch
}

@Override
public void onTerminate() {
super.onTerminate();
}
}

adb shell dumpsys Activity 进程 > tmp.txt

tmp.txt 中的条目 => "Proc#1: prcp T/S/SF trm: 0 14790:my.app.package.indentifier/u0a172 (fg-service)"

以上条目基于此处接受的答案:Foreground service being killed by Android

在设置->高级设置->电池管理器-> protected 应用程序中将MyApp添加到 protected 应用程序列表中(允许应用程序在屏幕关闭后继续运行)

在设置-> 高级设置-> 电源计划(性能)中使用的性能(最低设置)

设备信息

型号:华为GRA-UL00

EMUI版本:EMUI 4.0.1

安卓版本:6.0

其他注意事项:

内存不足,在终止之前不会调用 onTrimMemory。无论如何,我将应用程序剥离到最低限度,只是为了让应用程序在后台保持 Activity 状态,因此内存在这里应该不是问题。

除非用户明确重新启动应用程序,否则粘性服务永远不会重新启动。

没有调用警报管理器来重新启动/重新创建服务。 setExactAndAllowWhileIdle() 也不起作用,并且应该无关紧要,因为该服务是前台优先服务,因此不应受到打瞌睡模式的影响。

服务最多只能运行 12 小时后终止。发生这种情况时电池电量超过 65%。

由于此应用程序用于研究项目,因此必须保持服务无限期运行。

还有什么我可以做的吗,或者这是开发人员无能为力的特定华为 Android 修改。重申一下,此问题仅发生在华为设备上。

感谢对此的任何额外见解!

最佳答案

您确定需要唤醒锁吗?我有类似的服务,我注意到即使没有唤醒锁也能正常工作。这post声称 killer 是唤醒锁。我已经尝试过我的进程,它曾经在几分钟内被杀死,现在已经运行了几个小时。

关于android - 前台服务在华为 (GRA-UL00) 上终止 - 已启用 protected 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40276458/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com