Android Service使用


サービスは非アクティブなActivityよりも優先度が高いため、システムがリソースを要求すると終了する可能性が最も低く、システムがサービスを早期に終了すると、システムがリソースが十分な場合にサービスを再起動します.ActivityやBroadcast Receiverのように、アプリケーションのプライマリ・スレッドの下で実行されます.アプリケーションがタイムリーに応答できるように、ThreadクラスとAsyncThreadクラスを使用してプロセスをバックグラウンドスレッドに移動します.
サービスがユーザと直接やり取り(音楽の再生など)する必要がある場合は、このサービスをフロントコンポーネントとして識別し、優先度を高める必要があります.これにより、極端な場合を除いて、サービスが終了しないことが保証されます.しかし、これにより、実行時にリソースを管理する能力が低下し、ユーザー体験が低下する可能性があります.
サービスの作成と制御
サービスを作成するには、サービスクラスを拡張する必要があります.onCreateメソッドとonBindメソッドを書き換える必要があります.
サービスクラスを作成した後、1つのサービスを使用するには、登録する必要があります.manifestファイルの下のアプリケーションで登録する必要があります.
サービスが独自のサービスでのみ起動および停止できるようにするには、サービスノードの下にpermissionプロパティを追加する必要があります.
サードパーティ製アプリケーションが制限されたサービスにアクセスする場合は、manifestファイルの下でuses-permissionプロパティを構成する必要があります.
サービスを実行し、再起動動作を制御します.
onStartCommandイベントハンドラを書き換え、サービスがstartServiceによって起動されると、onStartCommandメソッドが呼び出され、このメソッドは複数回実行される可能性があります.onStartCommandは、プライマリ・スレッドから実行されます.onStartCommandメソッド内で新しいスレッド実行ハンドラを作成し、そのスレッドの実行が完了した後にServiceを終了することが望ましいです.
onStartCommandメソッドは、API Level 5(android 2.0)以降に導入されたもので、onStartイベントの代わりにonStartと同じ機能を提供し、stopServiceまたはstopSelfの呼び出しを表示する前にサービスを終了した場合、どのようにサービスを再起動するかをシステムに伝えることができます.
@Overvider
public int onStartCommand(Intent intent, int flags, int startId) {
    startBackgroundTask(intent, startId);
    return Service.START_STICKY;
}

戻りパラメータは、サービスの再起動動作を制御します.定数リストは次のとおりです.
  • START_STICKYは、実行時にサービスを終了した後、サービスを再起動するとonStartCommandを呼び出します.サービスを再起動すると、onStartCommandに入力されるIntentパラメータはnullになります.このモードは、通常、自身のステータスのサービスと、必要に応じてstartServiceおよびstopServiceを介して明示的に起動および終了するサービスとを処理するために使用されます.
  • START_NOT_STICKYこのモードは、特殊な操作やコマンドを処理するためのサービスを開始するために使用されます.通常、コマンドが完了すると、これらのサービスはstopSelfを呼び出して自分を終了します.実行時に終了すると、処理されていない起動呼び出しがある場合にのみ、このモードのサービスが再起動されます.サービスが終了した後にstartServiceが行われない場合、onStartCommandを呼び出すことなく、サービスは停止します.更新やネットワークポーリングのような特定のリクエストを処理する定期的なビジネスでは、サービスを停止すると、リソース競合が発生したときに再起動することなく、次の呼び出し間隔で再起動を試みる理想的なモードです.
  • START_REDELIVER_INTENTは、時効性が重要な場合など、サービスから要求されたコマンドが完了していることを確認する必要がある場合があります.このモードは、サービスが実行されたときに終了すると、処理されていない起動呼び出しまたはstopSelfが呼び出される前にプロセスが終了する場合にのみ、サービスが再起動される前の2つの組み合わせです.後者の場合、onStartCommandが呼び出され、処理が正常に完了していないIntentが送信されます.

  • 処理が完了すると、stopServiceとstopSelfを使用してサービスを明示的に停止する必要があります.
    Android 2.0(API Level 5)の前に、サービスはonStartイベントをトリガーして操作を実行しますが、onStartメソッドを実装するとonStartCommandがSTART_に戻るのと同じです.STICKY.
    初回起動時にstartServiceにIntentが送信されてサービスが開始され、システムが再起動するとSTART_にIntentが送信されます.STICKYモードでnull、START_REDELIVER_INTENTモードは元のIntentになります.
    flagパラメータを使用して、サービスを起動する方法を見つけることができます.
  • START_FLAG_REDELIVERは、stopSelfを呼び出してサービスを明示的に停止する前に、Intentパラメータがシステムの実行時に終了したために再起動されたことを示します.
  • FLAG_REIRYは、サービスが異常終了後に再起動されたことを示し、サービスが前にSTART_に設定されている場合STICKYでは、このフラグが入ります.

  • サービスの起動と停止
    サービスを起動するにはstartServiceを呼び出す必要があります.Activityと同様に、適切なIntent Receiverを登録した後に操作を使用して暗黙的にサービスを開始することも、明示的にサービスのクラス名を指定してサービスを開始することもできます.アプリケーションがこのサービスに必要な権限を持っていない場合、SecurityException例外が放出されます.
    private void explicitStart() {
        //     
        Intent intent = new Intent(this, MyService.class);
        startService(intent);
    }
    
    private void implicitStart() {
        //            
        Intent intent = new Intent(MyMusicService.PLAY_ALBUM);
        intent.putExtra(MyMusicService.ALBUM_NAME_EXTRA, "United");
        intent.putExtra(MyMusicService.ARTIST_NAME_EXTRA, "Pheonix");
        startService(intent);
    }
    

    サービスの停止:
    //     
    stopService(new Intent(this, MyService.class));
    
    //     
    Intent intent = new Intent(MyMusicService.PLAY_ALBUM);
    stopService(intent);
    

    startServiceはネストできないため、startServiceが何回実行されてもstopServiceにとって1回実行すればサービスを閉じることができます.
    サービス処理が完了すると、サービスを明示的に停止し、stopSelfを実行して終了することができます.この場合、パラメータを入力せずに、サービスを強制的に終了することができます.また、startId値を入力して、現在呼び出されている各startServiceインスタンスの処理が完了していることを確認することもできます.
    Activityへのサービスのバインド
    サービスはActivityにバインドでき、後者は前者のインスタンスへの参照を維持します.このリファレンスを使用すると、他のインスタンス化クラスのように、実行中のServiceをメソッド呼び出します.
    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }
    
    public class MyBinder extends Binder {
        public MyMusicService getService() {
            return MyMusicService.this;
        }
    }
    
    private final IBinder binder = new MyBinder();
    

    startServiceがActivityを終了してもdestroyサービスstopServiceは終了しません
    bindServiceはActivityをリリースするとdestroy service unbindServiceになります
    両方ともサービスを開始できます.異なるのは、1つの市が現在のactivityにバインドされ、もう1つはグローバルです.現在のサービスと通信する必要がある場合は、このサービスにバインドする必要があります.