7

私のフォアグラウンドスティッキサービスは数時間後に再起動せずに強制終了されます。私はこれが何度か尋ねられたことを知っています。私は自分のデバイス上のすべてのチェックを読み、確認しました。これは、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デバイスでのみ発生します。

これについてさらに深い理解を深めることができます。

+0

ちょっとQin Zhengquan、 あなたはhuawei 6.0電話のバックグラウンドサービスの問題を解決しましたか? GCMとGoogle APIクライアントの位置情報サービスでも同じ問題が発生しています。 また、アプリケーションがタスクから終了すると、実際にプロセスが終了します。このため、私は位置更新を取得しませんでした。 –

+2

私はこれを本当に解決することはできませんでしたが、次のようにしてデバイスのプロセス寿命を延ばすことができました。 1.メモリフットプリントの削減 2.消費電力の削減 3.フォアグラウンドサービスの使用 4設定 - >詳細設定 - >バッテリーマネージャー - >保護されたアプリケーション(画面の電源を切ってもアプリケーションの実行を継続できるようにする) - この手順をバイパスする方法はありません。これを有効にする必要があります。そうしないと、アプリはバックグラウンドで実行されません。 Huaweiのバックグラウンドでアプリを稼働させておくことができる最長の記録は、終了する前に12時間でした。 –

+0

ありがとう。 Huaweiはちょうどうそつきです。 –

答えて

0

あなたは絶対にウォークロックが必要ですか?私は似たようなサービスを持っており、ウォークロックがなくても動作することに気づきました。このpostは、殺人犯がウォークロックであると主張しています。 数分で死亡していた私のプロセスを試してみましたが、現在は何時間も稼働しています。

0

Huawei - >バッテリ設定がありますが、省電力モードではありません。このバッテリー設定画面の下に、サブメニュー呼び出し "Protected App"(名前がわからない)があります。画面をロックした後にHuawei kill appを防ぐためにあなたのアプリを保護する必要があります。

+1

こんにちは、Jonz、私はすでにProtected Appに追加しました。これは、最大12時間のロック画面の後、バックグラウンドで実行されます。問題は、他のAndroid搭載端末とは違って、それ以上のことはできないということです。 –

+0

このコードでは、サービスをforegorundとして開始していません。 –

0

あなたのアプリが無期限にウェイクロックを保持しているため、アプリケーションがHuawei PowerGenieによって殺されているようです。ウェイクロックの使用を避けることができない場合は、回避策としてmy answer to a similar questionを参照してください。

関連する問題