Android四组件之Service&Demo

*Service概述*
一、Service(服务)是一个没有用户界面的在后台运行执行耗时操作的应用组件。其他应用组件能够启动Service,并且当用户切换到另外的应用场景,Service将持续在后台运行。另外,一个组件能够绑定到一个service与之交互(IPC机制),例如,一个service可能会处理网络操作,播放音乐,操作文件I/O或者与内容提供者(content provider)交互,所有这些活动都是在后台进行。
Service有两种状态,“启动的”和“绑定”

二、由于手机屏幕的限制,通常情况下在同一时刻仅有一个应用程序处于激活状态,并能够显示在手机屏幕上,因此,应用程序需要一种机制,在没有用户界面的情况下,能够长时间在后台运行,实现应用程序的特定功能,并能够处理事件或更新数据.Android系统提供了(Service)服务组件,它不直接与用户进行交互,却能够长期在后台运行。有很多情况需要使用Service,典型的例子就是:MP3播放器。

三、Service非常适用于无需用户干预,且需要长期运行的后台功能。Service没有用户界面,有利于降低系统资源。而且Service比Activity具有更高的优先级,只有在系统资源极度匮乏的情况下,android系统才可能清理掉一部分service来保证系统的运行,而这种情况却又轻易不会出现。即使Service被系统终止了,在系统资源恢复后Service也将自动恢复运行状态,因此可以认为Service是在系统中永久运行的组件。Service除了实现后台服务功能,还可以用于进程间通信,解决两个不同Activity应用程序进程之间的调用和通信问题。
四、Service的生命周期如下图所示:

这里写图片描述

context.startService() ->onCreate()- >onStartCommand()->Service running–调用context.stopService()->onDestroy()
context.bindService()->onCreate()->onBind()->Service running–调用>onUnbind() -> onDestroy()
从上诉可以知道分别对应本地的,以及远程的,也对应不同的方式启动这个服务。
五、下面我们用简单地例子来讲解一下
如何启动Service(典型的例子就是:MP3播放器。)
界面:
这里写图片描述
xml文件的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    style="@style/Widget.AppCompat.Button.Borderless"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context=".MainActivity"
    tools:showIn="@layout/activity_main">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="48dp"
            android:layout_gravity="center_horizontal"
            android:gravity="center_horizontal|center_vertical"
            android:text="@string/hello"
            android:textColor="@color/colorYellow"
            android:textSize="20dp"
            />

        <Button
            android:id="@+id/start"
            android:layout_width="wrap_content"
            android:layout_height="48dp"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="30dp"
            android:background="@drawable/btn_selector"
            android:gravity="center_vertical"
            android:padding="8dp"
            android:text="startService"
            android:textColor="@android:color/background_dark"
            android:textSize="12dp"/>

        <Button
            android:id="@+id/stop"
            android:layout_width="wrap_content"
            android:layout_height="48dp"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="20dp"
            android:background="@drawable/btn_selector"
            android:gravity="center_vertical"
            android:padding="8dp"
            android:text="stopService"
            android:textColor="@android:color/background_dark"
            android:textSize="12dp"/>

        <Button
            android:id="@+id/bind"
            android:layout_width="wrap_content"
            android:layout_height="48dp"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="20dp"
            android:background="@drawable/btn_selector"
            android:gravity="center_vertical"
            android:padding="8dp"
            android:text="bindService"
            android:textColor="@android:color/background_dark"
            android:textSize="12dp"/>

        <Button
            android:id="@+id/unbind"
            android:layout_width="wrap_content"
            android:layout_height="48dp"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="20dp"
            android:background="@drawable/btn_selector"
            android:gravity="center_vertical"
            android:padding="8dp"
            android:text="unBindService"
            android:textColor="@android:color/background_dark"
            android:textSize="12dp"/>


    </LinearLayout>
</RelativeLayout>

Activity代码如下:
//PS : 哈哈 我加了一个反馈功能,有什么意见可以给我发邮件哈!

package com.one.neo.servicedemo;

import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

/**
 * @author YuQi on 2015/11/10 16:24
 * @function MainActivity
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        initView();

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Love U !XS", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
                sendMail();
            }
        });
    }

    private void sendMail() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                 TODO: 2015/11/10 硬编码
                Intent email = new Intent(Intent.ACTION_SEND);
                email.setType("plain/text");
                String[] emailReciver = new String[]{"yu163qi@163.com"};

                String emailTitle = "关于[ServiceDemo]的反馈";
                String emailContent = "欢迎吐槽&拍砖!";
                email.putExtra(Intent.EXTRA_EMAIL, emailReciver);
                email.putExtra(Intent.EXTRA_SUBJECT, emailTitle);
                email.putExtra(Intent.EXTRA_TEXT, emailContent);
                startActivity(Intent.createChooser(email, "请选择您的邮件客户端"));
            }
        }).start();
    }

    private void initView() {
        findViewById(R.id.start).setOnClickListener(this);
        findViewById(R.id.stop).setOnClickListener(this);
        findViewById(R.id.bind).setOnClickListener(this);
        findViewById(R.id.unbind).setOnClickListener(this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    // new ServiceConnection
    final ServiceConnection connection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {

        }

        public void onServiceDisconnected(ComponentName name) {
            // TODO Auto-generated method stub
        }
    };

    public void onClick(View v) {
        Intent intent = new Intent(MainActivity.this, PlayService.class);
        switch (v.getId()) {
            // startService()方法开启服务
            case R.id.start:
                startService(intent);
                break;

            // stopService()方法停止服务
            case R.id.stop:
                stopService(intent);
                break;

            // bindService()方法开启服务
            case R.id.bind:
                bindService(intent, connection, BIND_AUTO_CREATE);
                break;

            // unbindService()方法停止服务
            case R.id.unbind:
                unbindService(connection);
                break;
            default:
                break;
        }

    }
}

Activity的开头部分详细介绍了startService以及bindService用法的区别,这里不再累述。

接下来是Service的代码:

package com.one.neo.servicedemo;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;

/**
 * @author YuQi on 2015/11/10 16:24
 * @function Background PlayService
 */
public class PlayService extends Service {

    private MediaPlayer player;

    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        Log.d("music play", "Service onCreat()执行成功");
        player = MediaPlayer.create(this, R.raw.test);
        // setLooping(boolean);方法,接受的是boolean值
        // true 表示循环播放
        // false 表示不循环播放
        // 默认值为false,即不循环播放
        player.setLooping(false);
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        // MediaPlayer对象的start()方法
        player.start();
        Log.d("music play", "Start ");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        // MediaPlayer对象的stop()方法
        player.stop();
        Log.v("music play", "Stop");
        super.onDestroy();
    }

    @Override
    public boolean onUnbind(Intent intent) {
        // MediaPlayer对象的stop()方法
        Log.d("music play", "onUnbind");
        return super.onUnbind(intent);
    }

    @Override
    public IBinder onBind(Intent intent) {
        // MediaPlayer对象的start()方法
        player.start();
        Log.d("music play", "onBind");
        return null;
    }
}

下面干货来了!就是源码下载,哈哈~

ServiceDemo下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值