サービス概要

6981 ワード

サービス


バックグラウンドで黙々と動作するコンポーネントであり、フロントを必要としないコードを実行するのに適したフロントのactivityがないと理解できる.
サービスは手動で閉じることができ、再起動することはありませんが、自動的に閉じると、メモリが十分であればを再起動します.
ダウンロードコードや音楽再生というバックグラウンドで実行されるコードは、サービスに書かなければなりません.
どうしてですか.たとえば、ダウンロード:
activityも実はバックグラウンドでダウンロードできますが、キーを返すとactivityが死んでしまい(activityがonDestory()によってこのアプリプロセスが破棄されるわけではありません)、プロセスはまだあり、サブスレッドはダウンロードできますが、プロセスが破棄されるとダウンロードが中断されます.プロセスはいつ破棄されますか?メモリ不足の場合はプロセスが破棄される可能性が高い...プロセスの優先度に関する知識が得られます.

プロセス優先度


フロントプロセス:フロントactivity(onResumeメソッドが呼び出された)を持つ
≪可視プロセス|Visible Process|ldap≫:可視activityメソッドが呼び出されたを持つ
サービスプロセス:やむを得ず回収されず、回収されてもメモリが十分な場合はが再起動されます.
バックグラウンドプロセス:バックグラウンドactivity(activityのonStopメソッドが呼び出された)を持ち、を回収しやすい
空のプロセス:activityが実行されず、が回収されやすい

サービス:オープンモード


1.Context.startService()


(重点)この方法によって開始されたサービスが存在するプロセスは、サービスプロセスに属する.
Activityがサービスを開始すると、サービスはActivityとは一銭の関係もありません.
startService()メソッドを何回呼び出しても、stopService()を1回呼び出してサービスを停止するだけです.
サービスを開始する必要があるActivity:
Intent intent = new Intent(this, MyService.class);
startService(intent);// 
stopService(intent);// 

2.Context.bindService()


(重点)この方法によって開始するサービス所在プロセスは、サービスプロセスに属さない.
Activityはサービスと接続を確立し、Activityが死亡すると、サービスも死亡する.
*サービスを開始する必要があるActivity:
Intent intent = new Intent(this, MyService.class);
    MyServiceConn conn = new MyServiceConn();
    bindService(intent, conn, BIND_AUTO_CREATE);

    class MyServiceConn implements ServiceConnection{  // , 
    // , 
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        // TODO Auto-generated method stub
        pb = (PublicBusiness) service;
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        // TODO Auto-generated method stub

    }

}

MyServiceクラスの内容:
public class MyService extends Service {

    // 
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        System.out.println("bind ");
        return null;
    }

    // 
    @Override
    public boolean onUnbind(Intent intent) {
        // TODO Auto-generated method stub
        System.out.println("unbind ");
        return super.onUnbind(intent);
    }

    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        System.out.println("create ");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO Auto-generated method stub
        System.out.println("start ");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        System.out.println("destroy ");
        super.onDestroy();
    }
}

ライフサイクル


1.contextstartService起動サービスのライフサイクル

onCreate()->onStartCommand()->onDestroy()

繰り返し呼び出しContext.startService()はonStartCommand()を繰り返し呼び出しますが、onCreate()はのみ呼び出されます.

2.Context.bindService()バインドサービスのライフサイクル

onCreate()->onBind()->onUnbind() -> onDestroy() 

繰り返し呼び出しContext.bindService()は、一度だけonCreate()->onBind().同時に繰り返して解縛することもできず、起動後、一度だけ解縛することができます.

サービスの混合呼び出し(ポイント)


まずstartService()で、bindService()で、先に縛って、また停止します.例えば、サービスで音楽再生を実現する場合、音楽再生はサービスプロセス中に実行しなければなりませんが、音楽サービス中の方法は、フロントActivityに呼び出される必要があります.だから、音楽サービスを混合してstartで、bindで、破棄するときはunbindで、stop でなければなりません.
onCreate()->onStartCommand()->onBind()->onUnbind()-> onDestroy() 

サービスはメインスレッドで実行されます


Serviceは他のアプリケーションコンポーネントと同様に、プロセスのメインスレッドで実行されます.すなわち、サービスが多くの時間またはブロックの操作を必要とする場合、そのサブスレッドで実現する必要がある.

指導者を探して証明書を発行する(サービスの中の方法を訪問する)


サービスをリーダーと見なし、サービスにはbanZhengメソッドがあり、どのようにアクセスできますか?
サービスをバインドすると、サービスのonBindメソッドがトリガーされます.このメソッドは、サービスにアクセスするメソッドを介してMainActivityにIbinderのオブジェクトを返します.
サービスでクラスインプリメンテーションIbinderインタフェースを定義し、onBindメソッドでを返す
class ZhongJianRen extends Binder implements PublicBusiness{
public void QianXian(){
    // banZheng 
    BanZheng();
}   
public void daMaJiang(){

}
}
public class MainActivity extends Activity {

    private Intent intent;
    private MyServiceConn conn;
    PublicBusiness pb;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intent = new Intent(this, LeaderService.class);
        // ServiceConnection 
        conn = new MyServiceConn();
        //1. 
        bindService(intent, conn, BIND_AUTO_CREATE);
    }
//2. , 
    class MyServiceConn implements ServiceConnection{

        // , 
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //5. TODO Auto-generated method stub
            pb = (PublicBusiness) service;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            // TODO Auto-generated method stub

        }

    }

    public void click(View v){
        // 
        pb.QianXian();
    }

}

リーダーサービスクラス:
public class LeaderService extends Service {

        @Override
        public IBinder onBind(Intent intent) {
            //3.  Binder , 
            return new ZhouMi();
        }

    //4. Ibinder , onBind 
    class ZhouMi extends Binder implements PublicBusiness{
        public void QianXian(){
                banZheng();
            }

        public  void daMaJiang(){
                System.out.println(" ");
            }
        }

        public void banZheng(){
            System.out.println(" ");
        }
    }

QianXianメソッドをインタフェースPublicBusinessの定義に抽出
public interface PublicBusiness {
        void QianXian();
    }

サービスの分類


ローカル・サービス:サービスと起動サービスのactivityが同じプロセスでであることを意味します.
リモート・サービス:サービスと起動サービスのactivityが同じプロセスでないことを意味します.

AIDL


Android interface definition language
プロセス間通信
リモート・サービスの方法を個別のインタフェースjavaファイルに抽出する
インタフェースjavaファイルの接尾辞名をaidl に変更
自動生成されたPublicBusiness.JAvaファイルには、binderクラスを継承した静的抽象クラスStubがあり、publicBusinessインタフェースを実現しています.このクラスは新しい仲介者(継承時に直接:中間人類名Stub)です.
aidlファイルを06アイテムにコピーして貼り付けます.貼り付けるときは、aidlファイルがあるパッケージ名が05アイテムのaidlがあるパッケージ名と一致するでなければなりません.
06プロジェクトでは、ServiceConnectionオブジェクトリンククラスのonServiceConnected()メソッドで仲介者オブジェクトを強く回して仲介者オブジェクトを得る:mService=IMusicServices.Stub.asInterface(serviceIBinder);