2016-06-29 9 views
7

私は起動時に起動するサービスだけのアプリを持っています。私はシステムレベルで開発していますので、私のサービスがメモリ圧迫のもとで殺されないようにするためにandroid:persistent=trueを使用しています。"android:persistent = true"システムレベルのアプリケーションを強制終了できますか?

しかし、私はの条件の下で私のサービスを殺すことができないことがわかりました。私はまだ自分でそれを殺すことができるようにしたい - これを行う方法があるのか​​、それともマニフェストに "persistent = true"が定義されているので不可能か?

これができない場合、私のプロセスがメモリ不足で死ぬのを防ぐにはどうすればいいですか?手作業で優先度を定義できますか?おそらくoom_scoreか何か?

+0

killBackgroundProcesses(packageName)は機能しますか? – Memme

+0

'stopSelf()'を呼び出すとサービスが停止します。それとも本当に必要なのですか? – ozbek

+0

@Ozbek - 私は貴重な1MBのメモリを節約するためにプロセスを殺す必要があります。 –

答えて

3

それを実演しました。サービスを停止するほとんどの方法は、持続フラグの再起動を停止しません。これには、stopService、killBackgroundService、さらにSystem.exit(0)が含まれます。

ActivityManagerServiceにforceStopPackageという隠し機能があり、これをリフレクションによってActivityManagerインターフェイスから呼び出すことができます。システム権限が必要ですが、永続性を使用している場合は問題ありません。マニフェストに

<uses-permission android:name="android.permission.FORCE_STOP_PACKAGES" tools:ignore="ProtectedPermissions"></uses-permission> 

これは、プロセスを強制終了します。プロセス/パッケージの名前を付けてください。最も優先度の高いプロセス -

try { 
     Class c; 
     c = Class.forName("android.app.ActivityManager"); 
     Method m = c.getMethod("forceStopPackage", new Class[]{String.class}); 
     Object o = m.invoke(null, new Object[]{"com.your.process"}); 
    }catch (Exception e){ 
      Log.e(TAG, "Failed to kill service", e); 
} 
0
android:persistent=true 

作品は、プリロードアプリケーションのために、フォアグラウンドサービスのメソッドを使用する (APKまたはASからインストールPlayストアから例えばアプリ)ダウンロードしたアプリケーションのための提案は動作しません。 Official example here,Another full-code example here

関連する問題