Android Service学习(三)

针对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的应用。

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

    原文作者:心若冰清_
    原文地址: https://www.jianshu.com/p/291e673aeccd
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