Andriod进阶之路 - Service(四大组件-服务、前台服务)的使用方式

本篇为大家带来的是Android的四大组件之一Service(服务)的使用方式,下面我将为大家带来已下的知识点讲解。

1.Android中Service的启动方式:

  • 我们可以通过startService开启服务,通过stopService关闭服务
  • 我们也可以通过bindService开启服务,通过unbindService关闭服务(这里是绑定与解绑的概念)
  • 此处注意点:对应的启动服务方式,需要对应的关闭服务方式关闭。同时如果我们同时使用了startService与bindService开启服务,那么也需要同时使用stopService与unbindService去关闭服务

2.Android中的服务分类:
大家都知道Service是我们Android中运行在后台的进程,经常用于音乐,视频等方向,其实他也拥有着自己的前台服务,其中用到的知识点就是Notification(通知),这些我们都会在代码中为大家讲解明白。

如果大家需要使用到前台服务,可以通过此网址学习一下Notification的使用:http://blog.csdn.net/qq_20451879/article/details/54564266

Code结构:
1.MainAcitivty、OurService、BookActivity(用于实现通知的点击处理,单纯布局,不用太关注这个类)Code
2.MainAcitivty、OurService Xml Code
3.使用Service的注意点

MainActivity

package com.example.service;

import android.os.Bundle;
import android.os.IBinder;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener {

	private TextView mBind;
	private TextView mUnBind;
	private TextView mStart;
	private TextView mStop;
	private ServiceConnection readConnection;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		// 处理
		init();
		// 活动与服务绑定的链接器
		readConnection = new ServiceConnection() {
			private OurSercice.ReadBinder read;

			// 解绑的时候调用
			@Override
			public void onServiceDisconnected(ComponentName name) {

			}

			// 绑定的时候调用
			@Override
			public void onServiceConnected(ComponentName name, IBinder service) {
				read = (OurSercice.ReadBinder) service;
				read.startRead();
				read.readProgress();
			}
		};
	}

	private void init() {
		mStart = (TextView) findViewById(R.id.tv_startService);
		mStop = (TextView) findViewById(R.id.tv_stopService);
		mBind = (TextView) findViewById(R.id.tv_bindService);
		mUnBind = (TextView) findViewById(R.id.tv_unbindService);

		mStart.setOnClickListener(this);
		mStop.setOnClickListener(this);
		mBind.setOnClickListener(this);
		mUnBind.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		// 开启服务
		case R.id.tv_startService:
			Intent Startintent = new Intent(this, OurSercice.class);
			startService(Startintent);
			break;
		// 关闭服务
		case R.id.tv_stopService:
			Intent Stopintent = new Intent(this, OurSercice.class);
			stopService(Stopintent);
			break;
		case R.id.tv_bindService:
			Intent Bindintent = new Intent(this, OurSercice.class);
			// 参数介绍: 第一个参数指的是我们开启服务的意图 第二个参数指的是
			// 我们开启服务之后所要执行的相关操作,这里我理解为如同我们使用startService操作服务的时候,把相关的逻辑写在StartCommand处一样,只不过这个好比我们自定义的一样,让他与活动更贴切
			// 第三个参数值得是绑定服务的运行时间,我们这里用的是服务创建的时候
			bindService(Bindintent, readConnection, BIND_AUTO_CREATE);
			break;
		// 解除绑定也意味着销毁服务,同stopService 一样
		case R.id.tv_unbindService:
			unbindService(readConnection);
			break;

		default:
			break;
		}
	}
}

OurService

package com.example.service;

import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

public class OurSercice extends Service {
	public OurSercice() {
		super();
	}

	// 如果我们只是简单的使用服务,我们可以对bindService直接抛出异常
	// @Override
	// public IBinder onBind(Intent intent) {
	// throw new UnsupportedOperationException("无绑定,抛出异常");
	// }

	// 但是服务的产生往往和活动更加贴近,所以我们经常会用到以下的操作方式
	// 1,写一个类继承自Binder
	class ReadBinder extends Binder {
		public ReadBinder() {
			super();
		}

