android Service


サービスコンポーネント
サービスにはビジュアル化インタフェースがなく、バックグラウンドで実行できます.ライフサイクル:onCreate()---->onStart(Intent intent,int startId)---->onDestroy()サービスは起動するためにコールを表示する必要があります.起動サービス:BroadCastを使用して起動イベントをリスニングし、onReceive()でサービスを開始する必要があります.
サービスを開始する2つの方法:context.startService()とcontext.bindService()
1、context.startService()
この方法でサービスを起動すると1回呼び出されます
context.startServices()---->onCreate()---->onStart()(サービスが複数回起動可能であり、サービスが実行中の場合はこのメソッドを直接呼び出す)---->サービスrunning
context.stopService() --------> onDestroy() 
2、context.bindService()
この方法でサービスを起動すると1回呼び出されます
context.startService()---->onCreate()---->onBind()---->service running
context.stopService() --------> onUnbind()----->onDestroy() 
onBindはクライアントにIBindインタフェースのインスタンスを返します.IBindは、サービスの実行状態を得るなど、クライアントのコールバックサービスを許可する方法です.
呼び出し元とサービスが結合され、Contextが終了すると、サービスは対応するonUnbind()メソッドを呼び出します.
AIDL(Android Interface Definition Language)はプロセス間アクセスを実現
AIDL(androidインタフェース記述言語)は、1つのandroidデバイス上で実行される2つのプロセスが内部通信プロセスを使用してインタラクティブになるコードを生成するIDL言語です.1つのプロセス(たとえば、1つのActivity)で別のプロセス(たとえば、1つのService)のオブジェクトにアクセスする方法が必要な場合は、AIDLを使用してこのようなコードを生成して、さまざまなパラメータを偽装して渡すことができます.
AIDLを使用するには、サービスインタフェースをaidlファイルで提供する必要があります.AIDLツールは、対応するjavaインタフェースを生成し、生成されたサービスインタフェースに機能呼び出しのstubサービスクラスを含みます.サービスの実装クラスは、このstubサービスクラスを継承する必要があります.ServiceのonBindメソッドは、実装クラスのオブジェクトを返します.その後、次の例を参照してください.
サービス側プロセス:
まずandroidプロジェクトを構築し、以下のように簡単なAIDLサービスを構築します.
パッケージの下にaidlファイルIServiceを作成します.aidl:
package com.service;
interface IService{ String getValue(); }
次のように、aidlファイルに対応するstubサービスクラスを実装する内部クラスMyServiceImplを定義するServiceクラスを書きます.
public class MyService extends Service{
	
	private String text="";
	@Override
	public IBinder onBind(Intent intent) {
		return new MyServiceImpl();//         IService    
	}
	
	public class MyServiceImpl extends IService.Stub{


		@Override
		public String getValue() throws RemoteException {
			text = text +"io";
			return text;
		}
	}
	
}

このサービスはmanifestファイルで次のように構成されます.

サービスを呼び出すプロセス:
クライアントとしてandroidプロジェクトを作成します.
ステップ1:サービス側プロジェクトで生成されたgenフォルダの下のクラス(パッケージを含む)を、サービスを呼び出すプロセスのsrcディレクトリにコピーします.
ステップ2:activityを書いてこのサービスを呼び出す:
package com.client;

import com.service.IService;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;


public class IClient extends Activity implements OnClickListener{
	
	private IService iService =null;
	private Button bind,invoke;
	private TextView text;
	private ServiceConnection serviceConnection = new ServiceConnection() {
		
		@Override
		public void onServiceDisconnected(ComponentName name) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			// TODO Auto-generated method stub
			iService = IService.Stub.asInterface(service);
			invoke.setEnabled(true);
		}
	};
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        bind = (Button)findViewById(R.id.bind);
        invoke = (Button)findViewById(R.id.invoke);
        invoke.setEnabled(false);
        bind.setOnClickListener(this);
        invoke.setOnClickListener(this);
        text = (TextView)findViewById(R.id.text);
    }
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch(v.getId()){
		case R.id.bind:
			bindService(new Intent("com.service.serviceio"), serviceConnection, Context.BIND_AUTO_CREATE);
			break;
		case R.id.invoke:
			try {
				text.setText(iService.getValue());
			} catch (RemoteException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			break;
		}
	}
}

サービス側のデータへのアクセスが実現されます.
注意:AIDLサービスは限られたデータ型のみをサポートするため、AIDLサービスで複雑なデータを転送するにはさらなる処理が必要です.
AIDLサービスがサポートするデータ型は次のとおりです.
JAvaの簡単なタイプ:int char booleanなど
StringとCharSequence
ListとMap;オブジェクト要素のタイプもAIDLサービスがサポートするタイプでなければなりません
AIDL自動生成インタフェース(importが必要)
実現するos.Parcelableインタフェースのクラス(importが必要)
研究中...