zoukankan      html  css  js  c++  java
  • Android基调(十六)- Service:startService()、stopService()、bindService()、unbindService()加

    开门见山

    开启服务有三种情况:假设直接使用服务,则没有必要进行绑定,可是假设要使用服务里面的方法。则要进行绑定。

    具体的启动情况有下:
    ①调用startService()。再调用stopService()
    ②单独调用bindService()方法,再unbindService()后,以运行服务内部的方法。
    ③先调用startService(),再调用bindService()方法,再调用unbindService()。最后调用stopService()

    特殊情况:
    仅仅要使用了bindService,无论之后是否解绑和停止服务,都能够调用服务中的方法

    以下针对这三种启动顺序分别做具体说明。

    在解说之前先贴一下代码:
    MyService类。里面就不加凝视了

    public class MyService extends Service {
    
        @Override
        public IBinder onBind(Intent intent) {
            return new MyBinder();
        }
    
        @Override
        public void onCreate() {
            System.out.println("MyService onCreate():Called by the system when the service is first created");
            super.onCreate();
        }
    
        @Override
        public boolean onUnbind(Intent intent) {
            System.out.println("MyService onUnbind():Called when all clients have disconnected from a particular interface published by the service.");
            return super.onUnbind(intent);
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            System.out.println("MyService onStartCommand():Called by the system every time a client explicitly starts the service by calling android.content.Context.startService, providing the arguments it supplied and a unique integer token representing the start request.");
            return super.onStartCommand(intent, flags, startId);
        }
    
        @Override
        public void onDestroy() {
            System.out.println("MyService onDestroy():Called by the system to notify a Service that it is no longer used and is being removed. ");
            super.onDestroy();
        }
    
        public void method1() {
            System.out.println("MyService is method1");
        }
    
        public void method2() {
            System.out.println("MyService is method2");
        }
    
        class MyBinder extends Binder {
    
            public void callMethod1() {
                method1();
            }
    
            public void callMethod2() {
                method2();
            }
        }
    }

    MainActivity类

    public class MainActivity extends Activity {
        private MyBinder myBinder;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            conn = new MyServiceConnection();
        }
    
        ServiceConnection conn;
    
        public void start(View v) {
            Intent service = new Intent(this, MyService.class);
            startService(service);
        }
    
        public void bind(View v) {
            Intent service = new Intent(this, MyService.class);
            bindService(service, conn, Context.BIND_AUTO_CREATE);
        }
    
        public void unbind(View v) {
            unbindService(conn);
        }
    
        public void stop(View v) {
            Intent service = new Intent(this, MyService.class);
            stopService(service);
        }
    
        public void callmethod1(View v) {
            myBinder.callMethod1();
        }
    
        private class MyServiceConnection implements ServiceConnection {
    
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                System.out.println("MyServiceConnection connection success");
                myBinder = (MyBinder) service;
            }
    
            @Override
            public void onServiceDisconnected(ComponentName name) {
                System.out.println("MyServiceConnection disconnection success");
            }
        }
    }
    

    activity_main.xml页面布局

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity" >
    
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="start"
            android:text="startService" />
    
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="bind"
            android:text="bindService" />
    
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="unbind"
            android:text="unbindService" />
    
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="stop"
            android:text="stopService" />
    
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="callmethod1"
            android:text="call Method1" />
    
    </LinearLayout>

    第一种

    调用startService(),再调用stopService()。这样的情况适用于直接使用Service。不须要外部调用服务内部的方法。

    在这一种中,我们分别会点击startService和stopService。在类MyService中,会以onCreate()開始 — 代表第一次创建服务;以onDestory()结束 — 代表服务被销毁。中间会一次或者多次调用(当重复startService时)onStartCommand()方法 — 来表示客户端想明白的启动服务。

    当点击startService时,会触发onCreate()onStartCommand()方法。表示服务是第一次创建而且是客户端明白要求的。

    这两个方法运行完成后。后台的服务线程启动。

    看一下这张图:

    这个过程相应的Log图和应用后台服务进程图例如以下:

    能够清楚的看到。调用了onCreate()onStartCommand()方法,同一时候后台的服务进程也已经启动。

    当点击stopService时,会触发onDesctory(),此时会去销毁后台服务进程。
    看一下这张图:

    这个过程相应的Log图和应用后台服务进程图例如以下:

    能够清楚的看到,调用onDesctory()方法。同一时候后台服务线程也被销毁了。

    另外一种

    单独调用bindService()方法将Activity和Service绑定,以达到服务内部方法的目的。再调用unbindService()解绑。

    在这一种中,我们分别会点击bindService和unbindService,在类MyService中,会以onCreate()開始 — 代表第一次创建服务;以onDestory()结束 — 代表服务被销毁;在中间。当绑定成功时,会调用onServiceConnected()表明Activity和Service连接成功;当解除绑定时,会调用onUnbind()表明Activity和Service解除连接成功。

    当点击bindService时,会触发onCreate()onServiceConnected()方法。以达到调用服务内部方法的目的。可是。请注意后台服务进程并没有启动

    看一下这张图:

    这个过程相应的Log图和应用后台服务进程图例如以下:

    能够清楚的看到,调用了onCreate()onServiceConnected()方法,可是。后台的服务进程却没有启动

    绑定后就能够调用服务内部的方法了。而MyService is method1就是证明。

    当点击unbindService时,会触发onUnbind()onDestory()方法表明解除绑定和销毁服务。


    看一下这张图:

    这个过程相应的Log图和应用后台服务进程图例如以下:

    能够清楚的看到,调用onUnbind()onDesctory()方法,后台也没有服务线程。可是,尽管解除了绑定,我们却依然能够调用服务中的方法。

    第三种

    先调用startService()。再调用bindService()方法,再调用unbindService(),最后调用stopService(),这样的情况适用于希望服务能够在后台长期运行。仅仅要不stopService就不停止,也能够让Activity调用服务中的方法。

    当着四种组合使用时。请依照下图的方式点击调用:

    我们能够看到,运行方法的顺序是一级一级的。当上一级没有触发时,是无法进入到下一级的。

    当点击完startService和bindService时,Log和后台进程图例如以下所看到的:

    能够看到。后台进程启动,而且Activity和Service绑定成功。且能够调用后台的方法。

    当点击完unbindService时,会运行onUnbind()方法解除绑定,Log和后台进程图例如以下:

    能够看到,尽管解除绑定了,可是服务没有销毁,服务中的内容依然能够被调用。

    当点击完stopService时,服务被销毁onDestory()方法被运行,Log和后台进程图例如以下:

    能够看到,后台的服务已经被销毁了,可是。重点中的重点,服务中的方法依然能够被调用。

    总结

    开启服务有三种情况:假设直接使用服务,则没有必要进行绑定,可是假设要使用服务里面的方法,则要进行绑定。

    另外,仅仅要使用了bindService,无论之后是否解绑和停止服务,都能够调用服务中的方法

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    JS字符串函数String.replace()[转]
    分辨率和比例尺[转]
    DateDiff 函数的用法 SQL时间比较
    ASP.NET 2.0 本地化2
    ASP.NET 2.0 本地化1
    简单的分页过程,确在第10,20,30....等页,不能显示,请求帮忙,谢谢
    JQuery打造的分页无刷新的Repeater
    让flash置于DIV层之下的方法,让flash不挡住飘浮层或下拉菜单
    VS2005 + VSS6.0 简单应用示例
    SQLServer查询最近一天,三天,一周,一月,一季度方法
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4791250.html
Copyright © 2011-2022 走看看