Android Service学习(三)

作者: 心若冰清_ | 来源:发表于2017-06-29 17:27 被阅读59次

    针对Android四大组件之一的service做了一些细节的说明,本篇主要针对Android Service学习(一)作一些补充。


    补充1

    android的后台指的是运行是不依赖于UI界面的,即使activity被销毁或者APP被关闭,只要进程还在,service就可以继续运行,这一点依赖于service的线程是运行在APP的进程中的主UI线程。

    Thread:用于开启一个子线程去执行一些比较耗时的操作,如下载等。之所以选择在service中新建一个线程而不是在activity中建立,是因为activity很难对thread进行控制,当activity被销毁,就没有办法重新获得之前创建的线程的实例,此外,在一个A activity创建的子线程,在另一个B activity是无法对A创建的子线程进行操作的。而所有的activity都可以与service进行绑定,然后就可以操作其中的方法,即使activity被销毁,之后只要重新与service进行绑定,就可以重新获取service中的Binder实例,不需要担心无法对后台控制的问题,activity也就可以放心的finish();

    常用的service可以被写成:

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e(TAG,"onStartCommand excused");
        new Thread(new Runnable() {
            @Override
            public void run() {
                //开始执行后台任务
            }
        }).start();
        return super.onStartCommand(intent, flags, startId);
    }
    
    //具体的Binder实例
    public class MyBinder extends Binder {
        public void startDownLoad(){
            Log.e(TAG,"开始下载");
            new Thread(new Runnable() {
                @Override
                public void run() {
                    //执行具体的耗时的下载任务
                }
            }).start();
        }
    }
    

    补充2

    针对service的开启和停止,通过以下log来具体的展示:

    1. 开启

    使用startService(intent)开启服务,调用log如下:

    com.example.slide_table E/MyService:on Create excused
    com.example.slide_table E/MyService:onStartCommand excused
    com.example.slide_table E/MyService:onDestroy excused
    

    使用bindService(intent)绑定服务,调用log如下:

    com.example.slide_table E/MyService: on Create excused
    com.example.slide_table E/MyService: 开始下载
    com.example.slide_table E/MyService: onDestroy excused
    

    如上log的结果,在调用bind绑定服务的时候并不会执行onStartCommand()函数。

    2. 停止

    使用startService(intent)开启服务,然后接着点击bindService(intent),单独的点击stopService(intent)或者unbind(connection)都不会停止service,只有在点击stopService(intent)后紧接着点击unbind(connection),或者点击unbind(connection)紧接着点击stopService(intent)才会销毁该service。

    即:点击stop按钮只会让service停止,点击unbind按钮只会让service和activity解除绑定,一个service只有在既没有和任何activity绑定的时候且又处于停止状态的时候才会被销毁。

    具体的log如下:

    com.example.slide_table E/MyService: on Create excused//使用start开启
    com.example.slide_table E/MyService: onStartCommand excused
    com.example.slide_table E/MyService: 开始下载//点击bind按钮
    com.example.slide_table E/MyService: 停止线程//点击stop按钮
    com.example.slide_table E/MyService: onDestroy excused//点击unbind按钮
    com.example.slide_table E/MyService: on Create excused
    com.example.slide_table E/MyService: onStartCommand excused
    com.example.slide_table E/MyService: 开始下载
    com.example.slide_table E/MyService: 解除绑定//点击unbind按钮
    com.example.slide_table E/MyService: 停止线程//点击stop按钮
    com.example.slide_table E/MyService: onDestroy excused
    

    Android service的分享学习暂且告一段落,后续还会根据项目中实际遇到的service的应用作说明,分析。如即将撰写的关于Android蓝牙开发中遇到的service的应用。

    以上博客中关于分享的知识点或者遇到的问题,以及不正确的地方还请帮忙指出,谢谢。。。

    相关文章

      网友评论

        本文标题:Android Service学习(三)

        本文链接:https://www.haomeiwen.com/subject/nlqvcxtx.html