我的前台粘性服务在几个小时后被杀死而没有重新启动。我知道这已被问了几次,我已经阅读并验证了我设备上的所有检查。重要的是要注意,这似乎只发生在华为设备上。
因此,请允许我提供以下详细信息。
定期服务
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活动流程> 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在终止之前不会被调用。在任何情况下,我都将应用程序剥离到最低限度,只是为了让应用程序在后台运行,因此内存不应成为问题。
除非用户明确重新启动应用,否则永远不会重启Sticky Service。
不会调用警报管理器来重新启动/重新创建服务。 setExactAndAllowWhileIdle()也不起作用,因为该服务是前台优先服务,所以应该是无关紧要的,因此不应受打盹模式的影响。
服务只能在终止前最多12小时运行。发生这种情况时电池电量高于65%。
由于此应用程序适用于研究项目,因此需要使服务无限期运行。
我还能做什么,或者这是开发人员无能为力的特定华为Android修改。重申一下,这个问题只发生在华为设备上。
欣赏对此的任何其他见解!
答案 0 :(得分:0)
你绝对确定你需要唤醒锁吗?我有类似的服务,我注意到它即使没有唤醒锁也能正常工作。这post声称凶手是唤醒者。 我尝试过我的过程,过去几分钟就被杀死,现在已经运行了几个小时。
答案 1 :(得分:0)
华为 - >有电池设置,但它不是省电模式。在此电池设置屏幕下,有子菜单调用"受保护的应用程序" (不确定名称)。你需要允许你的应用受到保护,以防止华为在锁定屏幕后杀死应用程序。
答案 2 :(得分:0)
听起来你的应用程序被华为PowerGenie杀死,因为它无限期地保持唤醒锁定。如果您无法避免使用唤醒锁定,请参阅my answer to a similar question了解解决方法。