Service学习

Service学习

Service可以理解为一个看不见的Activity,它分为两种,一种是本地service,说一些注意事项:
1、一种是远程service,同时调用了startservice()和bindservice()启动服务时,要同时调用stopservcie()和unbindservice(),否则服务不会停止。
2、在调用unbindservice时需要传入参数ServiceConnection,这个参数和bindService里的传进的ServiceConnection要一致,所以ServiceConnection的生命周期能覆盖这两个方法(一般声明为成员变量)
3、使用AIDL跨进程通信的几点注意事项
(1)建立AIDL文件后,需要build->make project来产生相应的.class文件
(2)客户端和服务端要有相同的AIDL文件,且本地AIDL文件所在包名要和服务端中AIDL所在包名相同
(3)在本地用Intent启动服务时要注意,还要调用intent.setPackage(“AIDL包名”)的方法,否则会报错 Service Intent must be explicit:这个方法好像在5.0以前不调用就不会错
(4)AIDL传递复杂对象时注意接口写法,这里不做详细解说了
下面赋代码吧,也好有图有真相
先来了本地的Service
首先是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;
        }
    }
}

然后是Service

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;
             }
    }
}

当然不要忘记在配置文件里声明service

二、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