zoukankan      html  css  js  c++  java
  • 每日日报2021 5/22

    Context的bindService方法:

    • ServiceConnection对象:监听访问者与Service间的连接情况,如果成功连接,回调 onServiceConnected(),如果异常终止或者其他原因终止导致Service与访问者断开 连接则回调onServiceDisconnected方法,调用unBindService()不会调用该方法!
    • onServiceConnected方法中有一个IBinder对象,该对象即可实现与被绑定Service 之间的通信!我们再开发Service类时,默认需要实现IBinder onBind()方法,该方法返回的 IBinder对象会传到ServiceConnection对象中的onServiceConnected的参数,我们就可以 在这里通过这个IBinder与Service进行通信Step 1:在自定义的Service中继承Binder,实现自己的IBinder对象

    Step 2:通过onBind( )方法返回自己的IBinder对象
    Step 3:在绑定该Service的类中定义一个ServiceConnection对象,重写两个方法, onServiceConnected和onDisconnected!然后直接读取IBinder传递过来的参数即可!

    那么好了,接下来就是写代码验证了,这里的话我们定义一个用来计时的Service, 然后来演示BindService的用法以及方法调用流程!代码比较简单,不解释了!

    TestService2.java:

    public class TestService2 extends Service {  
        private final String TAG = "TestService2";  
        private int count;  
        private boolean quit;  
          
        //定义onBinder方法所返回的对象  
        private MyBinder binder = new MyBinder();  
        public class MyBinder extends Binder  
        {  
            public int getCount()  
            {  
                return count;  
            }  
        }  
          
        //必须实现的方法,绑定改Service时回调该方法  
        @Override  
        public IBinder onBind(Intent intent) {  
            Log.i(TAG, "onBind方法被调用!");  
            return binder;  
        }  
      
        //Service被创建时回调  
        @Override  
        public void onCreate() {  
            super.onCreate();  
            Log.i(TAG, "onCreate方法被调用!");  
            //创建一个线程动态地修改count的值  
            new Thread()  
            {  
                public void run()   
                {  
                    while(!quit)  
                    {  
                        try  
                        {  
                            Thread.sleep(1000);  
                        }catch(InterruptedException e){e.printStackTrace();}  
                        count++;  
                    }  
                };  
            }.start();  
              
        }  
          
        //Service断开连接时回调  
        @Override  
        public boolean onUnbind(Intent intent) {  
            Log.i(TAG, "onUnbind方法被调用!");  
            return true;  
        }  
          
        //Service被关闭前回调  
        @Override  
        public void onDestroy() {  
            super.onDestroy();  
            this.quit = true;  
            Log.i(TAG, "onDestroyed方法被调用!");  
        }  
          
        @Override  
        public void onRebind(Intent intent) {  
            Log.i(TAG, "onRebind方法被调用!");  
            super.onRebind(intent);  
        }  
    }

    在AndroidManifest.xml中对Service组件进行注册:

    <service android:name=".TestService2" android:exported="false">  
            <intent-filter>  
                <action android:name="com.jay.example.service.TEST_SERVICE2"/>  
            </intent-filter>  
    </service>

    MainActivity.java:

    public class MainActivity extends Activity {  
      
        private Button btnbind;  
        private Button btncancel;  
        private Button btnstatus;  
          
        //保持所启动的Service的IBinder对象,同时定义一个ServiceConnection对象  
        TestService2.MyBinder binder;  
        private ServiceConnection conn = new ServiceConnection() {  
              
            //Activity与Service断开连接时回调该方法  
            @Override  
            public void onServiceDisconnected(ComponentName name) {  
                System.out.println("------Service DisConnected-------");  
            }  
              
            //Activity与Service连接成功时回调该方法  
            @Override  
            public void onServiceConnected(ComponentName name, IBinder service) {  
                System.out.println("------Service Connected-------");  
                binder = (TestService2.MyBinder) service;  
            }  
        };  
          
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.activity_main);  
            btnbind = (Button) findViewById(R.id.btnbind);  
            btncancel = (Button) findViewById(R.id.btncancel);  
            btnstatus  = (Button) findViewById(R.id.btnstatus);  
            final Intent intent = new Intent();  
            intent.setAction("com.jay.example.service.TEST_SERVICE2");  
            btnbind.setOnClickListener(new OnClickListener() {            
                @Override  
                public void onClick(View v) {  
                    //绑定service  
                    bindService(intent, conn, Service.BIND_AUTO_CREATE);                  
                }  
            });  
              
            btncancel.setOnClickListener(new OnClickListener() {  
                @Override  
                public void onClick(View v) {  
                    //解除service绑定  
                    unbindService(conn);                  
                }  
            });  
              
            btnstatus.setOnClickListener(new OnClickListener() {  
                @Override  
                public void onClick(View v) {  
                    Toast.makeText(getApplicationContext(), "Service的count的值为:"  
                            + binder.getCount(), Toast.LENGTH_SHORT).show();  
                }  
            });  
        }  
    }
  • 相关阅读:
    近期总结
    input
    mysql语句
    同步与异步
    localStorage的增删查改封装函数
    最基本的前后台传值
    前段存储的调用函数
    js 控制弹出窗口的大小
    拖拽
    jQuery镇张缩小动画
  • 原文地址:https://www.cnblogs.com/song-1/p/14882061.html
Copyright © 2011-2022 走看看