4

http://developer.android.com/reference/android/app/Service.htmlhttp://developer.android.com/guide/components/services.htmlを読ん で、2 つの重要な声明を読みました

。1) 2 つあります。システムがサービスを実行できる理由。誰かが Context.startService()を呼び出すと、システムはサービスを取得し (サービスを作成し、必要に応じて onCreate() メソッドを呼び出します)、クライアントから提供された引数を使用して onStartCommand(Intent, int, int) メソッドを呼び出します。この時点で、サービスは Context.stopService() または stopSelf() が呼び出されるまで実行を続けます。

2) 開始されたサービスは、startForeground(int, Notification) API を使用して、サービスをフォアグラウンド状態にすることができます。システムは、ユーザーが積極的に認識しているものと見なし、メモリが不足しているときに強制終了する候補ではありません。(理論的には、現在のフォアグラウンド アプリケーションからの極度のメモリ不足でサービスが強制終了される可能性はありますが、実際にはこれは問題になりません。)

私の目的は、別のプロセスで実行されるリモート サービスを作成することです (android:process を宣言します)。 Android SO がメモリを再利用しない限り、プロセスが常にアクティブであることを確認します。

どのような禁忌があり、これら 3 つの異なる実装の違いは何ですか?

onBind() から startService() を呼び出す:

public class ExampleService extends Service {

    ...

    @Override
    public IBinder onBind(Intent intent) {
        startService(new Intent(this, ExampleService.class));
        return mBinder;
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    ...

}

onCreate() から startForegorund() を呼び出す:

public class ExampleService extends Service {

    ...

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        ...
        startForeground(ord, note);
    }

    ...

}

onCreate() から startForegorund() を呼び出し、onBind() から startService を呼び出します。

public class ExampleService extends Service {

    ...

    @Override
    public IBinder onBind(Intent intent) {
        startService(new Intent(this, ExampleService.class));
        return mBinder;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        ...
        startForeground(ord, note);
    }

    ...

}

クライアントは、bindService() を呼び出して IBinder を使用して、このサービスを使用します。

4

1 に答える 1

0

私はこの 3 つのユース ケースについてより多くの情報を持っています。私はこの 3 つのケースを試しました。それぞれについて、アプリを起動し、サービスをバインドし、アクティビティをバックグラウンドに置いた後 (ホーム ボタンを押す)、「dumpsys アクティビティ プロセス」を実行しました。

最初のケース (onBind() で startService() を呼び出すだけ):

*APP* UID 10137 ProcessRecord{40b01d30 6719:com.mypackage:service_process/10137}            
    class=com.mypackage.app.MyApp                                                             
    dir=/data/app/com.mypackage-1.apk publicDir=/data/app/com.mypackage-1.apk data=/data/data/com.mypackage
    packageList=[com.mypackage]                                                               
    thread=android.app.ApplicationThreadProxy@40d1b540 curReceiver=null                       
    pid=6719 starting=false lastPss=0                                                         
    lastActivityTime=-1m42s491ms lruWeight=671144 keeping=true hidden=false empty=true        
    oom: max=15 hidden=8 curRaw=4 setRaw=4 cur=4 set=4                                        
    curSchedGroup=1 setSchedGroup=1                                                           
    setIsForeground=false foregroundServices=false forcingToForeground=null                   
    persistent=false removed=false                                                            
    adjSeq=5157 lruSeq=1017                                                                   
    lastRequestedGc=-1m46s82ms lastLowMemory=-1m46s82ms reportLowMemory=false                 
    services=[ServiceRecord{40a68aa0 com.mypackage/.model.page.ServerConnection}]             
    connections=[ConnectionRecord{40d11118 com.mypackage/.util.CommonService:@40d12928}, ConnectionRecord{40bca008 com.mypackage/.model.page.ServerConnection:@40d0bd08}, ConnectionRecord{40d64030 com.mypackage/.util.log.LoggerService:@40d34b38}]

Running processes (most recent first):                                                      
    Proc #16: adj=svc  /B 40b01d30 6719:com.mypackage:service_process/10137 (started-services)

2 番目のケース (onCreate() で startForeground() のみを呼び出す):

