Android 四大组件 (二) Service 使用

一. Service 介绍

Service属于android四大组件之一,在很多地方经常被用到。开启Service有两种不同的方式:startService和bindService。不同的开启方式,Service执行的生命周期方法也不同。

分 显示/隐示调用 ,但是官网推荐用显式的方式启动Service。下面 service使用 用的就是显示调用;注意事项用的就是隐示调用,在5.0系统上隐示调用会报错。所以这里只介绍使用显示调用。

不能再service里做耗时操作,否则ANR;需要开辟子线程进行耗时操作处理。

二.Service 使用

1.startService使用。

Intent intent = new Intent(this, TestService.class);
Log.w(Tag, "activity====启动服务");
startService(intent);

执行效果:

Log.w(Tag, "activity====停止服务");
stopService(intent);

执行效果:  

2.bindService绑定.

private class MyConnection implements ServiceConnection {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //只有当我们自己写的MyService的onBind方法返回值不为null时,才会被调用
            Log.e("call", "onServiceConnected");
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            // 这个方法只有出现异常时才会调用,服务器正常退出不会调用。
            Log.e("call", "onServiceDisconnected");
        }
    }
Log.w(Tag, "activity====绑定服务");
MyConnection conn = new MyConnection();
//第一个参数:Intent意图
// 第二个参数:是一个接口,通过这个接口接收服务开启或者停止的消息,并且这个参数不能为null
 // 第三个参数:开启服务时的操作,BIND_AUTO_CREATE代表自动创建service bindService(service, conn, BIND_AUTO_CREATE);
 bindService(intent, conn, BIND_AUTO_CREATE);

  执行效果:

Log.w(Tag, "activity====解绑服务");
unbindService(conn);

  执行效果:

 

3.区别:

 以下摘自网络,后续验证

服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都可以启动Service,但是它们的使用场合有所不同。
 
 使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。
 
如果打算采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。
 
如果打算采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法。

三.Service 注意事项:

在5.0系统上使用如下方式start或者bind启动service时候:

Intent intent = new Intent();  
intent.setAction("com.example.user.firstapp.FIRST_SERVICE");  
bindService(intent,coon,Service.BIND_AUTO_CREATE);  

startService(intent);

  

android 5.0上,报错:IllegalArgumentException: Service Intent must be explicit

原因是:Android5.0中service的intent一定要显性声明!!!

四.附上核心activity代码:

package com.example.hp.testapp;

import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

import com.example.hp.testapp.service.TestService;

import org.w3c.dom.Text;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private String Tag = "TestServiceTag";

    private TextView tv_btn_start;
    private TextView tv_btn_stop;
    private TextView tv_btn_bind;
    private TextView tv_btn_unbind;

    Intent intent;
    MyConnection conn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intent = new Intent(this, TestService.class);
        conn = new MyConnection();
        initView();
        initListener();
    }

    private void initView() {
        tv_btn_start = (TextView) findViewById(R.id.tv_btn_start);
        tv_btn_stop = (TextView) findViewById(R.id.tv_btn_stop);
        tv_btn_bind = (TextView) findViewById(R.id.tv_btn_bind);
        tv_btn_unbind = (TextView) findViewById(R.id.tv_btn_unbind);
    }

    private void initListener() {
        tv_btn_start.setOnClickListener(this);
        tv_btn_stop.setOnClickListener(this);
        tv_btn_bind.setOnClickListener(this);
        tv_btn_unbind.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.tv_btn_start:
                /**
                 * 启动服务
                 */
                Log.w(Tag, "activity====启动服务");
                startService(intent);
                break;
            case R.id.tv_btn_stop:
                /**
                 * 停止服务
                 */
                Log.w(Tag, "activity====停止服务");
                stopService(intent);
                break;
            case R.id.tv_btn_bind:
                /**
                 * 绑定服务
                 */
                Log.w(Tag, "activity====绑定服务");
                //第一个参数:Intent意图
                // 第二个参数:是一个接口,通过这个接口接收服务开启或者停止的消息,并且这个参数不能为null
                // 第三个参数:开启服务时的操作,BIND_AUTO_CREATE代表自动创建service bindService(service, conn, BIND_AUTO_CREATE);
                bindService(intent, conn, BIND_AUTO_CREATE);
                break;
            case R.id.tv_btn_unbind:
                /**
                 * 解绑服务
                 */
                Log.w(Tag, "activity====解绑服务");
                if (conn != null) {
                    unbindService(conn);
                }
            default:
                break;
        }
    }

    @Override
    protected void onStart() {
        Log.w(Tag, "activity====onStart");
        super.onStart();
    }

    @Override
    protected void onRestart() {
        Log.w(Tag, "activity====onRestart");
        super.onRestart();
    }

    @Override
    public void onStateNotSaved() {
        Log.w(Tag, "activity====onStateNotSaved");
        super.onStateNotSaved();
    }

    @Override
    protected void onResume() {
        Log.w(Tag, "activity====onResume");
        super.onResume();
    }

    @Override
    protected void onPause() {
        Log.w(Tag, "activity====onPause");
        super.onPause();
    }

    @Override
    protected void onStop() {
        Log.w(Tag, "activity====onStop");
        super.onStop();
    }

    @Override
    protected void onDestroy() {
        Log.w(Tag, "activity====onDestroy");
        super.onDestroy();
    }

    private class MyConnection implements ServiceConnection {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //只有当我们自己写的MyService的onBind方法返回值不为null时,才会被调用
            Log.e("call", "onServiceConnected");
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            // 这个方法只有出现异常时才会调用,服务器正常退出不会调用。
            Log.e("call", "onServiceDisconnected");
        }
    }

}

  

