service类
public class MyService extends Service {
private String name = "zzz";
private boolean running = false;
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
Log.i("lgqq","body=33444====onBind");
return new MyBinder();
}
public class MyBinder extends Binder implements IBinder {
public void setName(String name) {
MyService.this.name = name;
}
public MyService getService() {
return MyService.this;
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("lgqq","body=233====onStartCommand");
// return super.onStartCommand(intent, flags, startId);
return START_STICKY;
}
@Override
public void onCreate() {
super.onCreate();
Log.i("lgqq","body==22===onCreate");
new Thread() {
@Override
public void run() {
super.run();
running = true;
int i = 0;
while (running) {
if (onMyServiceListener != null) {
onMyServiceListener.onNameChange(name + (i++));//service参数传到context
}
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
@Override
public void onDestroy() {
super.onDestroy();
running = false;
}
private OnMyServiceListener onMyServiceListener = null;
public void setOnMyServiceListener(OnMyServiceListener onMyServiceListener) {
this.onMyServiceListener = onMyServiceListener;
}
public OnMyServiceListener getOnMyServiceListener() {
return onMyServiceListener;
}
public static interface OnMyServiceListener {
void onNameChange(String name);
}
}
activity类
public class MyServiceactivity extends AppCompatActivity implements ServiceConnection {
private static final int RECALL_NAME = 0;
private TextView textView;
private EditText editText;
private MyService.MyBinder binder;
private android.os.Handler handler = new android.os.Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.arg1 == RECALL_NAME) {
textView.setText(msg.getData().getString("name"));
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.myservicetesx);
textView = (TextView) findViewById(R.id.textView);
editText = (EditText) findViewById(R.id.editText);
Intent intent = new Intent(this, MyService.class);
startService(intent);
bindService(intent, this, Context.BIND_AUTO_CREATE);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (binder != null) {
binder.setName(editText.getText().toString());//context参数传到service
}
}
});
findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
unbindService();
}
});
}
private void unbindService() {
if (binder != null) {
unbindService(this);
binder = null;
}
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
binder = (MyService.MyBinder) service;
binder.getService().setOnMyServiceListener(new MyService.OnMyServiceListener() {
@Override
public void onNameChange(String name) {
Message message = new Message();
Bundle bundle = new Bundle();
bundle.putString("name", name);
message.setData(bundle);
message.arg1 = RECALL_NAME;
handler.sendMessage(message);
}
});
}
@Override
public void onServiceDisconnected(ComponentName name) {
unbindService();
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService();
}
}
<activity android:name=".MyServiceactivity"></activity>
<service android:name=".MyService"></service>
具体步骤:
service 1、创建自定义Binder类实现 IBinder接口
private String name = "zzz";
public class MyBinder extends Binder implements IBinder {
public void setName(String name) {//activity2service参数方法
MyService.this.name = name;
Log.i("lgqq","body=activity2service===="+name);
}
public MyService getService() {//获取service 实例
return MyService.this;
}
}
service 2、创建回调接口
private OnMyServiceListener onMyServiceListener = null;
public void setOnMyServiceListener(OnMyServiceListener onMyServiceListener) {
this.onMyServiceListener = onMyServiceListener;
}
public static interface OnMyServiceListener {
void onNameChange(String name);//service2activity参数方法
}
service3、service参数到activity
if (onMyServiceListener != null) {
onMyServiceListener.onNameChange(name + (i++));//service参数传到context
}
activity1、实现ServiceConnection接口
public class TwoActivity extends Activity implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
binder = (MyService.MyBinder) service;
binder.getService().setOnMyServiceListener(new MyService.OnMyServiceListener() {
@Override
public void onNameChange(String name) {//接收service参数
Message message = new Message();
Bundle bundle = new Bundle();
bundle.putString("name", name);
Log.i("lgq","........service2activity====="+name);
// message.setData(bundle);
// message.arg1 = RECALL_NAME;
// handler.sendMessage(message);
}
});
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
activity2、创建service自定义binder
private MyService.MyBinder binder;
activity3、开启service
startService(intent); bindService(intent, TwoActivity.this, Context.BIND_AUTO_CREATE);
activity4、activity参数到service
binder.setName("阿安保部");
停止service
stopService(intent); unbindService(TwoActivity.this);
public static boolean isServiceRunning(Context context, Class<?> serviceClass) {
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningServiceInfo service : activityManager.getRunningServices(Integer.MAX_VALUE)) {
if (service.service.getClassName().equals(serviceClass.getName())) {
return true;
}
}
return false;
}
本文介绍了一个具体的Android服务(Service)示例,展示了如何通过自定义Binder实现Service与Activity之间的双向通信。包括创建自定义Binder类、实现回调接口、传递参数等关键步骤。
1726