*APP* UID 10137 ProcessRecord{40c47420 7921:com.mypackage:service_process/10137}
    class=com.mypackage.app.MyApp
    dir=/data/app/com.mypackage-2.apk publicDir=/data/app/com.mypackage-2.apk data=/data/data/com.mypackage
    packageList=[com.mypackage]
    thread=android.app.ApplicationThreadProxy@40a044c8 curReceiver=null
    pid=7921 starting=false lastPss=0
    lastActivityTime=-27s701ms lruWeight=1232643 keeping=true hidden=false empty=false
    oom: max=15 hidden=8 curRaw=2 setRaw=2 cur=2 set=2
    curSchedGroup=0 setSchedGroup=0
    setIsForeground=false foregroundServices=true forcingToForeground=null
    persistent=false removed=false
    adjSeq=6068 lruSeq=1170
    lastRequestedGc=-32s123ms lastLowMemory=-32s123ms reportLowMemory=false
    services=[ServiceRecord{40b3b1d0 com.mypackage/.model.page.ServerConnection}]
    connections=[ConnectionRecord{40b18da8 com.mypackage/.util.log.LoggerService:@40b18b88}, ConnectionRecord{40c86fa0 com.mypackage/.model.page.ServerConnection:@40c86d80}, ConnectionRecord{40c869a0 com.mypackage/.util.CommonService:@409626c8}]

Running processes (most recent first):
    Proc #18: adj=prcp /F 40c47420 7921:com.mypackage:service_process/10137 (foreground-service)

3 番目のケース (onBind() 内の startService() および onCreate() 内の startForeground() のいずれかを呼び出す):

*APP* UID 10137 ProcessRecord{40d35d30 8407:com.mypackage:service_process/10137}
    class=com.mypackage.app.MyApp
    dir=/data/app/com.mypackage-1.apk publicDir=/data/app/com.mypackage-1.apk data=/data/data/com.mypackage
    packageList=[com.mypackage]
    thread=android.app.ApplicationThreadProxy@40a6f7a0 curReceiver=null
    pid=8407 starting=false lastPss=0
    lastActivityTime=-6s98ms lruWeight=1423485 keeping=true hidden=false empty=false
    oom: max=15 hidden=7 curRaw=2 setRaw=2 cur=2 set=2
    curSchedGroup=0 setSchedGroup=0
    setIsForeground=false foregroundServices=true forcingToForeground=null
    persistent=false removed=false
    adjSeq=6565 lruSeq=1289
    lastRequestedGc=-10s334ms lastLowMemory=-10s334ms reportLowMemory=false
    services=[ServiceRecord{40ba7650 com.mypackage/.model.page.ServerConnection}]
    connections=[ConnectionRecord{40ac5408 com.mypackage/.model.page.ServerConnection:@40ac5228}, ConnectionRecord{40c760e8 com.mypackage/.util.CommonService:@40c31fa8}, ConnectionRecord{40c31c00 com.mypackage/.util.log.LoggerService:@40bc4bf0}]

Running processes (most recent first):
    Proc #13: adj=prcp /F 40d35d30 8407:com.mypackage:service_process/10137 (foreground-service)

デフォルトのケース (startService() と startForeground() を呼び出さず、バインド サービスのみ):

*APP* UID 10137 ProcessRecord{40c3eb78 5609:com.mypackage:service_process/10137}
    class=com.mypackage.app.MyApp
    dir=/data/app/com.mypackage-2.apk publicDir=/data/app/com.mypackage-2.apk data=/data/data/com.mypackage
    packageList=[com.mypackage]
    thread=android.app.ApplicationThreadProxy@40a34c90 curReceiver=null
    pid=5609 starting=false lastPss=0
    lastActivityTime=-5m31s175ms lruWeight=227344 keeping=false hidden=true empty=true
    oom: max=15 hidden=7 curRaw=7 setRaw=7 cur=7 set=7
    curSchedGroup=1 setSchedGroup=1
    setIsForeground=false foregroundServices=false forcingToForeground=null
    persistent=false removed=false
    adjSeq=4483 lruSeq=887
    lastWakeTime=0 time used=0
    lastCpuTime=0 time used=0
    lastRequestedGc=-2m1s649ms lastLowMemory=-6m7s191ms reportLowMemory=false
    services=[ServiceRecord{40d559b8 com.mypackage/.model.page.ServerConnection}]
    connections=[ConnectionRecord{40beeef0 com.mypackage/.model.page.ServerConnection:@40bd4620}, ConnectionRecord{40bc4c60 com.mypackage/.util.CommonService:@40b69ea0}, ConnectionRecord{40ac74b0 com.mypackage/.util.log.LoggerService:@40ab5d60}]

Running processes (most recent first):
    Proc #22: adj=bak+3/B 40c3eb78 5609:com.mypackage:service_process/10137 (bg-empty)

最も重要なことは、すべてのケースで変化し、これらの値を想定するadj の値だと思います。

1) サービス

2) prcp

3) バク

于 2013-05-26T15:00:57.167 に答える