Android 之 Service服务

[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代码部分:
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..");
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值