[size=small][color=olive][b]使用Service 进行后台服务
1、Service 简介:
Service是Android系统中的四大组件之一,它是一种长生命周期的,没有可
视化界面,运行与后台的一种服务程序;
What is Service?
Service就是系统中的服务:
特点:
* 无法与用户直接进行交互;
* 必须由用户或者其他程序显示的来启动,优先级比较高;
* 比处于前台的应用优先级低,但是比后台的其他应用程序优先级高;
When?
当需要某些程序在后台运行的时候就使用Service;当Activity的生命周期结束的时候,
Service还是存在的;
2、Service的分类:本地service 和 远程service;
本地service:就是和当前的应用在同一个进程的service,彼此之间有共同的内存区域,
所以对于某些数据的共享特别的方便和简单;
远程service:主要牵扯到不同进程间的service访问。因为android的系统安全的原因导致
了我们在不同的进程间无法使用一般的方式共享数据。因此:android为我们提供了一个AIDL
(android interface description language)接口描述语言;
3、Service生命周期:
service的生命周期相比于Activity比较简单:
onCreate() ---> onStart() ---> onDestroy() 这三个方法;
注:在一次生命周期中,服务只能被创建一次,销毁一次,但是可以启动多次;
在Activity中与service有关的方法为:
情况一:
startService(Intent intent); 启动一个service
stopService(Intent intent); 停止一个service
情况二:当想使用service中的一些数据的或者访问其中的一些方法时:
bindService(Intent intent,ServiceConnection conn,int flags);
unbindService(ServiceConnection conn);
参数说明:
参1:跳转到service的intent;
参2:conn 代表一个与service连接状态的类,当连接service成功或失败
时会主动触发其(ServiceConnection)内部的onServiceConnected()或者
onServiceDisconnected()方法,如果想要访问service的数据,那么可以
在onServiceConnected()方法中进行;
小贴士:
使用服务绑定,当acitivity生命周期结束后service的生命周期也跟着结束,
他们的关系时同存亡的;
4、service的使用步骤:
①:创建一个类继承service这个类;
②:每一个组件都要在androidManifest.xml中进行注册;
③:在Activiy中进行启动、绑定、解绑、或者精致service;
案例:实现音乐后台播放;[/b][/color][/size]
Activity代码部分:
service代码部分:
package com.example.service;
service与activity进行数据交互:
1、Service 简介:
Service是Android系统中的四大组件之一,它是一种长生命周期的,没有可
视化界面,运行与后台的一种服务程序;
What is Service?
Service就是系统中的服务:
特点:
* 无法与用户直接进行交互;
* 必须由用户或者其他程序显示的来启动,优先级比较高;
* 比处于前台的应用优先级低,但是比后台的其他应用程序优先级高;
When?
当需要某些程序在后台运行的时候就使用Service;当Activity的生命周期结束的时候,
Service还是存在的;
2、Service的分类:本地service 和 远程service;
本地service:就是和当前的应用在同一个进程的service,彼此之间有共同的内存区域,
所以对于某些数据的共享特别的方便和简单;
远程service:主要牵扯到不同进程间的service访问。因为android的系统安全的原因导致
了我们在不同的进程间无法使用一般的方式共享数据。因此:android为我们提供了一个AIDL
(android interface description language)接口描述语言;
3、Service生命周期:
service的生命周期相比于Activity比较简单:
onCreate() ---> onStart() ---> onDestroy() 这三个方法;
注:在一次生命周期中,服务只能被创建一次,销毁一次,但是可以启动多次;
在Activity中与service有关的方法为:
情况一:
startService(Intent intent); 启动一个service
stopService(Intent intent); 停止一个service
情况二:当想使用service中的一些数据的或者访问其中的一些方法时:
bindService(Intent intent,ServiceConnection conn,int flags);
unbindService(ServiceConnection conn);
参数说明:
参1:跳转到service的intent;
参2:conn 代表一个与service连接状态的类,当连接service成功或失败
时会主动触发其(ServiceConnection)内部的onServiceConnected()或者
onServiceDisconnected()方法,如果想要访问service的数据,那么可以
在onServiceConnected()方法中进行;
小贴士:
使用服务绑定,当acitivity生命周期结束后service的生命周期也跟着结束,
他们的关系时同存亡的;
4、service的使用步骤:
①:创建一个类继承service这个类;
②:每一个组件都要在androidManifest.xml中进行注册;
③:在Activiy中进行启动、绑定、解绑、或者精致service;
案例:实现音乐后台播放;[/b][/color][/size]
Activity代码部分:
package com.example.service;
import com.example.service.MyServiceForData.MyBinder;
import android.app.Activity;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
/* service 使用 测试 */
public class MainActivity extends Activity {
/* 生命组件对象 */
private Button startService;
private Button stopService;
private Button bindService;
private Button unbindService;
private Button getData;
private Intent intent;
private Intent intentForData;
/* 声明一个Binder对象, 用于指引到service中onBind()返回的Binder对象 */
private MyBinder binder=null;
/* 表示与service连接状态的类 :ServiceConnection */
public ServiceConnection conn = new ServiceConnection() {
/* 表示连接service失败 */
public void onServiceDisconnected(ComponentName name) {
}
/* 表示连接service成功 */
/* 参1:连接到service组件的名称 ; 参2:在service中返回的IBinder对象 */
public void onServiceConnected(ComponentName name, IBinder service) {
binder = (MyBinder) service;
}
};
/* 获得组件对象 */
protected void init(){
startService = (Button) findViewById(R.id.startService);
stopService = (Button) findViewById(R.id.stopService);
bindService = (Button) findViewById(R.id.bindService);
unbindService= (Button) findViewById(R.id.unbindService);
getData = (Button) findViewById(R.id.getData);
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/* 调用init()方法 , 初始化组件对象 */
init();
/* new一个Intent对象,实现service的调用 ,交互 */
intent = new Intent(MainActivity.this,MyService.class);
intentForData = new Intent(MainActivity.this,MyServiceForData.class);
/* 为startService写OnClickListener事件,开启service */
startService.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
/* 启动服务 */
startService(intent);
}
});
/* stopService的OnClickListener事件,关闭service */
stopService.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
/* 停止service */
stopService(intent);
}
});
/* 邦定service */
bindService.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
/* 绑定service , bindService(); */
bindService(intentForData, conn, Service.BIND_AUTO_CREATE);
}
});
/* 解除绑定 */
unbindService.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
/* 解绑service,unbindService() */
unbindService(conn);
}
});
/* 获取数据 */
getData.setOnClickListener(new OnClickListener() {
/* 查看从service中或得到的数据 */
public void onClick(View v) {
Toast.makeText(MainActivity.this, ""+binder.getCount(), 1000).show();
}
});
}
}
service代码部分:
package com.example.service;
import android.R;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;
/* 创建自己的service , 要继承Service这个类; *//* 测试启动过程 */
public class MyService extends Service {
/* 声明一个媒体对象 */
private MediaPlayer mediaPlayer ;
/* 当用户显示的call startService之后首先调用 */
/* 创建service */
public void onCreate() {
super.onCreate();
/* service创建的时候就获取MediaPlayer的对象 *//* 参1:上下文对象;参2:音乐文件资源ID*/
// mediaPlayer = MediaPlayer.create(this, 2);
Log.i("MyService", "onCreate()..创建service..");
}
/* 启动service */
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
/* service启动的时候打开音乐 */
// mediaPlayer.start();
Log.i("MyService", "onStart()..开始service..");
}
/* 停止服务 */
public void onDestroy() {
super.onDestroy();
/* service停止的时候关闭音乐 */
// mediaPlayer.stop();
Log.i("MyService", "onDestroy()..停止service..");
}
/* 绑定服务 */
public IBinder onBind(Intent intent) {
return null;
}
}
service与activity进行数据交互:
package com.example.service;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
/* 测试访问service中的数据 *//* 案例:获取该服务中变量的值 */
/* 需要实现方法:onBind(); onUnbind(); onCreate(); onDestroy(); */
public class MyServiceForData extends Service {
/* service中的变量 */
private int count = 0 ;
private boolean flags;
/* 创建MyBinder对象,用于onBind()方法返回一个Binder对象 */
MyBinder myBinder = new MyBinder();
/* 内部类:创建一个类MyBinder, 继承Binder */
public class MyBinder extends Binder{
/* 该内默认有个无参的构造方法 */
public MyBinder(){}
/* 获取count的值 */
public int getCount(){
return count;
}
}
/* 创建service */
public void onCreate() {
super.onCreate();
Log.i("MyServiceForData", "onCreate()...创建service..");
/* service创建时,启动一个线程,用于完成对count值的改变 */
new Thread(){
/* run()方法里面程序就时现成执行的程序; *//* 该现成用于改变count的值 */
public void run(){
super.run();
while(!flags){
count++;
}
}
}.start();
}
/* 绑定service */
public IBinder onBind(Intent intent) {
Log.i("MyServiceForData", "onBind()...绑定service..");
return myBinder;
}
/* 解绑service */
public boolean onUnbind(Intent intent) {
Log.i("MyServiceForData", "onUnbind()...解绑service..");
return super.onUnbind(intent);
}
/* 停止service */
public void onDestroy() {
super.onDestroy();
Log.i("MyServiceForData", "onDestroy()...停止service..");
}
}