android Service 和数据序列化

      此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>

运行截图:






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值