AndroidでのServicesの概要

21233 ワード

ServicesはAndroidの4つの基本コンポーネント(Activities、Services、Content Providers、BroadCast Receivers)の1つで、主にバックグラウンドで長時間操作し、音楽プレーヤーなどのインタフェースを提供せず、インタフェースを閉じた後も再生を継続するために使用されます.ページがインタラクティブである必要がある場合はスレッドを使用します.
Servicesを作成し、Servicesを継承し、中のメソッドを複写し、実行プロセスをログで表示します.
package com.example.androidservice;

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

public class MyService extends Service {

    private static final String TAG="TestTag";
    
    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }

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

    @Override
    public void onStart(Intent intent, int startId) {
        Log.i(TAG, "onStart");
        super.onStart(intent, startId);
    }

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

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

}

サービスライフサイクル:context.startService() ->onCreate()->onStart()->onStartCommand()->Service running ->context.stopService()  ->onDestroy() ->Service stop
サービスがまだ実行されていない場合、androidはonCreate()を呼び出してからonStartCommand()を呼び出し、startService(Intent)を呼び出すたびにonStartCommand()を呼び出します.サービスがすでに実行されている場合は、onStartCommand()のみが呼び出されます. 
 
操作を実行するには、onStartCommandメソッドで定義します.onStartCommandには4つの戻り値があります.
        START_STICKY:サービスプロセスがkillによって削除された場合、サービスを保持する状態は開始状態ですが、送信されたintentオブジェクトは保持されません.その後、サービスステータスが開始状態であるため、サービスを作成すると必ずonStartCommand(Intent,int,int)メソッドが呼び出されます.その間にサービスに起動コマンドが渡されない場合、パラメータIntentはnullになります.
        START_NOT_STICKY:「非粘性」.この戻り値を使用すると、onStartCommandを実行した後、サービスが異常killによって削除された場合、システムは自動的にサービスを再起動しません.
         START_REDELIVER_INTENT:Intentを再送します.この戻り値を使用すると、onStartCommandの実行後にサービスが異常killによって削除されると、自動的にサービスが再起動され、Intentの値が入力されます.
         START_STICKY_COMPATIBILITY:START_STICKYの互換バージョンですが、サービスがkillされた後に必ず再起動できる保証はありません.
ページを作成してサービスを開始します.レイアウト:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".AndroidServiceActivity" >

    <Button
        android:id="@+id/btnStart"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="  " >
    </Button>

    <Button
        android:id="@+id/btnStop"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="  " >
    </Button>

</LinearLayout>

バインディングイベントを終了し、startServiceがサービスを開始し(呼び出し者とサービスの間に連絡がなく、呼び出しが閉じてもサービスの実行に影響しない)、stopServiceがサービスを停止し、そのパラメータがIntentオブジェクトであることに注意するため、いくつかのIntentを通じていくつかのパラメータをServiceに伝達することができ、ServiceはIntentを通じて受信することができる:
package com.example.androidservice;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class AndroidServiceActivity extends Activity {

    private Button btnStart;
    private Button btnStop;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_android_service);
        btnStart=(Button)this.findViewById(R.id.btnStart);
        btnStop=(Button)this.findViewById(R.id.btnStop);
        btnStart.setOnClickListener(listener);
        btnStop.setOnClickListener(listener);
    }
    
    private OnClickListener listener=new OnClickListener() {
        
        @Override
        public void onClick(View v) {
            Intent intent=new Intent(AndroidServiceActivity.this,MyService.class);
            switch(v.getId()){
            case R.id.btnStart:
                startService(intent);
                break;
            case R.id.btnStop:
                stopService(intent);
                break;
            }
            
        }
    };


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_android_service, menu);
        return true;
    }

}

最後はmanifestでxmlにノードを追加すると、AndroidServiceActivityのActivityノードと同じレベルになります.
 
もう1つはbindService()で起動することであり、サービスリンク(ServiceConnection)またはサービス中の状態とデータ情報を直接取得するサービスリンクによってサービスのオブジェクトを取得することができるため、サービスをバインドするコンポーネントはサービス中の実装の関数を呼び出してサービスのコンポーネントをContext.BindService()はContext.を介してサービスリンクを確立する.unbindService()サービスリンクを停止バインディング中にサービスが起動しなかった場合、Context.BindService()は、同じServiceを自動的に起動し、複数のサービスリンクをバインドします.これにより、複数の異なるコンポーネントに同時にサービスを提供できます.
BindService継承サービスを作成し、Binderクラス宣言メソッドgetBindServiceを拡張してBindServiceに戻り、カスタムメソッドShowLog()を呼び出す
 
