フォアグラウンドのスティッキー サービスは、再起動せずに数時間後に強制終了されます。これは数回尋ねられたことを知っており、デバイスのすべてのチェックを読み、確認しました。これは Huawei デバイスでのみ発生するようであることに注意することが重要です。
そのため、次の詳細を提供させてください。
定期サービス
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 シェル 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 は再起動されません。
Alarm Manager は、サービスの再起動/再作成のために呼び出されません。setExactAndAllowWhileIdle() も機能せず、このサービスはフォアグラウンド優先サービスであるため関係がなく、Doze モードの影響を受けません。
サービスは、終了する前に最大 12 時間のみ実行できます。これが発生したとき、バッテリーは 65% を超えていました。
このアプリは研究プロジェクト用であるため、サービスを無期限に実行し続けることが要件です。
他にできることはありますか、それとも開発者が何もできない特定の Huawei Android の変更ですか。繰り返しますが、この問題は Huawei デバイスでのみ発生します。
これに関する追加の洞察に感謝します!