定义可绑定式使用的服务
定义的服务 是给 与服务所在进程一致的应用 使用的:
public class LocalService extends Service {
private final IBinder mBinder = new LocalBinder();
/**
* 自定义了一个继承Binder类的类
*/
public class LocalBinder extends Binder {
LocalService getService() {
return LocalService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
private final Random mGenerator = new Random();
/**
* 绑定使用本服务的组件可以通过onBind()方法
* 返回的LocalBinder对象的getService()方法
* 获取到本服务实例对象后,使用本getRandomNumber()方法
*/
public int getRandomNumber() {
return mGenerator.nextInt(100);
}
}
多个 与服务所在进程不一样的进程应用 同时使用服务提供的执行操作时,这些执行操作在服务中只会在同一个线程中同步顺序执行:
import android.app.Service;
import android.content.Intent;
import android.os.Build;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
public class Server extends Service {
private HandlerThread mHandlerThread;
private static class MyHandler extends Handler{
private final static int PRINT_HELLO_WORLD = 1;
private final static int RECEIVER_MESSENGER = 2;
private Messenger mClientMessenger;
MyHandler(HandlerThread handlerThread) {
super(handlerThread.getLooper());
}
@Override
public void handleMessage(Message msg) {
// 执行本方法的线程 == Handler对象绑定的线程
switch (msg.what){
case PRINT_HELLO_WORLD:
System.out.println("Hello World");
break;
case RECEIVER_MESSENGER:
// 接收客户端发送过来的Messenger
mClientMessenger = msg.replyTo;
Message message2 = Message.obtain();
message2.what = 3;
try {
mClientMessenger.send(message2);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
}
}
}
@Override
public void onCreate() {
// 创建 接收Handler发送的消息的线程
mHandlerThread = new HandlerThread("Server");
mHandlerThread.start();
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
Messenger messenger = new Messenger(new MyHandler(mHandlerThread));
return messenger.getBinder();
}
@Override
public void onDestroy() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
mHandlerThread.quitSafely();
}else {
mHandlerThread.quit();
}
super.onDestroy();
}
}
组件使用上述定义的服务
public class LocalActivity extends Activity {
private ServiceConnection mServiceConnection = null;
private boolean isBind = false;
private LocalService mLocalService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_local);
findViewById(R.id.bt_send).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isBind && mLocalService !=null){
int randomNumber = mLocalService.getRandomNumber();
}
}
});
}
@Override
protected void onStart() {
super.onStart();
if (!isBind && mServiceConnection == null){
Intent intent = new Intent(getApplication(), LocalService.class);
mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Toast.makeText(getApplication(), "成功绑定链接服务", Toast.LENGTH_LONG).show();
isBind = true;
LocalService.LocalBinder localBinder = (LocalService.LocalBinder) service;
mLocalService = localBinder.getService();
mLocalService = null;
}
@Override
public void onServiceDisconnected(ComponentName name) {
Toast.makeText(getApplication(), "绑定链接的服务断开了", Toast.LENGTH_LONG).show();
isBind = false;
}
};
bindService(intent, mServiceConnection,Context.BIND_AUTO_CREATE);
}
}
@Override
protected void onStop() {
super.onStop();
if (isBind && mServiceConnection != null){
unbindService(mServiceConnection);
isBind = false;
mServiceConnection = null;
mLocalService = null;
}
}
}
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
private ServiceConnection serviceConnection;
private static class MyHandler extends Handler{
private final static int PRINT_HE_HE = 3;
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case PRINT_HE_HE:
System.out.println("Hello World");
break;
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.bt_bind).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setPackage("com.example.zhq.server");
intent.setAction("com.example.zhq.server.RECEIVER_AND_SEND");
intent.addCategory("android.intent.category.DEFAULT");
serviceConnection = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Messenger messenger = new Messenger(service);
Message message1 = Message.obtain();
message1.what = 1;
// 将客户端创建的Messenger发送给服务端
Message message2 = Message.obtain();
message2.what = 2;
message2.replyTo = new Messenger(new MyHandler());
try {
messenger.send(message1);
messenger.send(message2);
} catch (RemoteException e) {
System.out.println();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
System.out.println();
}
};
bindService(intent,serviceConnection,BIND_AUTO_CREATE);
}
});
findViewById(R.id.bt_unbind).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
unbindService(serviceConnection);
}
});
}
}