欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android 之 Service服务

程序员文章站 2022-05-16 22:38:17
...
使用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;

案例:实现音乐后台播放;


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..");
	}

}



  • Android 之 Service服务
            
    
    博客分类: Android androidservicejava
  • 大小: 80.4 KB