• 以绑定的方式来启动service


    先说下原理,之前我们的启动service就是用startService来启动的,这是显式启动。启动后我们无法得到service中的数据,也无法知道它执行的状态,如果我们要启动它的activity和它建立一个联系,获得他的数据或者是执行其内部的方法时就需要隐式启动了。

    关键原理在于使用一个binder来传递数据,并且要给service配置一个action作为标签。

    BindService

    package com.example.service;
    
    import android.app.Service;
    import android.content.Intent;
    import android.os.Binder;
    import android.os.IBinder;
    import android.util.Log;
    
    public class BindService extends Service{
        
        String tag = getClass().getSimpleName();
    
        private int count = 123;
        private MyBinder binder = new MyBinder();
        
        //建立一个binder对象,用来在onbind中返回
        public class MyBinder extends Binder{
            public int getCount() {
                return count;
            }
        }
        
        /* (非 Javadoc)
         * @see android.app.Service#onBind(android.content.Intent)
         * 连接时执行的方法
         */
        @Override
        public IBinder onBind(Intent intent) {
            // TODO 自动生成的方法存根
            Log.i(tag, "onBind");
            return binder;
        }
        
        /* (非 Javadoc)
         * @see android.app.Service#onUnbind(android.content.Intent)
         * 断开连接时回调方法
         */
        @Override
        public boolean onUnbind(Intent intent) {
            // TODO 自动生成的方法存根
            Log.i(tag, "onUnbind");
            return super.onUnbind(intent);
        }
        
        @Override
        public void onCreate() {
            // TODO 自动生成的方法存根
            super.onCreate();
            Log.i(tag, "onCreat");
        }
        
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            // TODO 自动生成的方法存根
            Log.i(tag, "onStartCommand");
            return super.onStartCommand(intent, flags, startId);
        }
        
        @Override
        public void onDestroy() {
            // TODO 自动生成的方法存根
            super.onDestroy();
            Log.i(tag, "onDestroy");
        }
    
    
    
    }

    这里binder就可以通过其内部的getcount方法来向外部传递数据了。接下来要配置service了,这里的action就是用来给启动时作为标记的。

     <service android:name="com.example.service.BindService" >
                <intent-filter>
                    <action android:name="com.example.service.BindService" />
                </intent-filter>
    </service>

    最后是在activity中通过button来启动service

    package com.example.service;
    
    import android.app.Activity;
    import android.app.Service;
    import android.content.ComponentName;
    import android.content.Intent;
    import android.content.ServiceConnection;
    import android.os.Bundle;
    import android.os.IBinder;
    import android.view.View;
    
    public class MainActivity extends Activity {
    
        private BindService.MyBinder binder;
        private ServiceConnection connection = new ServiceConnection() {
            
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                //连接成功时,获取service的binder对象
                binder = (BindService.MyBinder)service;
            }
            
            @Override
            public void onServiceDisconnected(ComponentName name) {
                // TODO 断开连接时
            }
        };
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
        }
        
        public void buttonListener(View v) {
            //设置action,这样启动的时候就知道是启动哪个service了
            Intent intent = new Intent("com.example.service.BindService");
            switch (v.getId()) {
            case R.id.binderService_button:
                //通过这个过滤器来判断绑定哪个service,所以在配置的时候需要配置action
                bindService(intent, connection, Service.BIND_AUTO_CREATE);
                break;
            case R.id.unbinderService_button:
                unbindService(connection);
                break;
            case R.id.getData_button:
                System.out.println("service 中的数据 = :"+ binder.getCount());
                break;
            default:
                break;
            }
        }
    }
  • 相关阅读:
    sicily 山海经 线段树实例
    常用位运算
    广度优先搜索有环图
    线性O(N)时间复杂度求素数 , 筛法
    sicily2014
    机器学习中相似性度量(转载)
    VS2010中Parallel的使用
    CKeditor与Asp.net验证控件的问题
    将div一直保持到页面底部
    利用DataAnnotations验证实体(类)的属性
  • 原文地址:https://www.cnblogs.com/tianzhijiexian/p/3980683.html
Copyright © 2020-2023  润新知