Androidでのサービスの使い方(Service)について

8596 ワード

Androidサービス(Service)は、ユーザーと対話する必要がなく、長期的な運用を求めるタスクを実行するのに適しています.サービスの実行は、任意のユーザーインタフェースに依存せず、APPがバックグラウンドに切り替えられたり、別のAPPが開かれたりしても、サービスは正常に動作します.
しかし、あるアプリプロセスが殺されると、このアプリが作成したすべてのサービスが停止します.
また、サービス自体はスレッドを自動的に開くことはなく、サービスコードはデフォルトでプライマリスレッドで実行されます.したがって、実行するビジネスロジックに時間がかかる場合は、プライマリ・スレッドがブロックされないように、これらのビジネスロジックを実行するために、サービス内にサブスレッドを作成する必要があります.
1サービスの定義
Android Studioでは、File→New→Service→Serviceでサービスを作成できます.
ポップアップ・ダイアログ・ボックスでサービスを構成するには、次の手順に従います.
サービス名を設定します.次の2つの構成項目は、*Exported:現在のプログラム以外のプログラムがこのサービスにアクセスできるかどうかを示します.(デフォルトチェック)*Enabled:このサービスを有効にするかどうか.(デフォルトチェック)
public class FirstService extends Service {

    private static final String TAG = "FirstService";

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
    }

    public FirstService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

作成したサービスはサービスから継承され、onBind()メソッドを実装する必要があります.ここでは、以下の方法を書き直しました.
方法
説明
void onCreate()
サービス作成時にメソッドが呼び出されます.
onStartCommand(Intent intent, int flags, int startId)
このメソッドは、サービスが開始されるたびに呼び出されます.
void onDestroy()
サービス破棄時にメソッドが呼び出されます.
これらの方法にログを追加し,実行結果の観察を容易にした.
また、このクラスの任意の場所でstopSelf()メソッドを呼び出すと、サービスは自分で停止します.
サービスを定義したらAndroidManifestが必要です.xmlに登録されているサービス(Android Studioを使用している場合は、このステップが役立ちます):
<service
    android:name=".FirstService"
    android:enabled="true"
    android:exported="true">service>

2サービスの開始または停止
Intentを借りて、私达はサービスのスタートと停止を制御することができますO(∩∩)Oハハ~
final Context context = this;
findViewById(R.id.start_service).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //    
        startService(new Intent(context, FirstService.class));
    }
});
findViewById(R.id.stop_service).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //    
        stopService(new Intent(context, FirstService.class));
    }
});

ここでのstartService()およびstopService()メソッドはいずれもContextクラスに定義されているので、アクティブクラスで直接呼び出すことができる.
実行結果:
D/FirstService: onCreate D/FirstService: onStartCommand D/FirstService: onDestroy
**注意:**onCreate()はサービスの最初の作成時に呼び出され、onStartCommand()はサービスの開始時に呼び出されます.
サービス開始後、AndroidのSettings→Developer opinions→Running servicesで見つけることができます.
アプリをクリックすると、サービスの詳細が表示されます.
Developer opinionsオプションが見つからない場合は、AndroidのSettings→About emulated device→Build numberを複数回クリックして開発者モードを開くことができます.
3活動管理サービス
アクティビティは、ServiceConnectionインタフェースを実装することによってサービスに接続され、以下の2つの方法を含む.
方法
説明onServiceConnected(ComponentName name, IBinder service)
サービスバインド後にメソッドが呼び出されます.onServiceDisconnected(ComponentName name)
サービスがバインド解除された後にメソッドが呼び出されます.
サービスは、IBinder onBind(Intent intent)メソッドを実装することによって、onServiceConnected()メソッドに必要なIBinder型のサービスパラメータに変換される.
まず、サービスクラスを変更します.
public class FirstService extends Service {
  class CustomBinder extends Binder {

        public void init(){
            Log.d(TAG, "init CustomBinder");
        }

    }

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

ここでは,簡単な初期化法を実装する内部クラスCustomBinderを定義した.次にonBind()メソッドでそのインスタンスを返します.
次に、アクティビティクラスを変更し、ServiceConnectionインスタンスを作成します.
private ServiceConnection connection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        Log.d(TAG, "onServiceConnected");
        FirstService.CustomBinder customBinder = (FirstService.CustomBinder) service;
        customBinder.init();
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        Log.d(TAG, "onServiceDisconnected");
    }
};

サービスはServiceConnectionインスタンスによってバインドまたはバインド解除できます.
バインドサービス:
bindService(new Intent(context, FirstService.class), connection, BIND_AUTO_CREATE);

bindServiceは3つのパラメータを受信します.
パラメータ
を選択します.
説明
service
Intent
このIntentは、現在のアクティブクラスとサービスクラスをバインドします.
conn
ServiceConnection
ServiceConnectionオブジェクト.
flags
int
サービスをバインドする方法.ここのBIND_AUTO_CREATEは、バインディング後に自動的にサービスが作成されることを示します.
【バインドサービス】出力結果:
D/FirstService: onCreate D/MainActivity: onServiceConnected D/FirstService: init CustomBinder
解除サービス:
unbindService(connection);

ServiceConnectionオブジェクトに伝われば解けるのですが、簡単ではないでしょうかO(∩∩)Oハハ~
【解縛サービス】出力結果:
D/FirstService: onDestroy