我的前台粘性服务在几个小时后被杀死,没有重新启动。我知道这已经被问过几次了,我已经阅读并验证了设备上的所有检查。需要注意的是,这似乎只发生在华为设备上。
因此,请允许我提供以下细节。
周期性服务
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();
}
}
定期闹钟管理器
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 processes > 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
在设置->高级设置 ->电池管理器 ->受保护的应用程序列表(允许应用程序在屏幕关闭后继续运行)中将MyApp添加到受保护的应用程序列表中。
在设置->高级设置 ->电源计划(性能)中使用性能(最低设置)。
设备信息
型号编号:HUAWEI GRA-UL00
EMUI版本:EMUI 4.0.1
Android版本:6.0
其他注意事项:
内存较低,无法在终止之前调用onTrimMemory。无论如何,我仅保留了应用程序的最基本功能,以使应用程序在后台保持活动状态,因此内存应该不是问题。
粘性服务只有在用户明确重新启动应用程序时才会重新启动。Alarm Manager不会被调用以重新启动/重新创建服务。setExactAndAllowWhileIdle()也无法工作,并且应该与服务为前台优先级服务无关,因此不应受到待机模式的影响。
服务只能运行最多12小时,然后被终止。当此问题发生时,电池电量高于65%。
由于此应用程序是研究项目,因此需要将服务无限期地保持活动状态。
是否有其他解决方案,或者这是华为Android修改的特定问题,开发人员无能为力。再次强调,此问题仅在华为设备上发生。
非常感谢您提供的任何额外见解!