サービス学習

サービス学習

サービスは非表示のアクティビティとして理解できます。1つはローカルサービスで、もう1つ
はリモートサービスです。startservice()とbindservice()を同時に呼び出す場合は、次の2つのタイプに分けられます。 stopservcie()とunbindservice()を同時に呼び出します。そうしないと、サービスは停止しません。
2. unbindserviceを呼び出すときは、パラメーターServiceConnectionを渡す必要があります。このパラメーターはbindServiceの着信ServiceConnectionと一致しているため、ServiceConnectionのライフサイクルはこれら2つのメソッド(通常はメンバー変数として宣言されます)をカバーできます。3。AIDLを
使用して通信します。プロセス間でいくつかの考慮事項
(1)AIDLファイルの確立後、対応する.classファイルを生成するプロジェクトをビルド->作成する必要があります
(2)クライアントとサーバーが同じAIDLファイルを持ち、ローカルAIDLがパッケージ名とサーバー上でAIDLが配置されているパッケージ名は同じです
(3)Intentを使用してローカルでサービスを開始する場合は、intent.setPackage( "AIDLパッケージ名")メソッドも呼び出す必要があります。そうしないと、エラーが報告されます。サービスインテントは明示的である必要があります:このメソッドは5.0より前のようです
インターフェイスを作成するときに間違ったメモを呼び出さないでください(4)AIDLは複雑なオブジェクトを渡し、
割り当てられ次のコードの詳細な説明を行わず
最初に真実でマップを打ちますローカルサービスの
最初のMainActivity.classに

public class MainActivity extends ActionBarActivity implements View.OnClickListener {
    
    
    private Button start;
    private Button bind;
    private Button cancelbind;
    private Button cancelstart;
    ServiceConnection sc;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sample_main);
        start=(Button)findViewById(R.id.start);
        start.setOnClickListener(this);
        bind=(Button)findViewById(R.id.bind);
        bind.setOnClickListener(this);
        cancelbind=(Button)findViewById(R.id.cancelbind);
        cancelbind.setOnClickListener(this);
        cancelstart=(Button)findViewById(R.id.cancelstart);
        cancelstart.setOnClickListener(this);
        sc=new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                MyService ms=((MyService.Localbinder)service).getService();
                ms.HellowWorld(MainActivity.this);
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {
                System.out.println("service onservicedisconneccted");
            }
        };
    }


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

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onClick(View v) {
        Intent i=new Intent(this.getApplicationContext(),MyService.class);
        switch(v.getId()){
            case R.id.start:

                startService(i);
                break;
            case R.id.bind:

                Intent j=new Intent(this,MyService.class);
                bindService(j,sc, Context.BIND_AUTO_CREATE);
                break;
            case R.id.cancelstart:
                stopService(i);
                break;
            case R.id.cancelbind:
                unbindService(sc);
                break;
        }
    }
}

その後、サービス

public class MyService extends Service {
    
    
    @Override
    public IBinder onBind(Intent intent) {
        System.out.println("service onbind");
        return new Localbinder();
    }

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        System.out.println("service onstartcommand");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public boolean onUnbind(Intent intent) {
        System.out.println("service onunbind");
        return super.onUnbind(intent);
    }

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

    @Override
    public void onRebind(Intent intent) {
        super.onRebind(intent);
        System.out.println("service rebind");
    }
    public void HellowWorld(Context context)
    {
        Toast.makeText(context,"HellowWorld",Toast.LENGTH_SHORT).show();
    }
    public class Localbinder extends Binder {
    
    
             MyService getService(){
                 return MyService.this;
             }
    }
}

もちろん、構成ファイルでサービスを宣言することを忘れないでください

2つ
目は、最初の
AIDL通信はサーバー1AIDLファイルです。

interface IMyAidlInterface {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void printInformation();
}

2、MyService

public class MyService extends Service {
    
    
    @Override
    public void onCreate() {
        super.onCreate();
    }

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

    @Override
    public IBinder onBind(Intent intent) {
        return stub;
    }

    @Override
    public boolean onUnbind(Intent intent) {
        return super.onUnbind(intent);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
    private IMyAidlInterface.Stub stub=new IMyAidlInterface.Stub() {
        @Override
        public void printInformation() throws RemoteException {
            System.out.println("跨进程通信");
        }
    };
}

第二に、ローカルエンド

public class MainActivity extends ActionBarActivity implements View.OnClickListener {
    
    
   private Button start;
   private Button bind;
   private Button stopservice;
   private Button unbind;
   private ServiceConnection sc;
   private IMyAidlInterface aidlservice;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        start=(Button)findViewById(R.id.start);
        start.setOnClickListener(this);
        bind=(Button)findViewById(R.id.bind);
        bind.setOnClickListener(this);
        stopservice=(Button)findViewById(R.id.cancelstart);
        stopservice.setOnClickListener(this);
        unbind=(Button)findViewById(R.id.cancelbind);
        unbind.setOnClickListener(this);
        sc=new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                     aidlservice=IMyAidlInterface.Stub.asInterface(service);
                try {
                    aidlservice.printInformation();
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {

            }
        };
    }


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

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onClick(View v) {
        switch(v.getId())
        {
            case R.id.start:
                break;
            case R.id.bind:
                Intent i=new Intent("demo.haoxuan.com.remoteservice.myservice");
                i.setPackage("demo.haoxuan.com.remoteservice");
                bindService(i,sc, Context.BIND_AUTO_CREATE);
                break;
            case R.id.cancelstart:
                break;
            case R.id.cancelbind:
                unbindService(sc);
                break;
        }
    }

おすすめ

転載: blog.csdn.net/skateboard1/article/details/44998835