Service、AIDL

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void operate(View v){
        switch (v.getId()){
            case R.id.start:
                //启动服务(创建oncreate、启动onstartcommand)
                Intent it1=new Intent(this,MyService.class);
                startService(it1);
                break;
            case R.id.stop://停止后销毁
                Intent it2=new Intent(this,MyService.class);
                stopService(it2);
                break;
            case R.id.bind://先创建(oncreate)才可以绑定成功
                Intent it3=new Intent(this,MyService.class);
                bindService(it3, conn,BIND_AUTO_CREATE);//常量。
                break;
            case R.id.unbind://解绑后销毁
                unbindService(conn);
                break;
        }
    }
    //来源于bindService的参数
    //声明解绑需要用到绑定时的  ServiceConnection  的对象  conn
    //ServiceConnection 用于绑定客户端和Service
    //进度监控,需要继续实现的话先解绑再绑定,实现进度监控。
    private ServiceConnection conn=new ServiceConnection() {
        @Override
        //当客户端正常连接着服务时,执行服务的绑定操作会被调用
        //和 MyService 的自定义内部类 MyBinder 相呼应进行 进度监控
        //MyService中IBinder类的onBind方法的返回值(自定义内部类 MyBinder )
        //作为下面参数IBinder的对象传进来
        public void onServiceConnected(ComponentName name, IBinder iBinder) {

            Log.e("TAG","慕课");
           /*
           //将参数对象 iBinder 强转为自定义内部类类型的对象用于调用 内部方法 获取进度
            MyService.MyBinder mb=(MyService.MyBinder)iBinder;
            int step=mb.progress();
            Log.e("TAG","进度为:"+step);
           */

           //AIDL
           IMyAidlInterface imai=IMyAidlInterface.Stub.asInterface(iBinder);
            try {
                imai.getProgress();
            } catch (RemoteException e) {
                e.printStackTrace();
            }

        }

        //当客户端和服务的连接丢失了
        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };
}
public class MyService extends Service {
    private int i;

    public MyService() {
    }

    //创建
    @Override
    public void onCreate() {
        super.onCreate();
        Log.e("tag","创建");
        //开启一个线程,模拟耗时任务
        new Thread(){
            @Override
            public void run() {
                super.run();
                    try {
                        for(i=1;i<100;i++){
                        sleep(1000);
                        }
                    } catch (InterruptedException e) {
                    }
            }
        }.start();

    }

    //启动


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e("tag","启动");
        return super.onStartCommand(intent, flags, startId);

    }

    //绑定,IBinder是个接口
    //Binder类调用并实现了其所有方法
   /*
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        Log.e("tag","绑定");
        //Binder 实现了IBinder里面的所有方法
        //对于onBind方法而言,要求返回IBinder对象
        //定义一个内部类,继承Binder类
        return  new MyBinder();
    }
    */

    //zi定义一个内部类,继承Binder类
    class MyBinder extends Binder{
        //定义自己需要的方法(实现进度监控)
        public int progress(){
            return i;//获取i的值
        }

    }


    //远程绑定
    @Override
    public IBinder onBind(Intent intent) {
        Log.e("tag","绑定");
        //利用stub类,stub继承了Binder,又实现了IMyAidlInterface的方法 getprogress()
        //所以在new的这个stub类里面重写这个方法getProgress(),返回的是stub
        return  new IMyAidlInterface.Stub() {
            @Override
            public void getProgress() throws RemoteException {
                Log.e("TAG","当前进度:"+i);

            }
        };
    }




    //解绑

    @Override
    public boolean onUnbind(Intent intent) {
        Log.e("tag","解绑");
        return super.onUnbind(intent);
    }

    //摧毁

    @Override
    public void onDestroy() {
        Log.e("tag","摧毁");
        super.onDestroy();
    }
}

aidl

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void operate(View v){
        switch (v.getId()){
            case R.id.start:
                //远程启动服务
                Intent intent=new Intent();
                //在目标包的AndroidManifest.xml里添加一个过滤器(别名),通过寻找名字再找里面的class文件
                intent.setAction("com.jinanchang.myservice");

                startService(intent);
                break;
            case R.id.stop:
                //两种写法
                Intent intent1=new Intent("com.jinanchang.myservice");
                stopService(intent1);
                break;
            case R.id.bind:
                Intent intent2=new Intent("com.jinanchang.myservice");
                bindService(intent2,aidlconn,BIND_AUTO_CREATE);
                break;
            case R.id.unbind:
                Intent intent3=new Intent("com.jinanchang.myservice");
                unbindService(aidlconn);
                break;

        }
    }

    //绑定
    private ServiceConnection aidlconn=new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder iBinder) {
            //AIDL
            IMyAidlInterface imai=IMyAidlInterface.Stub.asInterface(iBinder);
            try {
                imai.getProgress();
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };
}
// IMyAidlInterface.aidl
package com.jinanchang.aidlapplication;

// Declare any non-default types here with import statements

interface IMyAidlInterface {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void getProgress();
}
// 用这个AIDL文件定义自己想做的事情,然后由ReBuild产生一个满足的java类,通过这个java类完成数据共享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值