私のフォアグラウンドスティッキサービスは数時間後に再起動せずに強制終了されます。私はこれが何度か尋ねられたことを知っています。私は自分のデバイス上のすべてのチェックを読み、確認しました。これは、Huaweiデバイスでのみ発生するように注意することが重要です。フォアグランドサービスがHuawei(GRA-UL00)で保護されたアプリケーションを有効にしました
私は次のような詳細を提供することができます。
定期サービス
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シェルdumpsys活性プロセス> tmp.txt =>「PROC#1の
エントリtmp.txt:PRCP T/S/SFのTRM:0 14790:私Settiで保護されたアプリのリストにForeground service being killed by Android
追加のMyApp:.app.package.indentifier/u0a172(FG-サービス)」
上記のエントリは、ここで受け入れ答えに基づいています
設定 - >詳細設定 - >電源プラン(パフォーマンス)で使用されているパフォーマンス(最も低い設定)
[詳細設定] - > [詳細設定] - > [バッテリマネージャ] - >デバイス情報
モデル番号:HUAWEI GRA-UL00
EMUIバージョン:4.0.1 EMUI
Androidのバージョン:6.0
その他の注意事項:
低メモリは、onTrimMemoryが終了する前に呼び出されません。いずれにしても、アプリをバックグラウンドで生き残るためにアプリを最小限にとどめたので、ここではメモリが問題にならないはずです。
ユーザーが明示的にアプリケーションを再起動しない限り、スティッキサービスは再起動されません。
アラームマネージャは、サービスを再起動/再作成するよう呼び出されません。 setExactAndAllowWhileIdle()も機能しません。サービスはフォアグラウンド優先サービスであるため、Dozeモードの影響を受けないため、関連性がありません。
サービスは、終了するまで最大12時間しか実行できません。これが起こったとき、バッテリーは65%を超えました。
このアプリケーションは研究プロジェクト用であるため、サービスを無期限に実行する必要があります。
これ以外に何かできますか、これは開発者が何もできない特定のHuawei Androidの変更ですか?繰り返し願いますが、この問題はHuaweiデバイスでのみ発生します。
これについてさらに深い理解を深めることができます。
ちょっとQin Zhengquan、 あなたはhuawei 6.0電話のバックグラウンドサービスの問題を解決しましたか? GCMとGoogle APIクライアントの位置情報サービスでも同じ問題が発生しています。 また、アプリケーションがタスクから終了すると、実際にプロセスが終了します。このため、私は位置更新を取得しませんでした。 –
私はこれを本当に解決することはできませんでしたが、次のようにしてデバイスのプロセス寿命を延ばすことができました。 1.メモリフットプリントの削減 2.消費電力の削減 3.フォアグラウンドサービスの使用 4設定 - >詳細設定 - >バッテリーマネージャー - >保護されたアプリケーション(画面の電源を切ってもアプリケーションの実行を継続できるようにする) - この手順をバイパスする方法はありません。これを有効にする必要があります。そうしないと、アプリはバックグラウンドで実行されません。 Huaweiのバックグラウンドでアプリを稼働させておくことができる最長の記録は、終了する前に12時間でした。 –
ありがとう。 Huaweiはちょうどうそつきです。 –