Service的启动方式以及停止的方式两种:
第一:绑定和解除绑定的方式,如果要实现activity和Service之间进行通讯的话,要在Service中写回调函数,其中定义内部类集成binder,在Activity中绑定
bindService(intent, sc, Context.BIND_AUTO_CREATE);
sc = new ServiceConnection() {
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public void onServiceDisconnected(ComponentName name) {
<span style="white-space:pre"> </span>// 解除绑定的时候
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public void onServiceConnected(ComponentName name, IBinder service) {
<span style="white-space:pre"> </span>// 建立绑定
<span style="white-space:pre"> </span>mbinder = (Myservice.MyBinder) service;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>};
第二种是start和stop的方式,这种方式:
如果一个Service被某个Activity 调用 Context.startService 方法启动,那么不管是否有Activity使用bindService绑定或unbindService解除绑定到该Service,该Service都在后台运行。如果一个Service被startService 方法多次启动,那么onCreate方法只会调用一次,onStart将会被调用多次(对应调用startService的次数),并且系统只会创建Service的一个实例(因此你应该知道只需要一次stopService调用)。该Service将会一直在后台运行,而不管对应程序的Activity是否在运行,直到被调用stopService,或自身的stopSelf方法。当然如果系统资源不足,android系统也可能结束服务。
bindService()和start都能使Service调用Oncreat()方法,而且onCreat()方法只调用一次。
《1》多次使用StartService的时候回多次调用onStart()方法。
《2》多次调用bindService什么都不会调用。
package com.example.burdemo;
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.Handler;
import android.os.IBinder;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class ServiceDemoActivity extends Activity implements OnClickListener {
private ServiceConnection sc;
private Button bt1, bt2, bt3, bt4, bt5, bt6;
boolean isConn;
private EditText editText1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_service_demo);
bt1 = (Button) this.findViewById(R.id.button1);
bt2 = (Button) this.findViewById(R.id.button2);
bt3 = (Button) this.findViewById(R.id.button3);
bt4 = (Button) this.findViewById(R.id.button4);
bt5 = (Button) this.findViewById(R.id.button5);
bt6 = (Button) this.findViewById(R.id.button6);
bt1.setOnClickListener(this);
bt2.setOnClickListener(this);
bt3.setOnClickListener(this);
bt4.setOnClickListener(this);
bt5.setOnClickListener(this);
bt6.setOnClickListener(this);
editText1 = (EditText) findViewById(R.id.editText1);
sc = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
// 解除绑定的时候
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 建立绑定
mbinder = (Myservice.MyBinder) service;
}
};
}
Myservice.MyBinder mbinder;
// 绑定点击事件
@Override
public void onClick(View v) {
int id = v.getId();
if (id == R.id.button1) {
Log.d("drummor", "开始吧");
Intent intent = new Intent(this, Myservice.class);
bindService(intent, sc, Context.BIND_AUTO_CREATE);
isConn = true;
} else if (id == R.id.button2) {
if (isConn) {
Log.d("drummor", "解除绑定!");
mbinder.stopThread();
unbindService(sc);
isConn = false;
}
} else if (id == R.id.button3) {
Intent intent = new Intent(this, OtherActivity.class);
Log.d("drummor", "");
startActivity(intent);
} else if (id == R.id.button4) {
handler.post(runable);
} else if (id == R.id.button5) {
stopService(new Intent(this, Myservice.class));
} else if (id == R.id.button6) {
startService(new Intent(this, Myservice.class));
}
}
Runnable runable = new Runnable() {
@Override
public void run() {
Message msg = new Message();
msg.what = mbinder.getNum();
handler.sendMessage(msg);
handler.postDelayed(runable, 1000);
}
};
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
editText1.setText("djdki" + msg.what);
}
};
}
service中的操作:
package com.example.burdemo;
import android.app.Service;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
public class Myservice extends Service {
public MyBinder myBinder;
public MyThread t;
public int i = 0;
class MyBinder extends Binder {
public Myservice getService() {
return Myservice.this;
}
public int getNum() {
return i;
}
public void stopThread() {
t.isRun = false;
}
}
@Override
public void onCreate() {
super.onCreate();
Log.d("drummor", "------------->创建service");
myBinder = new MyBinder();
run();
}
private void run() {
t = new MyThread();
t.start();
}
class MyThread extends Thread {
boolean isRun = true;
@Override
public void run() {
Log.d("drummor", "运行了么" + isRun);
while (isRun) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.d("drummor", "------------->" + (i++));
}
}
}
@Override
public IBinder onBind(Intent intent) {
Log.d("drummor", "------------->建立绑定");
return myBinder;
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
Log.d("drummor", "------------->onStart");
super.onStart(intent, startId);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("drummor", "------------->start");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void unbindService(ServiceConnection conn) {
// TODO Auto-generated method stub
Log.d("drummor", "------------->解除绑定");
super.unbindService(conn);
}
@Override
public void onDestroy() {
t.isRun = false;
super.onDestroy();
Log.d("drummor", "------------->销毁");
}
}