Service(远程服务)

什么是远程服务


Remote Service 用于Android系统内部的应用程序之间。可以定义接口并把接口暴露出来,以便其他应用进行操作。客户端建立到服务对象的连接,并通过那个连接来调用服务。调用Context.bindService()方法建立连接,并启动,以调用 Context.unbindService()关闭连接。多个客户端可以绑定至同一个服务。如果服务此时还没有加载,bindService()会先加载它。


这里写图片描述

代码示例

带有(公用服务)A程序

  • Activity内
package com.example.myapplication_service;

public class My_Activity_Service extends AppCompatActivity {

    private EditText my_activity_service1;
    private EditText my_activity_service_password1;
    private Intent intent;
    private IMy_Login_AidlInterface iMy_login_aidlInterface;

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

        //取到登录,的,账号密码 控件
        my_activity_service1 = (EditText) findViewById(R.id.my_activity_service);
        my_activity_service_password1 = (EditText) findViewById(R.id.my_activity_service_password);

        //使用意图,启动服务,参数一,从哪个Activity跳转  参数二: 被启动服务的类
        intent = new Intent(My_Activity_Service.this,Service2.class);
    }

    //service  连接
    ServiceConnection serviceConnection=new ServiceConnection() {
        @Override//连接成功
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.i("test","连接成功");
            //当绑定成功,Seviece类,会返回,绑定后的IBinder对象
            // (就是我刚才在onBind(Intent intent)中返回的对象 )

            //已知,IBinder类实现了(Andoid Interface  Definition Language)
            //故此,直接使用,此接口内的Stub内部类,的asInterface(service) 接受即可。
            iMy_login_aidlInterface = IMy_Login_AidlInterface.Stub.asInterface(service);
        }

        @Override//连接失败
        public void onServiceDisconnected(ComponentName name) {
            Log.i("test","连接失败");
        }
    };


    //当Activity启动时,绑定服务,
    @Override
    protected void onResume() {
        Log.i("test","绑定服务");
        //参数一:目标  参数二:连接服务   参数三: 连接模式(创建时,自动绑定)
        bindService(intent, serviceConnection, Service.BIND_AUTO_CREATE);
        super.onResume();
    }

    //登录点击事件
    public void click(View view)   {
     //采用,Andoid Interface  Definition Language 的接口,调用,服务内的方法
        try {
            iMy_login_aidlInterface.login(my_activity_service1.getText().toString(),my_activity_service_password1.getText().toString());
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }


}


  • 编写一个类,继承Service(服务类)
package com.example.myapplication_service;

/**
 * Created by Administrator on 2017/3/13.
 */

public class Service2  extends Service{

       //建立一个类,继承( Andoid Interface  Definition Language ) 内的Stub类
        class MyBind  extends IMy_Login_AidlInterface.Stub{

            @Override // Andoid Interface  Definition Language (安卓接口定义语言)
            //内 的功用方法,为了,其他程序,也能调用。
            public void login(String accountNumber, String Password) throws RemoteException {
                Log.i("test","账号是:"+accountNumber+"____密码是:"+Password);
            }

        }


        @Nullable
        @Override //远程服务,使用,绑定服务( bindService() )时,触发
        public IBinder onBind(Intent intent) {
            //绑定时,返回,自定的绑定,对象,然后用,自定一个接口类(Andoid Interface  Definition Language),实现功用服务操作
            return new MyBind();
        }

        @Override//服务创建时 ,调用
        public void onCreate() {
            Log.i("test","服务被创建");
            super.onCreate();
        }

        @Override//服务销毁时 ,调用
        public void onDestroy() {
            Log.i("test","服务被创建");
            super.onDestroy();
        }

        @Override//服务启动时 ,调用
        public int onStartCommand(Intent intent, int flags, int startId) {
            Log.i("test","服务被启动");
            return super.onStartCommand(intent, flags, startId);
        }

    }


  • 配置服务权限(重点)

这里写图片描述



B程序,使用A程序内的服务



  • 在项目中,建立一个包,包名与,服务在A程序里面的相同
    这里写图片描述


  • 复制Andodi Interface Definition Languae接口到,包中
    这里写图片描述


  • B程序Activity
package com.example.my_weixin;

public class MainActivity extends AppCompatActivity {

    private EditText my_activity_service1;
    private EditText my_activity_service_password1;
    private Intent intent;
    private IMy_Login_AidlInterface imy_login_aid;

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

        //取到登录,的,账号密码 控件
        my_activity_service1 = (EditText) findViewById(R.id.my_activity_service);
        my_activity_service_password1 = (EditText) findViewById(R.id.my_activity_service_password);

        //显示跳转 第二种方法,跳转到指定的包内的类服务类,必须加上包名加类名
        intent = new Intent();
        ComponentName componentName=new ComponentName("com.example.myapplication_service","com.example.myapplication_service.Service2");
        intent.setComponent(componentName);
    }

    //service  连接
    ServiceConnection serviceConnecton=new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.i("test","连接成功");
            //当绑定成功,Seviece类,会返回,绑定后的IBinder对象

            //已知,IBinder类实现了(Andoid Interface  Definition Language)
            //故此,直接使用,此接口内的Stub内部类,的asInterface(service) 接受即可。
            //IMy_Login_AidlInterface  接口,是我们从,服务项目中复制过来的,通过它我们才可以实现,跨工程调用服务
            imy_login_aid = IMy_Login_AidlInterface.Stub.asInterface(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

    //当Activity启动时,绑定服务,
    @Override
    protected void onResume() {
        Log.i("test","绑定服务");
        //参数一:目标  参数二:连接服务   参数三: 连接模式(创建时,自动绑定)
        bindService(intent, serviceConnecton, Service.BIND_AUTO_CREATE);
        super.onResume();
    }

    //登录点击事件
    public void click(View view)   {
        //采用,Andoid Interface  Definition Language 的接口,调用,服务内的方法
        try {
            imy_login_aid.login(my_activity_service1.getText().toString(),my_activity_service_password1.getText().toString());
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值