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代码部分:
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;
案例:实现音乐后台播放;
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.."); } }