四大组件之Service

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liyuali2012/article/details/78428368

四大组件:Activity、Service、Broadcast、ContentProvider。他们都有一个共同点,需要在manifest中注册,不注册不能用的。想到了没?

摘要

Service:服务,是Activty把他启动了之后就管不了他了的一个存在,他可以做任何事,包括操作UI,因为他是运行在主线程的。如果Activty非要管也可以,用Service的onBind()方法,关联之后Activty是可以调用Service内部的方法的。当然就调用一下,想要方法运行的结果,需要写接口回调之类的方式,不然还是传不回来。Service和Activity不怎么熟。说明Service还挺独立。一般用Service干什么呢?例如:下载个大文件、播放音频、实时监控位置、查询天气之类的后台服务比较常见 。零星的实现方式在下面,有这里说的所需知识点。

我能说我以前写service都是自己建个service类然后去manifest里注册吗?今天知道可以像建activity一样新建service,他也会自动生成注册代码。

这里写图片描述

注册文件:

        <!--enabled:是否启用这个服务;exported:是否允许除了当前程序之外的其他程序访问这个服务-->
        <service
            android:name=".MyService"
            android:enabled="true"
            android:exported="true">
        </service>

Service一般常用方法就这几个:

public class MyService extends Service {
    public MyService() {
    }
    /**
     * 用于让activity和service关联
     */
    @Override
    public IBinder onBind(Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");
    }
    /**
     * 服务第一次启动调用,服务是在主线程中运行的,耗时操作都要另开子线程
     */
    @Override
    public void onCreate() {
        super.onCreate();
    }

    /**
     * 每次服务启动都要调用,服务是在主线程中运行的,耗时操作都要另开子线程
     */
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        new Thread(new Runnable(){
        public void run(){
        }
        }).start();
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}
  • 启动服务、停止服务都是定义在Context类中的,所以在活动里可以直接调用。
        //启动服务
        Intent intent=new Intent(this,MyService.class);
        startService(intent);
        //停止服务
        intent=new Intent(this,MyService.class);
        startService(intent);
  • 当然也可以在Service里停止服务,在MyService的任何一个位置调用stopSelf()方法就可以。
  • 活动与服务之间的关联,是用Binder建立的。
    private DownloadBinder mBinder = new DownloadBinder();

    class DownloadBinder extends Binder {

        public void startDownload() {
        }
        public int getProgress() {
            return 0;
        }
    }

    /**
     * 用于让activity和service关联
     *
     * @param intent
     * @return
     */
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

启动关联

        //绑定服务  BIND_AUTO_CREATE:表示在活动和服务进行绑定后自动创建服务
        intent = new Intent(this, MyService.class);
        bindService(intent, serviceConnection, BIND_AUTO_CREATE);

        //解绑服务
        intent = new Intent(this, MyService.class);
        unbindService(serviceConnection);
  • 每个服务只会存在一个实例,不管调用了多少次StartService(),只需调用一次stopService()或stopSelf()方法,服务就会停下来了。
  • 生命周期,有两种方式可以启动服务:StartService()、bindService()
    1. StartService():(onCreate())— onStartCommand()— onDestory()
    2. bindService():(onCreate())— onBind()— onDestory()
    3. 根据Android系统的机制,一个服务只要被启动或者被绑定之后,就会一直处于运行状态,必须要让以上两种条件同事不满足。服务才能被销毁。所以:StartService()和bindService()都使用了就需要stopService()和unbindService()都调才会把服务真正停掉。

又来,又提供了工具

Android总是会提供一些傻瓜式工具,就像下面这个:IntentService类,一个怕你忘了停止服务而存在的会自动停止服务的服务类。在活动中启动了这个服务之后,他运行完会自己停止的。就是说只管启动,之后就不用管了。

public class MyIntentService extends IntentService {

    private String TAG = "MyIntentService";

    public MyIntentService() {
        //调用父类的有参构造函数
        super("MyIntentService");
    }

    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        //打印当前线程Id
        Log.i(TAG, "onHandleIntent: Thread id is " + Thread.currentThread().getId());
    }
}

启动

        //启动IntentService
        intent = new Intent(this, MyIntentService.class);
        startService(intent);

前台服务

有时候我们并不想启动执行完一段小功能就停掉了,例如下载任务,我们需要他一直存在,可能比较长的一段时间,为了保证不被回收,“前台服务”就是个不错的选择。
实现效果:一直有一个正在运行的图标在系统的状态栏显示,下拉状态栏后可以看到更加详细的信息,非常类似于通知的效果,写法也非常像。例如为了防止服务被回收掉可以用前台服务,像天气预报之类的功能也可以用前台服务。

这里写图片描述

启动就是上面的随便哪个启动方式都行,反正都要执行onCreate()方法的。这个就是写在onCreate()里的。
关闭的方式嘛:stopForeground(true);这是在Service里的写法。

猜你喜欢

转载自blog.csdn.net/liyuali2012/article/details/78428368
今日推荐