package com.example.androidservice;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

public class BindService extends Service {

    private static final String TAG="BindService";
    
    private BindServiceX myBinderServiceX=new BindServiceX();
    public class BindServiceX extends Binder{
        public BindService getBindService() {
            return BindService.this;
        }
    }

    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return myBinderServiceX;
    }
    
    @Override
    public void onCreate() {
        Log.i(TAG, "onCreate");
        super.onCreate();
    }

    @Override
    public void onStart(Intent intent, int startId) {
        Log.i(TAG, "onStart");
        super.onStart(intent, startId);
    }

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(TAG, "onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }
    
    public void ShowLog(){
        Log.i(TAG, "BindService=>ShowLog");
    }

}

Manifest.xmlファイルにと宣言
インタフェースに起動停止ボタンを追加するには:
<Button
        android:id="@+id/btnStartBindService"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="  BindService" >
    </Button>

    <Button
        android:id="@+id/btnStopBindService"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="  BindService" >
    </Button>

AndroidServiceActivityバインド方法、Context.BIND_AUTO_CREATEは、バインドが存在する限り、自動的にサービスを確立することを示しています.同時にAndroidシステムにも、このサービスの重要度は呼び出し者と同じであり、呼び出し者を終了することを考慮しない限り、このサービスを閉じないように通知します.
サービスが作成されていない場合は、onCreate()を1回呼び出し、onBind()を呼び出します.バインドを複数回行うと、onBind()は複数回呼び出されません.
unbindService()関数を使用してサービスcieのバインドを解除すると、onUnbind()関数が呼び出されます.onUnbind()関数の戻りtrueは、呼び出し元が新しいサービスをバインドすると、onRebind()関数が呼び出されることを示します.
バインド解除にはunbindService()メソッドを使用し、unbindService()メソッドにServiceConnnectionを渡す必要があります.unbindService()メソッドが成功すると、onServiceDisconnected()は呼び出されません.onServiceDisconnected()は、予期せぬバインド解除時にのみ呼び出されるためです.
bindServiceの場合、stopServiceはできません.unBindService()でバインドを解除する必要があります.
startService()後、unBindService()でサービスを破棄することはできません
private boolean isConn = false;//          
private
OnClickListener listener = new OnClickListener() { @Override public void onClick(View v) { Intent intentBind = new Intent(AndroidServiceActivity.this, BindService.class); switch (v.getId()) { case R.id.btnStartBindService: bindService(intentBind, conn, Context.BIND_AUTO_CREATE); break; case R.id.btnStopBindService: if (isConn) { unbindService(conn); // isConn=false; } break; } } };

connを宣言し、サービスに接続し、サービスを呼び出す方法.
private ServiceConnection conn = new ServiceConnection() {

        @Override
        public void onServiceDisconnected(ComponentName name) {
            isConn=false;
        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            BindServiceX bindServiceX = (BindServiceX) service;
            BindService bindService = bindServiceX.getBindService();
            bindService.ShowLog();
            isConn=true;
        }
    };

BindService()の目的はコールバックonBind()メソッドであり、サービスと呼び出し元の間にブリッジを構築することであり、より多くの作業(例えば、サービスがサーバに接続する必要がある操作)を担当することはありません.一般的にbindServiceを使用して既存のサービス(すなわち、StartServiceによって起動されたサービス)にバインドされ、Activityとサービスがデータを転送し、インタフェースを呼び出すことができます.
 
以上の2つの使用方法は完全に独立するものではないが、場合によってはMP 3プレーヤーを例に、バックグラウンドで動作するサービスはContextを通過する.startService()は特定の音楽の再生を開始するが、再生中にユーザが音楽の再生を一時停止する必要がある場合はContextを通過する必要がある.BindService()は、サービスリンクとサービスオブジェクトを取得し、さらにサービスオブジェクトの関数を呼び出すことで、音楽再生プロセスを一時停止し、関連情報を保存します.この場合、Context.が呼び出されると、stopService()はサービスを停止することはできません.すべてのサービスリンクが閉じた後、サービスが本当に停止する必要があります.