liguofeng29’s blog

個人勉強用ブログだっす。

AndroidのService- Serviceの概要

Androidにおいて、Serviceコンポーネントは実行可能プログラムである。

Activityとの比較

  • Activityと同じく、lifecycleがあり、生成、配置する必要がある
  • Activityと同じく、Contenxtの派生クラスであるので、ContextクラスのgetResource(), getContentResolver()など使える
  • Activityと違って、ユーザとのやり取りを行うための画面がない

※ ユーザとのやり取りがあるかないかによって、Activityを使うかServiceを使うかを判断する。

f:id:liguofeng29:20151215065304p:plain

Serviceの開発流れ


  1. Serviceのサブクラス生成
  2. AndroidManifeist.xmlに配置
  3. アプリ内でServiceを実行
    1. ContextのstartService() - アクセス側と関係なくServiceは実行する
      ※ この場合、ActivityとServiceは通信できないかつデータのやり取りもできない。
    2. ContextのbindService() - アクセス側にバインドされ、アクセス側が終了するとServiceも終了する

サンプルコード


ServiceのサブクラスFirstService .java

package com.example.liguofeng.firstservice;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

public class FirstService extends Service {
    public FirstService() {
        // コンストラクター
    }
    @Override
    public IBinder onBind(Intent intent) {
        System.out.println("Service is binded.");
        return null;
    }
    @Override
    public void onCreate() {
        super.onCreate();
        System.out.println("Service is created.");
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        System.out.println("Service is started.");
        return super.onStartCommand(intent, flags, startId);

    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        System.out.println("Service is destoryed..");
    }
}

AndroidManifest.xmlに配置

<service
    android:name=".FirstService"
    android:enabled="true"
    android:exported="true" >
</service>

Service起動用Activity

package com.example.liguofeng.firstservice;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    Button start,stop;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        start = (Button) findViewById(R.id.startBtn);
        stop = (Button) findViewById(R.id.stopBtn);

        // 起動用Intent
        final Intent intent = new Intent(MainActivity.this, FirstService.class);

        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Service起動
                startService(intent);
            }
        });

        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Service終了
                stopService(intent);
            }
        });
    }
}

f:id:liguofeng29:20151215063710g:plain

※上記ログからわかるように、Serviceを起動する際にonCreate()⇒onStartCommand()が呼ばれるが起動中の場合には、onCreate()はよばれない。