Android的Service了解和两种启动方式

时间:2022-05-28 16:37:02

【声明】此文转载自:http://liangruijun.blog.51cto.com/3061169/647804/

——尊重作者,知识无价,交流无限!


一.Service的简介

1.Service介绍和作用 Service是Android系统中的四大组件之一,它是一种长生命周期的,没有可视化界面,运行于后台的一种服务程序。比如我们播放音乐的时候,有可能想边听音乐边干些其他事情,当退出播放音乐的应用,如果不用Service,我 们就听不到歌了,所以这时候就得用到Service了。   2.Service生命周期 Service的生命周期并不像Activity那么复杂,它只继承了onCreate(),onStart(),onDestroy()三个方法,当第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,这里需要注意的是,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法。   二.Service的启动方式 Service的有两种启动方式:Context.startService()和Context.bindService(),这两种方式对Service生命周期的影响是不同的。   1.Context.startService()方式启动 ①Context.startService()方式的生命周期: 
启动时,startService –> onCreate() –> onStart()
停止时,stopService –> onDestroy()
如果调用者直接退出而没有停止Service,则Service 会一直在后台运行   Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。   ②Context.startService()方式启动 Service的方法: MainActivity.java
package com.android.service.activity;  

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity
{
private Button startBtn;
private Button stopBtn;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
startBtn = (Button) findViewById(R.id.startBtn);
stopBtn = (Button) findViewById(R.id.stopBtn);
//添加监听器
startBtn.setOnClickListener(listener);
stopBtn.setOnClickListener(listener);
}

//启动监听器
private OnClickListener listener=new OnClickListener()
{
@Override
public void onClick(View v)
{
Intent intent=new Intent(MainActivity.this, ServiceDemo.class);
switch (v.getId())
{
case R.id.startBtn:
startService(intent);
break;
case R.id.stopBtn:
stopService(intent);
break;
default:
break;
}
}
};
}


ServiceDemo.java

package com.android.service.activity;  

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

public class ServiceDemo extends Service
{
private static final String TAG="Test";

@Override
//Service时被调用
public void onCreate()
{
Log.i(TAG, "Service onCreate--->");
super.onCreate();
}

@Override
//当调用者使用startService()方法启动Service时,该方法被调用
public void onStart(Intent intent, int startId)
{
Log.i(TAG, "Service onStart--->");
super.onStart(intent, startId);
}

@Override
//当Service不在使用时调用
public void onDestroy()
{
Log.i(TAG, "Service onDestroy--->");
super.onDestroy();
}

@Override
//当使用startService()方法启动Service时,方法体内只需写return null
public IBinder onBind(Intent intent)
{
return null;
}
}


AndroidManifest.xml文件中记得注册服务

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.service.activity"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="10" />

<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".ServiceDemo" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</service>
</application>
</manifest>


2.Context.bindService()方式启动:   Context.bindService()方式的生命周期: 
绑定时,bindService -> onCreate() –> onBind()
调用者退出了,即解绑定时,Srevice就会unbindService –>onUnbind() –> onDestory()   用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法。   ②Context.bindService()方式启动 Service的方法: 绑定Service需要三个参数:bindService(intent, conn, Service.BIND_AUTO_CREATE); 第一个:Intent对象 第二个:ServiceConnection对象,创建该对象要实现它的onServiceConnected()和 onServiceDisconnected()来判断连接成功或者是断开连接 第三个:如何创建Service,一般指定绑定的时候自动创建
MainActivity.java

package com.android.bindservice.activity;  

import android.app.Activity;
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.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {
// 声明Button
private Button startBtn,stopBtn,bindBtn,unbindBtn;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置当前布局视图
setContentView(R.layout.main);
// 实例化Button
startBtn = (Button)findViewById(R.id.startBtn1);
stopBtn = (Button)findViewById(R.id.stopBtn2);
bindBtn = (Button)findViewById(R.id.bindBtn3);
unbindBtn = (Button)findViewById(R.id.unbindBtn4);

// 添加监听器
startBtn.setOnClickListener(startListener);
stopBtn.setOnClickListener(stopListener);
bindBtn.setOnClickListener(bindListener);
unbindBtn.setOnClickListener(unBindListener);

}
// 启动Service监听器
private OnClickListener startListener = new OnClickListener() {
@Override
public void onClick(View v) {
// 创建Intent
Intent intent = new Intent();
// 设置Class属性
intent.setClass(MainActivity.this, BindService.class);
// 启动该Service
startService(intent);
}
};

// 停止Service监听器
private OnClickListener stopListener = new OnClickListener() {
@Override
public void onClick(View v) {
// 创建Intent
Intent intent = new Intent();
// 设置Class属性
intent.setClass(MainActivity.this, BindService.class);
// 启动该Service
stopService(intent);
}
};

// 连接对象
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i("Service", "连接成功!");
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.i("Service", "断开连接!");
}
};

// 綁定Service监听器
private OnClickListener bindListener = new OnClickListener() {
@Override
public void onClick(View v) {
// 创建Intent
Intent intent = new Intent();
// 设置Class属性
intent.setClass(MainActivity.this, BindService.class);

// 绑定Service
bindService(intent, conn, Service.BIND_AUTO_CREATE);
}
};

// 解除绑定Service监听器
private OnClickListener unBindListener = new OnClickListener() {
@Override
public void onClick(View v) {
// 创建Intent
Intent intent = new Intent();
// 设置Class属性
intent.setClass(MainActivity.this, BindService.class);
// 解除绑定Service
unbindService(conn);
}
};
}

BindService.java

package com.android.bindservice.activity;  

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

public class BindService extends Service{

private static final String TAG="Test";

//返回null
public IBinder onBind(Intent intent) {
Log.i(TAG, "Service onBind--->");
return null;
}
// Service创建时调用
public void onCreate() {
Log.i(TAG, "Service onCreate--->");
}
// 当客户端调用startService()方法启动Service时,该方法被调用
public void onStart(Intent intent, int startId) {
Log.i(TAG, "Service onStart--->");
}
// 当Service不再使用时调用
public void onDestroy() {
Log.i(TAG, "Service onDestroy--->");
}
// 当解除绑定时调用
public boolean onUnbind(Intent intent) {
Log.i(TAG, "Service onUnbind--->");
return super.onUnbind(intent);
}
}

提醒:记得清单文件进行注册

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆转载请注明出处☞指尖飞落的博客☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