Androidの4つのコンポーネントの1つであるService紹介-android学習の旅(12)

10563 ワード

基本概念:
サービスはandroidの4つのコンポーネントの1つであり、バックグラウンドで実行するのに時間がかかり、ユーザーインタフェースは提供されません.他のコンポーネント、例えばacticityはstartServiceによってコンポーネントを起動してもよいし、bindServiceによってコンポーネントを起動してバインドして通信してもよい.
シーンの操作
バックグラウンドでファイルをダウンロードしたり、音楽を再生したりします.
に注意
サービスはプライマリスレッドで実行され、独自のスレッドも独立したスレッドでもないので、使用するときは直接使用するのではなく、自分でスレッドを作成する必要があります.これによりANRエラーが発生します.
サービスの2つの形式
startedサービス他のコンポーネント、例えばactivityなどはstratServiceなどを通じて起動し、起動したコンポーネントに依存しない独立したライフサイクルを有する.boundサービスの他のコンポーネントは、サービスと長時間の接続を確立するためにbindServiceを介して接続を確立します.これとインタラクティブに(リクエストを送信し、応答を受け入れる)ことができます.そのライフサイクルは、バインドされたコンポーネントに依存しますが、バインドを解除すると消滅します.
2つのサービスのコード:
package peng.liu.testview;

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

public class MyService extends Service {
    public MyService() {
    }

    @Override
    public void onCreate() {
        super.onCreate();
        ServiceClass sc = new ServiceClass();
        sc.start();
    }
    private class ServiceClass extends Thread{
        @Override
        public void run() {
            super.run();
            for (int i = 0;i< 1000;i++){
                System.out.println("hello"+i);
                try {
                    Thread.sleep(1000);
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
    }
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

もう一つのサービスは
package peng.liu.testview;

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

import java.util.Random;

public class MyService2 extends Service {
    public MyService2() {
    }
    //     binder  
    public class LiuBinder extends Binder {
        //        ,  service  
        public MyService2 getService(){
            return MyService2.this;
        }
    }
    //onBind      LiuBinder
    private LiuBinder binder = new LiuBinder();
    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }
    //          ,      
    public int getRandom(){
        Random random = new Random();
        return random.nextInt(100);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        System.out.println("service done");
    }
}

プライマリクラスのコード:
package peng.liu.testview;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;


public class MainActivity extends Activity implements View.OnClickListener{
    private Button send,reg,unReg;
    private MyService2 service;
    boolean isBound;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.send).setOnClickListener(this);
        findViewById(R.id.reg).setOnClickListener(this);
        findViewById(R.id.unReg).setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.send:
                startService(new Intent(MainActivity.this,MyService.class));
            break;
            case R.id.reg:
                Intent intent = new Intent(MainActivity.this,MyService2.class);
                bindService(intent,conn,BIND_AUTO_CREATE);
        }
        Toast.makeText(MainActivity.this,"    "+service.getRandom(),Toast.LENGTH_LONG).show();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(conn);
    }

    private ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            MyService2.LiuBinder binder = (MyService2.LiuBinder)iBinder;
            service = binder.getService();
            isBound = true;
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            isBound = false;
        }
    };
}

サービスコードの登録:
<service  android:name=".MyService" android:enabled="true" android:exported="true" >
        </service>
        <service  android:name=".MyService2" android:enabled="true" android:exported="true" >
        </service>