实现Service绑定通信的关键点:
MainActivity中绑定服务时要实现的方法
public void onServiceConnected(ComponentName name, IBinder service)
中的IBinder service跟绑定的服务里
public IBinder onBind(Intent intent)返回的IBinder是相通的。
所以可以在服务中创建一个Binder类继承自OS的Binder,在MainActivity中创建Binder实例,来实现通信。
代码:
package com.example.wjb.myapplication; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import org.w3c.dom.Text; import java.io.Serializable; public class MainActivity extends Activity implements View.OnClickListener, ServiceConnection { Intent i; EditText et; MyService.Binder binder = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); i=new Intent(MainActivity.this,MyService.class); findViewById(R.id.button1).setOnClickListener(this); findViewById(R.id.button2).setOnClickListener(this); findViewById(R.id.button3).setOnClickListener(this); findViewById(R.id.button4).setOnClickListener(this); findViewById(R.id.button5).setOnClickListener(this); et = (EditText) findViewById(R.id.editText); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.button1: startService(i); break; case R.id.button2: stopService(i); break; case R.id.button3: bindService(i,this, Context.BIND_AUTO_CREATE); break; case R.id.button4: unbindService(this); break; case R.id.button5: if(binder!=null){ binder.setData(et.getText().toString()); } } } @Override public void onServiceConnected(ComponentName name, IBinder service) { binder= (MyService.Binder) service; } @Override public void onServiceDisconnected(ComponentName name) { } }
package com.example.wjb.myapplication; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; public class MyService extends Service { boolean running=false; String data="默认信息"; public MyService() { System.out.println("启动服务"); } @Override public IBinder onBind(Intent intent) { return new Binder(); } public class Binder extends android.os.Binder{ public void setData(String data){ MyService.this.data=data; } } @Override public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); } @Override public void onCreate() { super.onCreate(); System.out.println("onCreat"); new Thread(){ @Override public void run() { super.run(); running = true; while(running){ System.out.println(data); try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); } @Override public void onDestroy() { super.onDestroy(); System.out.println("onDestroy"); running = false; } }