		public void startRead() {
			Log.e("tag", "startRead");
		}

		public void readProgress() {
			Log.e("tag", "readProgress");
		}
	}

	// 2.创建实例
	ReadBinder mRead = new ReadBinder();

	// 3.绑定到服务之上,因为开启服务的方式有俩种,一种是startService 一种是 bindService
	@Override
	public IBinder onBind(Intent intent) {
		return mRead;
	}

	@Override
	public void onCreate() {
		super.onCreate();
		Log.e("tag", "onCreate");
		// 前台服务
		Intent Intent = new Intent(this, BookActivity.class);
		PendingIntent pendingIntent = PendingIntent.getActivity(
				OurSercice.this, 0, Intent, 0);
		Notification notification = new Notification.Builder(this)
				.setContentTitle("前台服务")
				.setContentText("通过服务操作,我们实现前台服务的操作")
				.setWhen(System.currentTimeMillis())
				.setSmallIcon(R.drawable.ic_launcher)
				.setLargeIcon(
						new BitmapFactory().decodeResource(getResources(),
								R.drawable.ic_launcher))
				.setContentIntent(pendingIntent)
				.setAutoCancel(true)
				.build();
		startForeground(1, notification);

	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		Log.e("tag", "onStartCommand");
		Toast.makeText(getApplicationContext(),
				"服务开启之后,逻辑操作在onStartCommand方法执行", 0).show();
		return super.onStartCommand(intent, flags, startId);
	}

	@Override
	public void onDestroy() {
		Log.e("tag", "onDestroy");
		super.onDestroy();
	}
}

MainActivity Xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/tv_startService"
        android:layout_width="match_parent"
        android:layout_height="35dp"
        android:gravity="center"
        android:text="start Service" />

    <TextView
        android:id="@+id/tv_stopService"
        android:layout_width="match_parent"
        android:layout_height="35dp"
        android:gravity="center"
        android:text="stop Service" />

    <TextView
        android:id="@+id/tv_bindService"
        android:layout_width="match_parent"
        android:layout_height="35dp"
        android:gravity="center"
        android:text="bind Service" />

    <TextView
        android:id="@+id/tv_unbindService"
        android:layout_width="match_parent"
        android:layout_height="35dp"
        android:gravity="center"
        android:text="unbind Service" />

LinearLayout>

BookActivity

package com.example.service;


import android.app.Activity;
import android.os.Bundle;

/**
 * 此Activity单纯为了响应通知,不用关注
 * */
public class BookActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_book);
	}
}

BookActivity Xml


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="书名:" />

        <TextView
            android:layout_width="wrap_content"
            android:id="@+id/book_name"
            android:layout_height="wrap_content"
            android:layout_gravity="center" />
    LinearLayout>
     <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="价格:" />

        <TextView
            android:layout_width="wrap_content"
            android:id="@+id/book_price"
            android:layout_height="wrap_content"
            android:layout_gravity="center" />
    LinearLayout>

LinearLayout>

注意点:
1.使用Service我们需要创建一个类继承自Service
2.使用前台服务要学会使用通知,同时他是写在Service的OnCreat生命周期中,主要我们一打开服务,就会显示通知服务
3.我们使用BindService的时候,我们往往回写一个类继承Binder,然后把需要些的方法写进去,之后创建实例传入BindService。在使用的Activity中我们会创建ServiceConnection实现绑定与解绑的相关逻辑操作,这时候记得向下转型

这篇文章目前讲解的就是大家所看到的知识,因为今天是除夕夜,且已过了临近初一的凌晨1点,所以下篇文章为大家带来常见的IntentServcie的产生和作用,因为我们不可能让服务一直运行,我们会让他完成任务后执行相关操作等,所以敬请大家转到下面的链接进行继续学习。

推荐文章:IntentSerivce的使用

你可能感兴趣的:(Android进阶之路,android,Service使用,前后台Service,服务的使用与注意)