概念之类的不做多的介绍,直接百度就行了大把的有,这里主要介绍服务开启、服务绑定、数据同步、数据通讯的代码实现
首先在开启服务之前必须的先创建服务代码后面给出,开启服务之后要在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实现不同进程的通讯。
完整的项目代码地址 点击打开链接