0

インストールされている他のアプリケーションを起動できる Android アプリケーションがあります。これには、アプリケーションの実行中に常に実行されるバックグラウンド サービスがあります。一部のデバイスでテストすると、カメラ、ギャラリーなどのアプリケーションの起動中にメモリ不足が原因でサービスが停止することがあることに気付きました。 (アルバム)etc...だからやってみた

private boolean isRunningOutOfMemory(){
    MemoryInfo memoryInfo = new MemoryInfo();
    ActivityManager activityManager = (ActivityManager)getSystemService(Service.ACTIVITY_SERVICE);
    activityManager.getMemoryInfo(memoryInfo);
    final long appMemeory = Runtime.getRuntime().totalMemory();
    final long availableMemory = memoryInfo.availMem / 1048576L;
    final long memoryThreshold = ((memoryInfo.threshold * 2) + appMemeory) / 1048576L;
    return (availableMemory <= memoryThreshold);
}

条件が true の場合にダイアログを表示しました。このメソッドは常にバックグラウンドで実行されています。また、この条件が正常に機能しない場合があります。つまり、使用可能なメモリがしきい値の 2 倍を超えると、サービスが停止します。

この使用可能なメモリは、起動された他のアプリケーション (私のアプリケーションから起動されたアプリケーション) がない場合、つまり、実行中のアプリケーションが私のものである場合に異なります。

使用可能なメモリがこのように変動する理由は何ですか?

サービスが停止するメモリを見つけることは可能ですか?

この状況を効率的に処理するにはどうすればよいですか?

前もって感謝します

4

1 に答える 1

0

Android システムは、より多くのメモリが必要であると判断したときはいつでもプロセスを強制終了できます。ヒント (サービスを「フォアグラウンド」とマークするなど) を追加できますが、システムはいつでも自由に強制終了できます。

実行中のバックグラウンド サービスは、バックグラウンド サービスだけではありません。ほとんどの場合、他の多くのアプリケーションは、新しいデータを取得するために、スケジュールされた間隔で実行されるようにサービスをセットアップします (できれば、wait() ループではなく Android アラームを使用します...)。他のアプリケーションは、システムまたは Google クラウド メッセージングによってインテントが送信されたときにインスタンス化および実行されるブロードキャスト レシーバーをセットアップする場合があります。

とてもダイナミックです。サービス (およびアプリケーション全体) は、いつでも停止できるように準備する必要があります。「フォアグラウンド」とマークすると優先度が上がりますが、曲の再生やファイルのダウンロードなど、ユーザーが開始した何かにサービスが関連している場合にのみこれを行う必要があります。

もう1つ-サービスからのダイアログを表示しないでください! これは、他のアプリケーションを使用しているときに発生する可能性があるため、ユーザーにとって非常に不快です。サービスで起こっていることをユーザーに通知する必要がある場合は、通知を送信します。

于 2013-05-14T05:47:31.080 に答える