原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/Android/2019/0820/608.html
		Service与Thread线程的差别
	
		其实他们两者并无太大的关系,但是有良多身边的人时常把这两个殽杂了!Thread是线程,程序实行的非常小单元,分派CPU的基本单元!而Service则是Android供应一个容许长光阴留驻背景的一个组件,非常多见的用法即是做轮询操纵!大概想在游戏开发运营背景做少许工作,好比背景下载更新!记得别把这两个观点殽杂!
	
		Service的性命周期图
	
		(下图借于code_pig大神,总结的很好,大家一块进修!)
	
		Service服无的相关要领介绍:
	
		1、onCreate():当Service第一次被建立后登时挪用该要领,该要领在Service的性命周期里只被挪用一次!
	
		2、onDestory():当Service被封闭时挪用该要领,该要领只被挪用一次!
	
		3、onStartCo毫米and():当Service被挪用时,挪用该要领。该要领可被重复挪用,并且不会建立新的Service工具,而是复用前方产生的Service工具。
	
		4、onBind():这是Service必须实现的要领,该要领会回笼一个IBinder工具,APP通过该工具与Service组件举行通讯。
	
		5、onUnBind():当该Service绑定的全部客户端都断开时挪用该要领。
	
		Android中应用Service的方式有两种:
	
		1)StartService()启动Service
	
		2)BindService()启动Service
	
		PS:另有一种,即是启动Service后,绑定Service!
	
		常州手游开发效果图以下:
	
		第一种:要紧代码以下:
	
		TestServiceOne.java
	
		package com.deepreality.servicedemo;
	
		import android.app.Service;
	
		import android.content.Intent;
	
		import android.os.IBinder;
	
		import android.support.annotation.Nullable;
	
		import android.util.Log;
	
		//Android的四大组件,只有定义了,就必须去AndroidManifest.xml中注册一下!!!
	
		public class TestServiceOne extends Service {
	
		private final String TAG = "TestServiceOne";
	
		//必须实现的要领
	
		@Nullable
	
		@Override
	
		public IBinder onBind(Intent intent) {
	
		Log.e(TAG, "onBind要领被挪用");
	
		return null;
	
		}
	
		//Service被建立时挪用
	
		@Override
	
		public void onCreate() {
	
		Log.e(TAG, "onCreate要领被挪用");
	
		super.onCreate();
	
		}
	
		//Service被启动时挪用
	
		@Override
	
		public int onStartCo毫米and(Intent intent, int flags, int startId) {
	
		Log.e(TAG, "onStartCo毫米and要领被挪用");
	
		return super.onStartCo毫米and(intent, flags, startId);
	
		}
	
		//Service被销毁时挪用
	
		@Override
	
		public void onDestroy() {
	
		Log.e(TAG, "onDestroy要领被挪用");
	
		super.onDestroy();
	
		}
	
		}
	
		MainActivity.java的代码以下:
	
		package com.deepreality.servicedemo;
	
		import android.content.Intent;
	
		import android.support.v7.app.AppCompatActivity;
	
		import android.os.Bundle;
	
		import android.view.View;
	
		import android.widget.Button;
	
		//考证StartService启动Service的挪用挨次
	
		public class MainActivity extends AppCompatActivity implements View.OnClickListener {
	
		private Button btnServiceStart, btnServiceStop;
	
		private Intent intent;
	
		@Override
	
		protected void onCreate(Bundle savedInstanceState) {
	
		super.onCreate(savedInstanceState);
	
		setContentView(R.layout.activity_main);
	
		btnServiceStart = findViewById(R.id.main_btnServiceStart);
	
		btnServiceStop = findViewById(R.id.main_btnServiceStop);
	
		btnServiceStart.setOnClickListener(this);
	
		btnServiceStop.setOnClickListener(this);
	
		intent = new Intent();
	
		intent.setAction("com.deepreality.servicedemo.service.TEST_SERVICE_ONE");
	
		//Android 5.0以后,常州游戏开发培训隐式挪用是除了设置setAction()外,还必要设置setPackage();
	
		intent.setPackage("com.deepreality.servicedemo");
	
		}
	
		@Override
	
		public void onClick(View v) {
	
		switch (v.getId()) {
	
		case R.id.main_btnServiceStart:{
	
		startService(intent);
	
		break;
	
		}
	
		case R.id.main_btnServiceStop:{
	
		stopService(intent);
	
		break;
	
		}
	
		default:break;
	
		}
	
		}
	
		}
	
		第二种:
	
		TestServiceTwo.java的要紧代码以下:
	
		package com.deepreality.servicedemo;
	
		import android.app.Service;
	
		import android.content.Intent;
	
		import android.os.Binder;
	
		import android.os.IBinder;
	
		import android.support.annotation.Nullable;
	
		import android.util.Log;
	
		public class TestServiceTwo extends Service {
	
		private final String TAG = "TestServiceTwo";
	
		private int count = 0;
	
		private boolean quit = false;
	
		private MyBinder myBinder = new MyBinder();
	
		//定义onBinder要领所回笼的工具
	
		public class MyBinder extends Binder {
	
		public int getCount() {
	
		return count;
	
		}
	
		}
	
		//必须实现的要领
	
		@Nullable
	
		@Override
	
		public IBinder onBind(Intent intent) {
	
		Log.e(TAG, "onBind要领被挪用");
	
		return myBinder;
	
		}
	
		//Service被建立时挪用
	
		@Override
	
		public void onCreate() {
	
		Log.e(TAG, "onCreate要领被挪用");
	
		super.onCreate();
	
		new Thread(new Runnable() {
	
		@Override
	
		public void run() {
	
		while (!quit) {
	
		try {
	
		Thread.sleep(1000);
	
		} catch (InterruptedException e) {
	
		e.printStackTrace();
	
		}
	
		count ++;
	
		}
	
		}
	
		}).start();
	
		}
	
		//Service断开持续时回调
	
		@Override
	
		public boolean onUnbind(Intent intent) {
	
		Log.e(TAG, "onUnbind要领被挪用!");
	
		return true;
	
		}
	
		//Service被销毁时挪用
	
		@Override
	
		public void onDestroy() {
	
		super.onDestroy();
	
		Log.e(TAG, "onDestroy要领被挪用");
	
		this.quit = true;
	
		}
	
		@Override
	
		public void onRebind(Intent intent) {
	
		super.onRebind(intent);
	
		Log.e(TAG, "onRebind要领被挪用!");
	
		}
	
		}
	
		MainActivityTwo.java的代码以下:
	
		package com.deepreality.servicedemo;
	
		import android.app.Service;
	
		import android.content.ComponentName;
	
		import android.content.Intent;
	
		import android.content.ServiceConnection;
	
		import android.os.Bundle;
	
		import android.os.IBinder;
	
		import android.support.annotation.Nullable;
	
		import android.support.v7.app.AppCompatActivity;
	
		import android.util.Log;
	
		import android.view.View;
	
		import android.widget.Button;
	
		import android.widget.Toast;
	
		//考证手机App外包BindService启动Service的挨次
	
		public class MainActivityTwo extends AppCompatActivity implements View.OnClickListener {
	
		private Button btnServiceStart, btnServiceStop, btnServiceStatus;
	
		private Intent intent;
	
		//连结所启动的Service的IBinder工具,同时定义一个ServiceConnection工具
	
		TestServiceTwo.MyBinder myBinder;
	
		private ServiceConnection serviceConnection = new ServiceConnection() {
	
		//Activity与Service持续胜利时回调该要领
	
		@Override
	
		public void onServiceConnected(ComponentName name, IBinder service) {
	
		Log.e("Service Connected", "success!");
	
		myBinder = (TestServiceTwo.MyBinder) service;
	
		}
	
		//Activity与Service断开持续时回调该要领
	
		@Override
	
		public void onServiceDisconnected(ComponentName name) {
	
		Log.e("Service Disconnected", "error!");
	
		}
	
		};
	
		@Override
	
		protected void onCreate(@Nullable Bundle savedInstanceState) {
	
		super.onCreate(savedInstanceState);
	
		setContentView(R.layout.activity_main);
	
		btnServiceStart = findViewById(R.id.main_btnServiceStart);
	
		btnServiceStop = findViewById(R.id.main_btnServiceStop);
	
		btnServiceStatus = findViewById(R.id.main_btnServiceStatus);
	
		btnServiceStart.setOnClickListener(this);
	
		btnServiceStop.setOnClickListener(this);
	
		btnServiceStatus.setOnClickListener(this);
	
		intent = new Intent();
	
		intent.setAction("com.deepreality.servicedemo.service.TEST_SERVICE_TWO");
	
		//Android 5.0以后,隐式挪用是除了设置setAction()外,还必要设置setPackage();
	
		intent.setPackage("com.deepreality.servicedemo");
	
		}
	
		@Override
	
		protected void onDestroy() {
	
		super.onDestroy();
	
		}
	
		@Override
	
		public void onClick(View v) {
	
		switch (v.getId()) {
	
		case R.id.main_btnServiceStart:{
	
		//绑定service
	
		bindService(intent, serviceConnection, Service.BIND_AUTO_CREATE);
	
		break;
	
		}
	
		case R.id.main_btnServiceStop:{
	
		//解除绑定
	
		unbindService(serviceConnection);
	
		break;
	
		}
	
		case R.id.main_btnServiceStatus:{
	
		int count = myBinder.getCount();
	
		Toast.makeText(MainActivityTwo.this, "Service的count值:" + count, Toast.LENGTH_SHORT).show();
	
		break;
	
		}
	
		default:break;
	
		}
	
		}
	
		}
	
		留意事变:在OnBind()要领中需回笼一个IBinder实例,否则onServiceConnected要领不会挪用!!!
	
		AndroidManifest.xml的代码以下:
	
		<?xml version="1.0" encoding="utf-8"?>
	
		<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	
		package="com.deepreality.servicedemo">
	
		<application
	
		android:allowBackup="true"
	
		android:icon="@mipmap/ic_launcher"
	
		android:label="@string/app_name"
	
		android:roundIcon="@mipmap/ic_launcher_round"
	
		android:supportsRtl="true"
	
		android:theme="@style/AppTheme">
	
		<activity android:name=".MainActivity">
	
		</activity>
	
		<activity android:name=".MainActivityTwo">
	
		<intent-filter>
	
		<action android:name="android.intent.action.MAIN" />
	
		<category android:name="android.intent.category.LAUNCHER" />
	
		</intent-filter>
	
		</activity>
	
		<!-- 配置Service组件,同时配置一个action -->
	
		<service android:name=".TestServiceOne">
	
		<intent-filter>
	
		<action android:name="com.deepreality.servicedemo.service.TEST_SERVICE_ONE"/>
	
		</intent-filter>
	
		</service>
	
		<!-- 配置Service组件,同时配置一个action -->
	
		<service
	
		android:name=".TestServiceTwo"
	
		android:exported="false">
	
		<intent-filter>
	
		<action android:name="com.deepreality.servicedemo.service.TEST_SERVICE_TWO"/>
	
		</intent-filter>
	
		</service>
	
		</application>
	
		</manifest>
	上篇:上一篇:在Android中Activity界面跳转
下篇:下一篇:Android Actionbar回到上一级