原文地址:https://www.cnblogs.com/bugzone/p/android_service.html

时间: 2024-10-22 22:41:15

Android 四大组件 (二) Service 使用的相关文章

深入剖析Android四大组件(二)——Service服务之启动与绑定

如果说Activity通常都会提供一个用户界面UI的话,那么服务则不会提供任何用户界面,尽管如此,服务的作用仍然非常重要,它为我们提供了一种类似守护线程的手段来维持一些希望在退出以后仍然能持续运行的程序. 1.服务 既然服务的作用如此重要,本篇主要讲解如何使用服务和声明应用程序服务,下一节讲解怎么高效率的运用服务. ①何为服务 服务是一个应用程序组件,它在后台执行运行时间比较长的操作,不提供用户界面.它可以被其他应用程序组件启动或停止,并且当用户切换到另一个应用程序时,它仍然在后台持续的运行.另

【Android的从零单排开发日记】之入门篇(五)——Android四大组件之Service

这几天忙着驾校考试,连电脑都碰不到了,今天总算告一段落了~~Service作为Android的服务组件,默默地在后台为整个程序服务,辅助应用与系统中的其他组件或系统服务进行沟通.它跟Activity的级别差不多,但不能自己运行只能后台运行.service可以在很多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等, 总之服务总是藏在后台的. ps:Service运行在主线程中的,所

Android 四大组件之Service详解

                   Android四大组件之Service详解    来这实习已经10多天了,今天整理整理学习时的Android笔记.正所谓好记性不如烂笔头,今天来说说service组件. service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务嘛,总是藏在后头的. Service是在一段不定的时间运行在后台,不和用户交互应用组件.每个

Android四大组件之一Service介绍-android学习之旅(十二)

基本概念: service是android四大组件之一,运行在后台执行耗时操作,并不提供用户界面.其他组件如acticity可以通过startService启动该组件,也可以通过bindService启动并把绑定该组件进行通信. 使用场景 后台下载文件,以及播放音乐等 注意 service运行在主线程中,他不会创建属于自己的线程,也不是运行在独立的线程中,所以在使用的时候,需要自己创建线程,而不应该直接使用,这样会造成ANR错误. service的两种形式 started service 其他组

Android 四大组件之Service(上)

1.Service简介 Service是Android四大组件中最与Activity相似的组件,他们都代表可执行的程序.Service一直运行于后台,不会与用户交互,可用来处理一些耗时的任务(比如:后台播放音乐,I/O操作等).它的创建.配置与Activity基本相似,下面将详细介绍Android Service的开发. 2.创建.配置Service 2.1 定义一个继承Service类的子类 2.2 在AndroidManifest.xml中配置该Service 需要注意的是 Service和

Android 四大组件之service与Broadcast

Android 四大组件之一:service: Service有五个生命周期:onCreat,onStartCommand, onBind,onUnbind, onDestroy 主要有绑定和非绑定两种方式 首相在Activity中设置四个Button,用于测试绑定和非绑定两种方式,按下Button播放音乐,停止音乐,非绑定用StopService停止,绑定方式用Bind Service启动,解绑用unbindService停止. 非绑定:Intent intent=new Intent(Mai

Android成长日记-Android四大组件之Service组件的学习

1.什么是Service? Service是Android四大组件中与Activity最相似的组件,它们都代表可执行的程序,Service与Activity的区别在于:Service一直在后台运行,它没有用户界面,所以绝不会到前台来.一旦Service被启动起来,它就与Activity一样.它完全具有自己的生命周期. A Service is an application component that can perform long-running operations in the back

Android四大组件之~~Service

声明:转载请注明出处:http://blog.csdn.net/hello_chillax 开题:对android稍微有些了解的朋友都知道,android中有四大组件,分别是:Activity,Service,ContentProvider,BroadcastReceiver.今天来介绍其一:Service. 一.Service和Thread有什么区别和联系,以及使用Service的必要性. 服务: 长期后台运行的没有界面的组件 android应用:什么地方需要用到服务? 天气预报:后台的连接服

android四大组件之service生命周期

和activity一样,service服务同为android的四大组件之一.而和activity不同的是,service并不会显示出来,也就是没有用户界面,它是后台运行的,但需要activity或其它context来触发. 简单的一个例子是android手机里的音乐播放器,打开应用看得到的界面是activity,点击播放音乐启动的音乐服务则是service(听得到但看不到.例如舞台上的幕后服务者,为大家操作着音响和灯光,却从不亮相).而且就算退出了音乐播放器,却依然能够在桌面或其它应用里面听得到