• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

Android

Android开发中服务Service的基本使用

原创内容,转载请注明原文网址: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回到上一级