此demo介绍了android Service的创建、使用、销毁过程,包括在Service和MianActivity之间传递序列化数据的通信方法。
demo:下载地址
MyService.java 源码:
package fk.androiddemo_014;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.os.Parcel;
import android.os.RemoteException;
public class MyService extends Service {//继承Service
public MyService() {
}
@Override
//当第一次创建一个Service对象时,首先调用这个函数
public void onCreate() {
// TODO 自动生成的方法存根
super.onCreate();
System.out.println("S onCreate");
}
@Override
//Service对象被摧毁时调用
public void onDestroy() {
// TODO 自动生成的方法存根
super.onDestroy();
System.out.println("S onDestroy");
}
@Override
//Service的主体,一般在这里写需要进行的服务
// 如果是启动Service这个方法会自动执行,启动时如果之前已经启动过(有了Service对象),会跳过onCreate()直接执行
//如果是绑定Service,这个方法不会自动执行
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO 自动生成的方法存根
System.out.println("flags--" + flags);
System.out.println("startId--" + startId);
System.out.println("S onStart");
return super.onStartCommand(intent, flags, startId);
}
@Override
//当其他的组件绑定该Service时调用
public IBinder onBind(Intent intent) {
IBinder binder = new MyBinder();
return binder;//这个binder用于关联Activity中的binder,实现交互通信
}
class MyBinder extends Binder {
public String getData(){
return "Hello Activity !!";
}
@Override
//Activity中的binder.transact执行时执行,用于实现和Activity的交互通信
protected boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {
System.out.println("code-->" + code);
String s = data.readString();
System.out.println("S-->" + s);
reply.writeString("reply from Service : reply");
return super.onTransact(code, data, reply, flags);
}
}
}
MainActivity.java 源码:
package fk.androiddemo_014;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Binder;
import android.os.IBinder;
import android.os.Parcel;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
Button but1,but2,but3,but4,but5,but6,but7;
Parcel parcel;//把数据序列化后存储起来
Binder binder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
parcel= Parcel.obtain();
but1=(Button)findViewById(R.id.but1);
but1.setOnClickListener(this);
but2=(Button)findViewById(R.id.but2);
but2.setOnClickListener(this);
but3=(Button)findViewById(R.id.but3);
but3.setOnClickListener(this);
but4=(Button)findViewById(R.id.but4);
but4.setOnClickListener(this);
but5=(Button)findViewById(R.id.but5);
but5.setOnClickListener(this);
but6=(Button)findViewById(R.id.but6);
but6.setOnClickListener(this);
but7=(Button)findViewById(R.id.but7);
but7.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Intent intent=new Intent();//intent可以让Activity给Service传递消息
intent.setClass(this, MyService.class);
if(v==but1){
//创建一个启动Service,这种Service独立于Activity,Activity销毁后Service还能运行
//配合stopService()关闭
startService(intent);
}else if(v==but2){
stopService(intent);//关闭这个Service
}else if(v==but3){
//得到一个绑定的Service,这种Service能和Activity交互通信,如果Activity销毁,它也会销毁
//配合unbindService()解除绑定销毁服务
bindService(intent,conn,BIND_AUTO_CREATE);//BIND_AUTO_CREATE绑定Service时自动创建Service对象
}else if(v==but4){//将数据序列化存放
//依次往parcel里面存数据
parcel.writeString("abc");
parcel.writeInt(123);
parcel.writeFloat(1.0f);
}else if(v==but5){//取出序列化的数据
//把游标放到开头
parcel.setDataPosition(0);
//依次从parcel读取数据,注意要和写数据时顺序一样
String str=parcel.readString();
int i=parcel.readInt();
float f=parcel.readFloat();
System.out.println(str+i+f);
}else if(v==but6){//和绑定的Service通信
Parcel data=Parcel.obtain();
Parcel reply=Parcel.obtain();
data.writeString("from activity : data");
try {
//关联执行Service中的onTransact,实现和Service的交互通信
binder.transact(0, data, reply, 0);
String s=reply.readString();
System.out.println("service-->"+s);
} catch (RemoteException e) {
e.printStackTrace();
}
}else if(v==but7){
unbindService(conn);//解除绑定,销毁服务
}
}
ServiceConnection conn=new ServiceConnection() {
@Override
//绑定断开时调用,注意正常的解除绑定不会调用这个函数
//只有当因某些原因(如系统资源不足)Service被破坏或被kill时调用
public void onServiceDisconnected(ComponentName name) {
System.out.println("S unbind");
}
@Override
//绑定成功时调用
public void onServiceConnected(ComponentName name, IBinder service) {
//MyService.MyBinder myBinder=(MyService.MyBinder)service;
//System.out.println(myBinder.getData());
MainActivity.this.binder=(Binder)service;//关联Service和Activity中的binder
}
};
}
Manifest.xml :
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="fk.androiddemo_014">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name=".MyService"
android:enabled="true"
android:exported="true"></service>
</application>
</manifest>
运行截图: