您的位置:首页 > 其它

服务间的通讯

2016-01-09 14:24 211 查看
概念之类的不做多的介绍,直接百度就行了大把的有,这里主要介绍服务开启、服务绑定、数据同步、数据通讯的代码实现

首先在开启服务之前必须的先创建服务代码后面给出,开启服务之后要在AndroidManifest.xml文件中声明。声明代码如下

//服务声明
<service
android:name=".MyService"
android:enabled="true"
android:exported="true" >
</service>
开启服务和开启Activity用法一样都是通过Intent开启

//服务开启
Intent intent = new Intent(MainActivity.this, MyService.class);
intent.putExtra("data", etServiceData.getText().toString());//传递数据
startService(intent);
//停止服务
stopService(intent);
//绑定服务
bindService(intent, this, Context.BIND_AUTO_CREATE);
//解除绑定
unbindService(this);
在绑定服务和解除绑定服务的时候,所在的类要实现ServiceConnection接口。之后就是数据同步这里直接上完整的代码如下

<!--activity_main.xml-->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity">

<TextView
android:id="@+id/tvCallbackData"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<EditText
android:id="@+id/etServiceData"
android:text="default message、、、、、"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<Button
android:id="@+id/btnStartService"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打开服务" />

<Button
android:id="@+id/btnStopService"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止服务" />

<Button
android:id="@+id/btnBindService"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="绑定服务" />

<Button
android:id="@+id/btnUnbindService"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="解除绑定" />

<Button
android:id="@+id/btnSyscData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="同步数据" />
</LinearLayout>
//MyService.java

public class MyService extends Service {
private boolean running = false;
private String data = "";

public MyService() {

}

@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;
}
public MyService getService(){
return MyService.this;
}
}

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

@Override
public void onCreate() {
super.onCreate();
running = true;
new Thread() {
public void run() {
super.run();
int i=0;
while (running) {
i++;
String str=i+"---service is runing---data:" + data;
System.out.println(str);
if (callback!=null){
callback.onDataChange(str);
}
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}

@Override
public void onDestroy() {
super.onDestroy();
running = false;
}

private Callback callback=null;

public void setCallback(Callback callback) {
this.callback = callback;
}

public Callback getCallback() {
return callback;
}

public  static interface  Callback{
void onDataChange(String data);
}
}
//MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener, ServiceConnection {

private Button btnStartService;
private Button btnStopService;
private Button btnBindService;
private Button btnUnbindService;
private Button btnSyscData;
private EditText etServiceData;
private TextView tvCallbackData;
private Intent intent;
private MyService.Binder binder = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

btnStartService = (Button) findViewById(R.id.btnStartService);
btnStopService = (Button) findViewById(R.id.btnStopService);
btnBindService = (Button) findViewById(R.id.btnBindService);
btnUnbindService = (Button) findViewById(R.id.btnUnbindService);
btnSyscData = (Button) findViewById(R.id.btnSyscData);
etServiceData = (EditText) findViewById(R.id.etServiceData);
tvCallbackData = (TextView) findViewById(R.id.tvCallbackData);
btnStartService.setOnClickListener(this);
btnStopService.setOnClickListener(this);
btnBindService.setOnClickListener(this);
btnUnbindService.setOnClickListener(this);
btnSyscData.setOnClickListener(this);

intent = new Intent(MainActivity.this, MyService.class);
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnStartService:
intent.putExtra("data", etServiceData.getText().toString());
startService(intent);
break;
case R.id.btnStopService:
stopService(intent);
break;
case R.id.btnBindService:
intent.putExtra("data", etServiceData.getText().toString());
bindService(intent, this, Context.BIND_AUTO_CREATE);
break;
case R.id.btnUnbindService:
unbindService(this);
break;
case R.id.btnSyscData:
if (binder != null) {
Toast.makeText(MainActivity.this, "jamie", Toast.LENGTH_SHORT).show();
binder.setData(etServiceData.getText().toString());
} else {
Toast.makeText(MainActivity.this, "jamie---------------1", Toast.LENGTH_SHORT).show();
}

break;
}
}

private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
tvCallbackData.setText(msg.getData().toString());
}
};

@Override
public void onServiceConnected(ComponentName name, IBinder service) {
binder = (MyService.Binder) service;
binder.getService().setCallback(new MyService.Callback() {
@Override
public void onDataChange(String _data) {
Message message = new Message();
Bundle bundle = new Bundle();
bundle.putString("backData", _data);
message.setData(bundle);
handler.sendMessage(message);
}
});
}

@Override
public void onServiceDisconnected(ComponentName name) {
}
}

在将数据从Service服务传递到Activity时用的是回调的方法,同时因为Android的机制是其他线程不能处理界面线程,所以在Activity界面也需要用Handler实现不同进程的通讯。

完整的项目代码地址点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: