Service与Activity通信
1、因为一个服务可以startService多次(每次都会调用onStartCommand),所以可以利用Intent传值。
-
intent.putExtra("data",text.getText().toString());
startService(intent); -
public int onStartCommand(Intent intent, int flags, int startId) {
data = intent.getStringExtra("data");
return super.onStartCommand(intent, flags, startId);
}
2、利用返回来的binder,对service数据进行操作。
- Service代码
public class Myservice extends Service { private boolean doing = true; private String data="default"; @Override public IBinder onBind(Intent intent) { return new MyBinder(); } @Override public void onCreate() { doing = true; new Thread(){ @Override public void run() { while (doing) { Log.v("service",data); try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }; }.start(); super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { data = intent.getStringExtra("data"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { doing = false; Log.v("service","服务停止"); super.onDestroy(); } public class MyBinder extends android.os.Binder{ public void Setdate(String data) { Myservice.this.data = data; } } }
- 获取binder :
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
binder = (MyBinder) service;
Log.v("service","绑定成功");
}
3、通过回调(Service的开启的线程调用)和线程间发消息(hander)来实现对Service的监听。
- 注意:辅助线程是不能够操作ui线程的资源的。这是android的一种保护机制。
- MainActivity代码:
-
package com.example.connectservice; import com.example.connectservice.Myservice.MyBinder; import android.app.Activity; import android.app.Service; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.opengl.ETC1; import android.os.Binder; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends Activity implements OnClickListener, ServiceConnection { EditText text ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text = (EditText)findViewById(R.id.et); findViewById(R.id.btStartService).setOnClickListener(this); findViewById(R.id.btStopService).setOnClickListener(this); findViewById(R.id.btnBind).setOnClickListener(this); findViewById(R.id.btnUnBind).setOnClickListener(this); findViewById(R.id.btnSycnData).setOnClickListener(this); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.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(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this,Myservice.class); switch (v.getId()) { case R.id.btStartService: intent.putExtra("data",text.getText().toString()); startService(intent); break; case R.id.btStopService: stopService(intent); break; case R.id.btnBind: bindService(new Intent(this, Myservice.class), this,Context.BIND_AUTO_CREATE); break; case R.id.btnUnBind: unbindService(this); break; case R.id.btnSycnData: if (binder != null) { binder.Setdate(text.getText().toString()); } break; } } public Myservice.MyBinder binder; private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { ((TextView)findViewById(R.id.tv)).setText(msg.getData().getString("data")); } }; @Override public void onServiceConnected(ComponentName name, IBinder service) { binder = (MyBinder) service; binder.SetCallBack(new Myservice.CallBack() { @Override public void onDataChange(String data) { Message msgMessage = new Message(); Bundle bundle = new Bundle(); bundle.putString("data", data); msgMessage.setData(bundle); handler.sendMessage(msgMessage); } }); Log.v("service","绑定成功"); } @Override public void onServiceDisconnected(ComponentName name) { } }
- Myservice代码:
-
package com.example.connectservice; import android.R.integer; import android.R.string; import android.app.Application; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; import android.util.Log; public class Myservice extends Service { private boolean doing = true; private String data="default"; @Override public IBinder onBind(Intent intent) { return new MyBinder(); } @Override public void onCreate() { doing = true; new Thread(){ int i =0; @Override public void run() { while (doing) { Log.v("service",data); String string = i+":"+data; i++; if (callBack!=null) { callBack.onDataChange(string); } try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }; }.start(); super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { data = intent.getStringExtra("data"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { doing = false; Log.v("service","服务停止"); super.onDestroy(); } private CallBack callBack = null; public class MyBinder extends android.os.Binder{ public void Setdate(String data) { Myservice.this.data = data; } public void SetCallBack(CallBack callBack) { Myservice.this.callBack = callBack; } } public interface CallBack{ public void onDataChange(String data); } }

浙公网安备 33010602011771号