Android-Service (基本知识,生命周期,实例-startService 启动的服务音乐播放器后台服务播放)
来源:互联网 发布:淘宝网pu羽绒服 编辑:程序博客网 时间:2024/05/16 11:55
1.回顾
上篇 学习了 Android的四大组件之一 BroadCastReceiver 的 相关知识
2.重点
(1)Service 分类
(2)Service 的生命周期
(3)Service 标签 下的属性
(4)什么时候使用BindService 和 startService ?
(5)实例 - 通过Service 服务 实现 音乐播放器 后台播放
3.Service 分类
3.1 按照地点分
(1)本地服务
服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外Local服务因为是在同一进程因此不需要IPC,也不需要AIDL。相应bindService会方便很多。
缺点:主进程被Kill后,服务便会终止。
(2)远程服务 (一般为系统服务)
服务为独立的进程,对应进程名格式为所在包名加上你指定的android:process字符串。由于是独立的进程,因此在Activity所在进程被Kill的时候,该服务依然在运行,不受其他进程影响,有利于为多个进程提供服务具有较高的灵活性。
缺点:该服务是独立的进程,会占用一定资源,并且使用AIDL进行IPC稍微麻烦一点。
3.2 按 运行分类
(1)前台服务
会在通知一栏显示 ONGOING 的 Notification,当服务被终止的时候,通知一栏的 Notification 也会消失,这样对于用户有一定的通知作用。常见的如音乐播放服务。
(2)后台服务
默认的服务即为后台服务,即不会在通知一栏显示 ONGOING 的 Notification。当服务被终止的时候,用户是看不到效果的。某些不需要运行或终止提示的服务,如天气更新,日期同步,邮件同步等。
3.3 按 使用 分类
(1)startService 启动的服务
主要用于启动一个服务执行后台任务,不进行通信。停止服务使用stopService!
(2)bindService 启动的服务
该方法启动的服务要进行通信。停止服务使用unbindService ;
(3)startService 同时也 bindService 启动的服务
停止服务应同时使用stepService与unbindService
4.Service 生命周期
4.1 Start方式
startService() : onCreate() -> onStart() -> onDestroy()
如果是 调用者 直接退出而没有调用stopService的话,Service会一直在后台运行。下次调用者再起来仍然可以 stopService。
4.2 bind方式
onBindService(): onCreate() -> onBind() -> onUnbind() -> onDestroy()
调用者退出了,Srevice就会调用onUnbind-->onDestroyed 所谓绑定在一起就共存亡了。
5. Service 标签下的属性
(1)android:name : 服务类名
(2)android:label : 服务的名字,如果此项不设置,那么默认显示的服务名则为类名
(3)android:icon :服务的图标
(4)android:permission : 申明此服务的权限,这意味着只有提供了该权限的应用才能控制或连接此服务
(5)android:process :表示该服务是否运行在另外一个进程,如果设置了此项,那么将会在包名后面加上这段字符串表示另一进程的名字
(6)android:enabled : 如果此项设置为 true,那么 Service 将会默认被系统启动,不设置默认此项为 false
(7)android:exported : 表示该服务是否能够被其他应用程序所控制或连接,不设置默认此项为 false
6. 什么时候使用BindService 和 startService ?
(1)启动一个后台服务长期进行某项任务那么使用 startService
(2)想要与正在运行的 Service 取得联系,使用 bindService
(3)等等
7.Service实例—— 音乐播放器后台运行
7.1 需求
(1)startService() 实现
(2)onbindService() 实现
(3)一些优化:显示当前播放状态,存储播放状态配置(SharedPreference实现)
7.2 效果图
startService() 效果图: onbindService() 效果图:
7.3 MusicService 实现
- package com.example.service;
- import com.example.servicedemo.R;
- import android.app.Service;
- import android.content.Intent;
- import android.media.MediaPlayer;
- import android.os.Binder;
- import android.os.IBinder;
- import android.provider.MediaStore.Audio.Media;
- import android.util.Log;
- public class MusicService extends Service {
- private String TAG="MusicService";
- private MediaPlayer player;
- @Override
- public void onCreate() {
- // 服务创建:可以做初始化 操作
- Log.i(TAG, "onCreate");
- //初始化 音乐播放
- player=MediaPlayer.create(getApplicationContext(),R.raw.m123);
- //设置 无限循环
- player.setLooping(true);
- super.onCreate();
- }
- @Override
- public void onStart(Intent intent, int startId) {
- // 开启服务
- Log.i(TAG, "onStart");
- //播放
- player.start();
- super.onStart(intent, startId);
- }
- @Override
- public IBinder onBind(Intent intent) {
- //开启服务
- //其他对象通过bindService 方法通知该Service时该方法被调用
- Log.i(TAG, "onBind");
- //返回 对象
- return new mBind();
- }
- @Override
- public void onDestroy() {
- //销毁时
- Log.i(TAG, "onDestroy");
- //停止
- player.stop();
- super.onDestroy();
- }
- @Override
- public boolean onUnbind(Intent intent) {
- //其它对象通过unbindService方法通知该Service时该方法被调用
- //解绑定操作
- Log.i(TAG, "onUnbind");
- //停止
- return super.onUnbind(intent);
- }
- //用来返回 musicservice 对象
- //start() 是没办法 返回 服务对象的
- //binder 可以返回 bind对象
- public class mBind extends Binder{
- public MusicService getService(){
- return MusicService.this;
- }
- }
- //binder 播放音乐
- public void playMusic(){
- player.start();
- }
- //binder 停止音乐
- public void stopMusic(){
- player.stop();
- }
- //当然 还可以添加 其余操作
- }
7.4 AndroidMianfest.xml 配置
- <service
- android:name="com.example.service.MusicService"
- ></service>
7.5 业务实现
- package com.example.servicedemo;
- import android.app.Activity;
- import android.app.Service;
- import android.content.ComponentName;
- import android.content.Intent;
- import android.content.ServiceConnection;
- import android.content.SharedPreferences;
- import android.content.SharedPreferences.Editor;
- import android.graphics.Color;
- import android.os.Bundle;
- import android.os.IBinder;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.TextView;
- import com.example.service.MusicService;
- import com.example.service.MusicService.mBind;
- public class MainActivity extends Activity implements OnClickListener {
- // 音乐播放服务
- private MusicService musicService;
- /**
- * 通过SerciceConnection 对象 的相关 方法可以得到 更多的Service对象
- */
- private ServiceConnection conn = new ServiceConnection() {
- @Override
- public void onServiceDisconnected(ComponentName name) {
- // 当启动源跟 Service 的 连接 以外的丢失的时候,会调用这个方法:比如Service被杀死了
- }
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- // 当启动源跟 Service 成功 连接之后会 自动调用这个方法
- musicService = ((mBind) service).getService();
- }
- };
- private TextView textview1;
- private Button button1, button2, button3, button4, button5, button6;
- private SharedPreferences shared;
- private final String PLAYMUSIC = "音乐状态:音乐播放中。。。。。。。。";
- private final String STOPMUSIC = "音乐状态:播放停止";
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- // 使用SharedPreferences 保存 音乐的状态
- shared = this.getSharedPreferences("music", 10);
- // 显示 当前 音乐状态
- textview1 = (TextView) findViewById(R.id.textView1);
- button1 = (Button) findViewById(R.id.button1);
- button2 = (Button) findViewById(R.id.button2);
- button3 = (Button) findViewById(R.id.button3);
- button4 = (Button) findViewById(R.id.button4);
- button5 = (Button) findViewById(R.id.button5);
- button6 = (Button) findViewById(R.id.button6);
- button1.setOnClickListener(this);
- button2.setOnClickListener(this);
- button3.setOnClickListener(this);
- button4.setOnClickListener(this);
- button5.setOnClickListener(this);
- button6.setOnClickListener(this);
- // 加载状态 文件 配置
- String mState = shared.getString("mState", null);
- int mColor = shared.getInt("mColor", 0);
- if (mState != null) {
- if (mColor > 0) {
- textview1.setTextColor(Color.RED);
- } else {
- textview1.setTextColor(Color.BLUE);
- }
- textview1.setText(mState);
- }
- }
- /**
- * 按钮点击事件
- */
- @Override
- public void onClick(View v) {
- // 根据id 点击
- // 根据Intent 来开启 Service
- Intent intent = new Intent(MainActivity.this, MusicService.class);
- switch (v.getId()) {
- case R.id.button1:
- // onStart 方式 开启 音乐服务:播放音乐
- startService(intent);
- // 音乐状态
- playMusicState();
- break;
- case R.id.button2:
- // onStart 方式 关闭 音乐服务:关闭音乐播放
- stopService(intent);
- // 音乐状态
- stopMusicState();
- break;
- case R.id.button3:
- // onBind 方式 开启 音乐服务:播放音乐
- bindService(intent, conn, Service.BIND_AUTO_CREATE);
- textview1.setText("onBind() 成功");
- break;
- case R.id.button4:
- // onBind 方式 关闭 音乐服务:关闭音乐播放
- unbindService(conn);
- textview1.setText("unBind() 成功");
- break;
- case R.id.button5:
- //播放音乐
- musicService.playMusic();
- // 音乐状态
- playMusicState();
- break;
- case R.id.button6:
- //停止
- musicService.stopMusic();
- // 音乐状态
- stopMusicState();
- break;
- }
- }
- /**
- * 存入本地,状态配置
- *
- * @param content
- * @param color
- */
- private void EditMusicState(String content, int color) {
- Editor editor = shared.edit();
- // 状态
- editor.putString("mState", content);
- // 文字颜色 0 蓝色 ; 1 红色;
- editor.putInt("mColor", color);
- // 提交
- editor.commit();
- }
- /**
- * 音乐播放状态
- */
- private void playMusicState() {
- textview1.setTextColor(Color.BLUE);
- textview1.setText(PLAYMUSIC);
- EditMusicState(PLAYMUSIC, 0);
- }
- /**
- * 音乐停止状态
- */
- private void stopMusicState() {
- textview1.setTextColor(Color.RED);
- textview1.setText(STOPMUSIC);
- EditMusicState(STOPMUSIC, 1);
- }
- }
8.demo 下载
http://download.csdn.net/detail/lablenet/9059911
不知不觉已经很晚了,也该睡觉了,Service晚安!
- Android-Service (基本知识,生命周期,实例-startService 启动的服务音乐播放器后台服务播放)
- Android-Service (基本知识,生命周期,实例-startService 启动的服务音乐播放器后台服务播放)
- Android基于Service服务的音乐播放
- Android Activity与Service交互,startservice,bindService多媒体播放器音乐播放暂停按钮请求服务设置按钮图片问题
- Service后台服务控制音乐的播放暂停和停止,播放完自动播放下一曲
- 实现音乐播放器后台Service服务一直存在的解决思路
- 实现音乐播放器后台Service服务一直存在的解决思路
- Service 简单的音乐播放服务
- Android Service 之启动服务( startService() )
- 【android】音乐播放器之service服务设计
- Android之Service服务实现音乐播放器
- Android启动服务播放音乐(两种启动方式)
- StartService启动服务的生命周期
- Android开发---音乐播放器(服务类的实现)
- android Service后台播放音乐
- android音乐播放器Service的生命周期分析
- Android 音乐播放器,Service后台管理播放
- 基于service服务后台运行的music播放器
- servlet容器web服务器jsp引擎
- 使用配置文件连接数据库
- word-break:break-all和word-wrap:break-word的区别
- 基于zepto写的几个常用小东西(toast、加载器、上拉加载、下拉刷新)
- JavaScript 实现放大镜效果
- Android-Service (基本知识,生命周期,实例-startService 启动的服务音乐播放器后台服务播放)
- tolua++ 返回值
- Socket
- JSON专题-基础知识
- xcode8继续愉快的使用插件
- WordPress database error: [Got error 28 from storage engine]
- 第一次作业-开发环境搭建与第一个简单APP开发
- 矩阵消消乐
- HDU2476 区间DP