<span style="font-size:18px;">package com.example.androidservice;
import java.util.Random;
import com.example.androidservice.Myservice.Mybinder;
import com.example.androidservice.Myservice.callback;
import android.os.Bundle;
import android.os.IBinder;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity {
protected static final String TAG = null;
Button start, bind, stop, unbind,fasong;
boolean iscon=false;
Myservice.Mybinder mybinder;
EditText edit;
TextView textv;
ServiceConnection con;
private Button updata;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
start = (Button) this.findViewById(R.id.id_start);
bind = (Button) this.findViewById(R.id.id_bangding);
stop = (Button) this.findViewById(R.id.id_communication);
unbind = (Button) this.findViewById(R.id.id_unbinder);
edit=(EditText) this.findViewById(R.id.id_edit);
textv=(TextView)this.findViewById(R.id.id_xianshi);
fasong=(Button)this.findViewById(R.id.id_fasong);
updata=(Button)this.findViewById(R.id.id_updata);
con=new MyServiceConnection();
initevent();
}
private void initevent() {
//************************开始服务********************************************
start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent =new Intent(MainActivity.this,Myservice.class);
intent.putExtra("code","海贼王");
startService(intent);
}
});
//*************************绑定服务*******************************************
bind.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.i(TAG, "点击了");
if(iscon) return;
Intent intent =new Intent(MainActivity.this,Myservice.class);
bindService(intent, con, BIND_AUTO_CREATE);
}
});
//***********************解除绑定*********************************************
unbind.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//如果iscon true 说明正在与服务连接中 可以解除服务
if(iscon){
Intent intent =new Intent(MainActivity.this,Myservice.class);
unbindService(con);}
}
});
//*************************发送消息*******************************************
fasong.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(!TextUtils.isEmpty(edit.getText().toString().trim())&&mybinder!=null){
mybinder.onChange(edit.getText().toString().trim());
}
}
});
//停止服务
stop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(iscon) {
Intent intent =new Intent(MainActivity.this,Myservice.class);
//停止服务
stopService(intent);
}
}
});
//设置回调接口 绑定服务后 更新过来的数据
updata.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(mybinder!=null){
//设置回调接口
mybinder.getMyService().setCallBack(new callback() {
@Override
public void onUpdata(final String str) {
runOnUiThread( new Runnable() {
public void run() {
textv.setText(str);
}
});
}
});}
}
});
}
// connectivitymannager的回调方法 传回IBinder对象
private class MyServiceConnection implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mybinder=(Mybinder)service;
iscon=true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
iscon=false;
}
}
}
</span>
service类:
<span style="font-size:18px;">package com.example.androidservice;
import java.util.Random;
import android.R.bool;
import android.app.IntentService;
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 static final String TAG = "Myservice";
private String data;
String defaultData="默认数据";
callback call;
boolean isStart;
Thread mThread;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
System.out.print("service绑定");
Mybinder binder=new Mybinder();
return binder;//返回一个Binder
}
public class Mybinder extends Binder{
public void onChange(String str){
change(str);
}
public Myservice getMyService(){
return Myservice.this;
}
}
public void setCallBack(callback call){
this.call=call;
}
public callback getCallBack(){
return this.call;
}
private void change(String str){
defaultData=str;
}
@Override
public void onCreate() {
System.out.print("service 创建");
super.onCreate();
mThread=new Thread(new Runnable() {
@Override
public void run() {
isStart=true;
//开启循环 更新消息
while (isStart) {
//activity发送数据 开启随机数字回调
String str=defaultData+""+getRandom();
if(call!=null){
call.onUpdata(str);
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
mThread.start();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.print("service 开始");
String str=intent.getStringExtra("code");
System.out.print(str);
// START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
//
// START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
//
// START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
//
//
// START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
return super.onStartCommand(intent, flags, startId);
}
/**
*
* @author Administrator
*
*/
public static interface callback{
void onUpdata(String str);
}
public int getRandom(){
Random random=new Random();
return random.nextInt(1000);
}
@Override
public boolean onUnbind(Intent intent) {
Log.i(TAG, "onUnbind");
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
isStart=false;
Log.i(TAG, "service 已经停止");
super.onDestroy();
}
}
</span>