本篇文章给大家谈谈百度音乐 api接口,以及百度语音api使用教程对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
今天给各位分享百度音乐 api接口的知识,其中也会对百度语音api使用教程进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
音乐平台的“API ”和“接口”怎么对调使用?
首要做的事情就是联系巅峰开放平台,申请相关的appid和appSecret。
然后保存到本地,在调用接口的时候使用,否则将无权限进行接口的调用。
1.接口调用原理
调用巅峰开放平台的API接口时,即是API调用端(即用户调用接口运行的程序)调用API服务器端的数据(即RC2P提供的服务器,可调用巅峰开放平台上的数据)时的交互流程。
2.申请调用接口使用权限
首先介绍概念:
appSecret:应用密钥,也是巅峰开放平台颁发给客户端应用的,不可对外公开,不需要在URL地址中进行传递,应用商家需注意保密,调用API的时候需要使用。
通过上面的介绍可知,如果要想调用巅峰开放平台的API接口服务,首要做的事情就是联系巅峰开放平台,申请相关的appid和appSecret,然后保存到本地,在调用接口的时候使用,否则将无权限进行接口的调用。
3.如何加密
针对每个API接口,都可能拼出不同的URL,针对该URL,需要调用巅峰开放平台提供的rc2p-utils.jar 实现加密,并将加密的值作为access_token参数的值。
如何用javascript调用或接入百度api的音乐搜索功能,并获得搜索结果?
试试看在<body中输入这段代码
百度音乐 api接口:<script type="text/javascript"
var pageTracker = _gat._getTracker("UA-3689486-1");
pageTracker._initData();
pageTracker._trackPageview();
pagePublicTracker = _gat._getTracker("UA-10197155-1");
pagePublicTracker._initData();
var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://");
document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3F350e824b48b2d02f8a8d11e138ce53a8' type='text/javascript'%3E%3C/script%3E"));
</script

音乐视频站api接口
API:应用程序接口(API:Application Program Interface)
应用程序接口(API:application programming interface)是一组定义、程序及协议的集合,通过 API 接口实现计算机软件之间的相互通信。API 的一个主要功能是提供通用功能集。程序员通过使用 API 函数开发应用程序,从而可以避免编写无用程序,以减轻编程任务。
API 同时也是一种中间件,为各种不同平台提供数据共享。根据单个或分布式平台上不同软件应用程序间的数据共享性能,可以将 API 分为四种类型:
远程过程调用(RPC):通过作用在共享数据缓存器上的过程(或任务)实现程序间的通信。
标准查询语言(SQL):是标准的访问数据的查询语言,通过通用数据库实现应用程序间的数据共享。
文件传输:文件传输通过发送格式化文件实现应用程序间数据共享。
信息交付:指松耦合或紧耦合应用程序间的小型格式化信息,通过程序间的直接通信实现数据共享。
当前应用于 API 的标准包括 ANSI 标准 SQL API。另外还有一些应用于其它类型的标准尚在制定之中。API 可以应用于所有计算机平台和操作系统。这些 API 以不同的格式连接数据(如共享数据缓存器、数据库结构、文件框架)。每种数据格式要求以不同的数据命令和参数实现正确的数据通信,但同时也会产生不同类型的错误。因此,除了具备执行数据共享任务所需的知识以外,这些类型的 API 还必须解决很多网络参数问题和可能的差错条件,即每个应用程序都必须清楚自身是否有强大的性能支持程序间通信。相反由于这种 API 只处理一种信息格式,所以该情形下的信息交付 API 只提供较小的命令、网络参数以及差错条件子集。正因为如此,交付 API 方式大大降低了系统复杂性,所以当应用程序需要通过多个平台实现数据共享时,采用信息交付 API 类型是比较理想的选择。
API 与图形用户接口(GUI)或命令接口有着鲜明的差别:API 接口属于一种操作系统或程序接口,而后两者都属于直接用户接口。
有时公司会将 API 作为其公共开放系统。也就是说,公司制定自己的系统接口标准,当需要执行系统整合、自定义和程序应用等操作时,公司所有成员都可以通过该接口标准调用源代码,该接口标准被称之为开放式 API。
谁能告诉我在开发音乐app的时候 那些网络数据怎么获得的。我知道是api 接口
这个服务端,肯定需要先搭建一个web工程。然后客户端可以通过http方式去下载音乐。ios有实现了http客户端的工具包
一般这种音乐播放都是先下载再播放,当用户点击播放音乐时,程序判断本地是否有文件,如果没有,采用http方式下载文件,放入本地。再进行播放
cmp播放器的API接口
CMP4的API接口简介
API就是应用程序接口,CMP4的API用来提供给插件或页面脚本进行调用,以达到对CMP4进行控制的目的
通过API,可以读取或设置CMP4的相关属性,可以调用部分方法,可以绑定一些事件进行侦听等等
CMP4支持API的地方:
(1),全局配置中插件plugins和背景backgrounds,自定义频谱mixer_src,还包括logo,video_image,lrc_image
(2),皮肤中的5个窗口背景src
(3),列表项的视频区背景bg_video和歌词区背景bg_lrc
(4),JavaScript页面脚本(部分支持),必须允许脚本通讯(allowScriptAccess=always)
其中Flash的脚本必须为ActionScript 3.0版本,所以API接口分以下两种情况进行讨论: 通过AS3的API接口通讯,我们可以在插件或皮肤中,直接获取CMP数据并进行控制,
下面是所以支持的属性,方法,事件
属性attributes:
cmp:Object;返回cmp对象
config:Object;取得cmp全局配置,包含所有可读写的全局配置,以及其他一些配置的只读属性,比如当前播放状态state,具体有哪些可用for in语句查询
item:Object;取得当前播放项,包含所有列表项属性,以及其他一些播放项的只读属性,具体有哪些可用for in语句查询
list_xml:XML;取得列表xml的引用
skin_xml:XMLList;取得当前皮肤配置的引用
tools:Object;返回cmp的工具箱,主要有:base64, effects, graphics, netclient, output, states, strings, types, zoom, zip
win_list:Object;
取得5个窗口的引用,有如下5个属性: option/list/media/console/lrc
当然还可以访问下一级对象,如要访问播放按钮bt_play则可:
var bt_play = api.win_list.console. bt_play;
结构和名称同皮肤包里面的skin.xml皮肤配置的结构和名称
方法methods:
addEventListener():void;
添加一个事件侦听器,如侦听皮肤加载完成事件:
api.addEventListener(api.key, 'skin_loaded', skinHandler);
特别不同,这里第一个参数需传入api.key,它是一个唯一key值,用于第三方flash移除时,销毁其key所在所有注册的事件
addProxy():void;
添加一个代理函数,用于src=proxy:函数名,函数参数这样的协议,如:
api.addProxy(youku, yk_callback);
这样就可以用自定义的yk_callback(函数参数)方法来解析协议:src=proxy:youku,函数参数
cookie():String读取(cookie(name))和写入(cookie(name, data))本地存储,类似于浏览器cookie,但无时间过期限制
removeEventListener():void;移除一个事件侦听器,如:api.removeEventListener('skin_loaded', skinHandler);
sendEvent():void;
发送一个事件,如:api.sendEvent(view_play);
如果有参数data要传递就是:api.sendEvent(view_play, data);
sendState():void;
发送一个新的播放状态,如将播放状态改为正连接:
api.sendState(connecting);
toString():String;打印api所有属性,方法,事件类型,方便查阅所有支持的api
事件类型events:按字母顺序
api发送api共享事件时调度
api_removeapi插件移除时调用
control_fullscreen全屏状态改变时调度
control_link打开链接页面时调度
control_load音乐开始加载时调度
control_max最大化改变时调度,事件的data将传递是lrc_max还是video_max
control_mute静音状态改变时调度
control_next播放下一个时调度
control_pause暂停时调度
control_play播放时调度
control_playmode播放模式改变时调度
control_prev播放上一个时调度
control_progress进度改变时调度
control_stop停止时调度
control_volume音量改变时调度
control_win窗口打开关闭时调度
control_winbt窗口对应按钮状态改变时调度
item_deleted
列表项删除时调度
事件的data将返回删除项对象
list_change列表已经改变时调度,表示新的列表已经刷新,可用于播放等操作
list_load
使列表开始加载时调度
事件的data可以传入新指定的配置lists进行加载
list_loaded
列表内容加载完时调度,多个列表会调度多个,每次会将加载的列表数据进行解析,然后附加到总列表,再刷新列表
事件的data可以传入新指定的xml列表内容字符进行解析,此功能便于外载调用,直接输入列表内容
lrc_complete
歌词成功加载完成时调度
事件data返回当前加载成功的歌词类型:lrc或kmc
lrc_error
歌词加载或解析错误时调度
事件data将返回错误信息
lrc_load
使当前音乐的歌词开始加载时调度
事件data可以传入指定当前音乐的歌词地址,支持lrc和kmc地址
lrc_loaded
歌词加载完成时调度
事件data可以传入指定的歌词内容,支持lrc和kmc格式内容
lrc_max对歌词最大化状态进行切换
lrc_resize歌词尺寸改变时调度,包括对歌词进行缩放调整
lrc_rowchange
当前歌词行内容改变时调度,仅支持lrc和kmc格式
事件data将传递返回当前行的歌词内容
有了这个事件可以很方便的调用js api在浏览器标题栏或状态栏打印当前位置的歌词
mixer_color
对混音器颜色进行变更时调度
事件data可以传入新的颜色值
mixer_displace
对混音器的置换效果状态进行切换时调度
事件data可传入true或false
mixer_filter
对混音器的滤镜效果状态进行切换时调度
事件data可传入true或false
mixer_next
使用下一个混音器效果时调度
事件data可以传入下一个频谱效果的id
mixer_prev
使用上一个混音器效果时调度
事件data可以传入下一个频谱效果的id
model_change
模块改变时调度
事件data可以传入要使用的新模块类型type
model_error
当前项发生错误时调度
事件data将返回错误信息
model_load
模块开始加载时调度
事件data可以传入即将要播放媒体url
model_loaded当前项下载完成时调度
model_loading当前项正在下载时调度
model_meta
当前项取得meta信息时调度
事件data将返回meta数据对象
model_start当前项第一次开始播放时调度,一般此时才开始加载歌词或开始显示频谱
model_state
当前项状态改变时调度
事件data将返回当前状态,所有支持状态码为:
undefined 未定义
connecting 连接中
buffering 缓冲
playing 正在播放
paused 已暂停
stopped 已停止
completed 播放完成
reconnecting 重试连接
状态改变时,将在皮肤的状态栏显示当前状态对应的说明,说明可以在皮肤配置的languages多语言里自定义
model_time当前项播放时间改变时调度
plugins_load
插件和背景开始加载时调度
事件data可传入新指定的配置plugins(不支持backgrounds)进行加载
plugins_loadedplugins参数指定的插件全部加载完成时调度(此时将第一次加载列表lists指定的文件)
plugins_remove插件和背景移除时调度
resize播放器舞台改变尺寸时调度
skin_change
针对皮肤id对皮肤进行改变时调度
事件data可以直接传入新的皮肤id
skin_complete皮肤显示完成时调度
skin_load
皮肤开始加载时调度
事件data可以传入新指定的配置skins参数进行加载
skin_loaded皮肤加载完成时调度
video_blackwhite
对视频是否启用黑白效果滤镜
事件data可传入true或false
video_effect
对视频进行颜色滤镜(ColorMatrixFilter)改变时调度
事件data可以传入一个英文逗号隔开的数组值,用来新建颜色矩阵滤镜ColorMatrixFilter
video_highlight
对视频是否启用高亮效果滤镜
事件data可传入true或false
video_max对视频最大化进行切换时调度
video_resize视频尺寸改变时调度
video_rotation
对视频进行旋转时调度
事件data可以传入旋转的角度值,如90
video_scalemode
对视频进行缩放模式改变时调度
事件data可以传入支持缩放模式的id,支持0,1,2,3
video_smoothing
对视频是否启用平滑效果时调度
事件data可以传入true或false
view_console对控制窗口状态进行改变时调度
view_forward点击快进按钮时调度
view_fullscreen对全屏状态进行改变时调度
view_item
对播放项进行改变时调度
view_link
点击链接按钮时调度
事件data可以传入新指定的链接进行打开
view_list对列表窗口进行改变时调度
view_lrc对歌词窗口进行改变时调度
view_mute点击静音按钮时调度
view_next点击下一个按钮时调度
view_option对设置窗口进行改变时调度
view_play
点击播放或暂停按钮时调度
事件的data可以传递列表id位置,表示播放第几个
view_prev点击上一个按钮时调度
view_progress
拖动播放进度条时调度
事件data可以传入指定的进度百分值
view_random点击随机播放模式按钮时调度
view_repeat点击重复播放模式按钮时调度
view_rewind点击快退按钮时调度
view_single点击单遍播放模式按钮时播放
view_stop点击停止按钮时调度
view_video对视频窗口状态进行改变时调度
view_volume
拖动音量条时调度
事件data可以传入指定的volume音量值和panning平移值,用英文逗号隔开,如:1,0
具体API接口应用的例子可以见安装包的示例:plugins/ApiExample .as 或者直接到官方插件库查看,
全部附源文件: 下列函数的调用,需要先获取CMP所在flash的对象,也就是例子中的cmpo,获取方法见使用范例
cmp_api();只读,返回CMP所有支持的API信息,包括CMP支持的所以APIvar str = cmpo.cmp_api();
config();1,读取CMP当前所有的全局配置,返回一个Object对象,包含所有可读写的全局配置属性设置,以及其他一些只读属性var config = cmpo.config();
2,读取配置的某个属性值,具体支持哪些属性,可用for in语句查询
var name = cmpo.config(name);
var name = cmpo.config().name;
3,修改某个属性的值,需传入属性名称和值
注意:修改属性仅是将值写入配置中,需要下次有相关的刷新(如发送事件)才应用新的值
cmpo.config(skin_id, 1);
item();1,返回当前播放项的一个Object对象,如果没有开始任何播放,将返回null,其包含当前项的所有属性var item = cmpo.item();
2,返回当前播放项的某个属性值,具体支持哪些属性,可用for in语句查询
var src = cmpo.item(src);
var src = cmpo.item().src;
3,修改某个属性的值(一般不用)cmpo.item(src, test .mp3);
list_xml();1,读取CMP当前列表内容,返回一个xml的字符串var xml = cmpo.list_xml();
2,修改列表内容,需传入一个xml列表格式的字符串
var xml = '<list<m label=test src=test .mp3 /</list';
cmpo.list_xml(xml);
如果需要覆盖原有的音乐可以设置第2个参数,表示是否附加到原有列表后面,默认为true表示附加,传入false表示不附加,将重建列表并写入新的列表内容cmpo.list_xml(xml, false);
list();
1,返回CMP列表数的所有信息,包括未打开的列表
将返回一个数组,数组每项都是一个音乐项对象,类型为Object
var arr = cmpo.list();
读取一级列表的个数var num = cmpo.list().length;
返回第二个项,数组是从0开始的,第二个项索引就是1var m2 = cmpo.list()[1];
如果这个音乐项是个目录,则会有children属性,表示它下面的子列表,也是一个数组
以此类推,这样我们可以逐个循环得到整个列表
当然音乐项也有parent属性,表示其父目录对象
var m2_arr = m2.children;
2,返回某个指定的项对象
参数可以是包含唯一key值Object型的项对象,也可以直接传入字符型key值
key值可以从上面1中的列表项对象中读取
var item = cmpo.list(m2);
var item = cmpo.list(ITEM_1);
3,读取项的某个属性var src = cmpo.list(ITEM_1, src);
如果传入的参数是项支持的一个方法名,则执行此项的某个方法
目前支持:play播放此项, open打开此目录, close关闭此目录, toggle开关切换, remove移除此项
cmpo.list(ITEM_1, play);
skin_xml();只读,返回当前皮肤配置文件内容的xml字符形式var xml = cmpo.skin_xml();
skin();1,读取皮肤元件的某个属性值,第1个参数表示皮肤元件位置,第2个是元件属性名
var width = cmpo.skin(console, width);
var xywh = cmpo.skin(console .bt_play, xywh);
2,修改元件的某个属性,如果修改成功将返回truecmpo.skin(console .bt_play, xywh, 0, 0, 100, 20);
sendEvent();
往CMP发送事件
第1个参数是事件类型,所有支持类型见AS3中的所有事件类型列表
第2个参数是需要传入的数据(可选)
cmpo.sendEvent(view_play);
cmpo.sendEvent(view_play, 2);
addEventListener();
添加一个js侦听方法
第1个参数是事件类型,同上
第2个参数是回调函数名,字符串格式
cmpo.addEventListener(item_deleted, del);
function del(data) { }
removeEventListener();移除一个已经注册的js侦听方法cmpo.removeEventListener(item_deleted, del);
cookie();CMP的通用存储接口,可以在本地电脑存储并读取已经存储的数据,flash需启用本地存储(默认是10K容量),这些数据是永久储存的,而且跨浏览器
cmpo.cookie(name, CMP4);
var name = cmpo.cookie(name);
您的应用没有被授权调用ic的相关服务 请核实
Services
服务是一个应用程序组件,可以在后台执行长时间运行的操作,不提供用户界面。一个应用程序组件可以启动一个服务,它将继续在后台运行,即使用户切换到另一个应用程序。此外,一个组件可以绑定到一个服务与它交互,甚至执行进程间通信(IPC)。例如,一个服务可能处理网络通信,播放音乐,执行文件I/O,或与一个内容提供者交互,都在后台执行。
一个服务本质上讲有两种形式
百度音乐 api接口:
Started 启动的
started 形式的服务是指当一个应用组件(比如 activity )通过startService()方法开启的服务。一旦开启
百度音乐 api接口,该服务就可以 无限期 地在后台运行,哪怕开启它的组件被销毁掉。
通常,开启的服务执行一个单独的操作且并不向调用者返回一个结果。
比如,可能从网络进行下载或者上传一个文件。当任务完成,服务就该自我停止。
Bound 绑定的
bound 形式的服务是指一个应用组件通过调用 bindService() 方法与服务绑定。一个绑定的服务提供一个客户-服务端接口,以允许组件与服务交互,发送请求,获得结果,甚至执行进程间通信。一个绑定的服务只和与其绑定的组件同时运行。多个组件可以同时绑定到一个服务,但当全部接触绑定后,服务就被销毁。
虽然分这两类,但是一个服务可以同时使用这两种方式——可以用 started 无限期的运行,同时允许绑定。只需要在服务中实现两个回调方法
百度音乐 api接口: onStartCommand() 允许组件开启服务, onBind() 允许绑定。
不论应用程序是怎么起服务的, 任何 应用程序都可以用这个服务。同样的,任何组件可以使用一个 Activity 通过传递 Intent 开启服务。你也可以在配置文件设置服务为私有来防止其他应用访问该服务。
注意: 一个服务在进程中的主线程运行——一个服务 不会 创建自己的线程,也 不会 在另外的进程运行(除非另外指定)。这意味着,如果服务需要做一些频繁占用CPU的工作或者会发生阻塞的操作,你需要在服务中另开线程执行任务。这可以降低产生ANR的风险,提高用户体验。
基础
创建一个服务需要建立一个 Service 相关的子类,然后需要实现一些回调方法,好在不同的生命周期内做对应处理和绑定服务,比较重要的方法如下:
onStartCommand()
当其他组件,如 activity 请求服务启动时,系统会调用这个方法。一旦这个方法执行,服务就开始并且无限期的执行。如果实现这个方法,当这个服务完成任务后,需要你来调用 stopSelf() 或者 stopService() 停掉服务。如果只想提供绑定,不需要自己实现这个方法。
onBind()
当有其他组件想通过 bindService() 方法绑定这个服务时系统就会调用此方法。在实现的方法里面,必须添加一个供客户端使用的接口通过返回一个 IBinder 来与服务通信,这个方法必须实现。当然不想允许绑定的话,返回 null 即可。
onCreate()
服务第一次建立的时候会调用这个方法,执行一次性设置程序,在上面2个方法执行前调用。如果服务已存在,则不执行该方法。
onDestroy()
服务不再使用则使用该方法。服务应该实现这个方法来清理诸如线程,注册的监听器等资源。这是最后调用的方法。
安卓系统只会在内存占用很高,必须恢复系统资源供当前运行程序的情况下强制停掉一个运行中的服务。如果服务绑定在当前运行的程序中,就几乎不会被杀掉,如果服务声明
百度音乐 api接口了在前台运行(其实在后台,只是给系统一个错的信息来提高优先级),就几乎不会被杀掉。另外,如果一个服务正在运行,且运行了很久,系统就会根据运行时间把其排在后台任务列表的后面,则这个服务很容易被杀掉。根据onStartCommand() 的返回值设置,服务被杀掉后仍可以在资源充足的条件下立即重启。
是用一个服务好还是开一个线程好
一个服务就是一个可以忽略交互,在后台独立运行的组件,如果你需要这样就用服务
如果你需要在用户与程序交互时在主线程外执行任务,那就开个线程吧。
比如想播放音乐,但只在程序运行时播放,你可能在 onCreate() 开一个线程,在 onStart() 中开启它,在 onStop() 停止它。也可以考虑使用 AsyncTask 或者HandlerThread 取代一般的线程。
记住,如果使用一个服务,它还是默认在主线程中运行,如果会发生阻塞,还是要在服务中另开线程的。
在 manifest 文件声明服务
要使用服务就必须在 manifest 文件声明要用的所有服务,只用在<application 标签内添加子标签 <service 即可。
<manifest ...
...
<application ...
<service android:name=".ExampleService"
android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:isolatedProcess=["true" | "false"]
android:label="string resource"
android:icon="drawable resource"
android:permission="string"
android:process="string"
...
</service
</application
</manifest
下面对 service 标签属性做说明
android:name
你所编写的服务类的类名,可填写完整名称,包名+类名,如com.example.test.ServiceA ,也可以忽略包名,用 . 开头,如 .ServiceA,因为在 manifest 文件开头会定义包名,它会自己引用。
一旦你发布应用,你就不能改这个名字(除非设置 android:exported="false"),另外 name 没有默认值,必须定义。
android:enabled
是否可以被系统实例化,默认为 true
因为父标签 <application 也有 enable 属性,所以必须两个都为默认值true 的情况下服务才会被激活,否则不会激活。
android:exported
其他应用能否访问该服务,如果不能,则只有本应用或有相同用户ID的应用能访问。当然除了该属性也可以在下面 permission 中限制其他应用访问本服务。
这个默认值与服务是否包含意图过滤器 intent filters 有关。如果一个也没有则为 false
android:isolatedProcess
设置 true 意味着,服务会在一个特殊的进程下运行,这个进程与系统其他进程分开且没有自己的权限。与其通信的唯一途径是通过服务的API(binding and starting)。
android:label
可以显示给用户的服务名称。如果没设置,就用 <application 的 lable 。不管怎样,这个值是所有服务的意图过滤器的默认 lable 。定义尽量用对字符串资源的引用。
android:icon
类似 label ,是图标,尽量用 drawable 资源的引用定义。
android:permission
是一个实体必须要运行或绑定一个服务的权限。如果没有权限,startService() , bindService() 或 stopService() 方法将不执行,Intent 也不会传递到服务。
如果属性未设置,会由 <application 权限设置情况应用到服务。如果两者都未设置,服务就不受权限保护。
android:process
服务运行所在的进程名。通常为默认为应用程序所在的进程,与包名同名。<application 元素的属性 process 可以设置不同的进程名,当然组件也可设置自己的进程覆盖应用的设置。
如果名称设置为冒号 : 开头,一个对应用程序私有的新进程会在需要时和运行到这个进程时建立。如果名称为小写字母开头,服务会在一个相同名字的全局进程运行,如果有权限这样的话。这允许不同应用程序的组件可以分享一个进程,减少了资源的使用。
创建“启动的”服务
启动的(started)服务由 startService(Intent) 方法启动,在服务中的 onStartCommand()方法里获得 Intent 信息。关闭则由服务自己的方法 stopSelf() 或者由启动服务的地方调用 stopService(Intent) 方法来关闭。并不会因为启动服务的应用程序销毁而关闭。
示例,一个应用需要保存数据到远程数据库,这时启动一个服务,通过创建启动的服务给服务传递数据,由服务执行保存行为,行为结束再自我销毁。因为服务跟启动它的应用在一个进程的主线程中,所以对于耗时的操作要起一个新的线程去做。
//activity中
Intent intent = new Intent(MainActivity.this, ServiceA.class);
intent.putExtra("name", strName);
startService(intent);
//service中
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
// 获取数据
String strName = intent.getStringExtra("name");
// ... 数据库操作
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
耗时的操作
}
}).run();
return Service.START_STICKY;
}
写服务有2种,继承 service 或者 IntentService 。后者是前者的子类。前者包含上面介绍的各种方法,用于普通的服务。后者可以自己开一个工作线程一个接一个处理多个请求。
继承IntentService
大多数服务不需要同时处理多个请求,继承 IntentService 是最好的选择
IntentService处理流程
创建默认的一个 worker 线程处理传递给 onStartCommand() 的所有 intent ,不占据应用的主线程
创建一个工作队列一次传递一个 intent 到你实现的 onHandleIntent() 方法,避免了多线程
在所以启动请求被处理后自动关闭服务,不需要调用 stopSelf()
默认提供 onBind() 的实现,并返回 null
默认提供 onStartCommand() 的实现,实现发送 intent 到工作队列再到你的onHandleIntent() 方法实现。
这些都加入到 IntentService 中了,你需要做的就是实现构造方法和onHandleIntent() ,如下:
public class HelloIntentService extends IntentService {
/**
* A constructor is required, and must call the super IntentService(String)
* constructor with a name for the worker thread.
*/
public HelloIntentService() {
super("HelloIntentService");
}
/**
* The IntentService calls this method from the default worker thread with
* the intent that started the service. When this method returns, IntentService
* stops the service, as appropriate.
*/
@Override
protected void onHandleIntent(Intent intent) {
// Normally we would do some work here, like download a file.
// For our sample, we just sleep for 5 seconds.
long endTime = System.currentTimeMillis() + 5*1000;
while (System.currentTimeMillis() < endTime) {
synchronized (this) {
try {
wait(endTime - System.currentTimeMillis());
} catch (Exception e) {
}
}
}
}
}
如果需要重写其他回调方法,如 onCreate() , onStartCommand() 等,一定要调用super() 方法,保证 IntentService 正确处理 worker 线程,只有 onHandleIntent()和 onBind() 不需要这样。如:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();
return super.onStartCommand(intent,flags,startId);
}
继承Service
继承 Service 就可以实现对请求多线程的处理,前面介绍了 service 的生命周期,可以按照生命周期实现方法。就不放示例了。
onStartCommand() 的返回值
返回一个整型值,用来描述系统在杀掉服务后是否要继续启动服务,返回值有三种:
START_NOT_STICKY
系统不重新创建服务,除非有将要传递来的 intent 。这是最安全的选项,可以避免在不必要的时候运行服务。
START_STICKY
系统重新创建服务并且调用 onStartCommand() 方法,但并不会传递最后一次传递的 intent ,只是传递一个空的 intent 。除非存在将要传递来的 intent ,那么就会传递这些 intent 。这个适合播放器一类的服务,不需要执行命令,只需要独自运行,等待任务。
START_REDELIVER_INTENT
系统重新创建服务并且调用 onStartCommand() 方法,传递最后一次传递的intent 。其余存在的需要传递的intent会按顺序传递进来。这适合像下载一样的服务,立即恢复,积极执行。
如果想从服务获得结果,可以用广播来处理
创建“绑定的”服务
用 bindService() 方法将应用组件绑定到服务,建立一个长时间保持的联系。
如果需要在 activity 或其他组件和服务交互或者通过进程间通信给其他应用程序提供本应用的功能,就需要绑定的服务。
建立一个绑定的服务需要实现 onBind() 方法返回一个定义了与服务通信接口的IBinder 对象。其他应用程序组件可以调用 bindService() 方法获取接口并且调用服务上的方法。
创建一个绑定的服务,第一件事就是定义一个说明客户端与服务通信方式的接口。这个接口必须是 IBinder 的实现,并且必须要从 onBind() 方法返回。一旦客户端接收到了 IBinder ,就可以通过这个接口进行交互。
多个客户端可以绑定到一个服务,可以用 unbindService() 方法解除绑定,当没有组件绑定在服务上,这个服务就会被销毁。
//activity中
private ServiceConnection connB = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
Log.v(tag, "Service B disconnected");
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
Log.v(tag, "Service B connected");
MyBinderB binder = (MyBinderB) service;
ServiceB SB = binder.getService();
SB.showLog();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent a = new Intent(MainActivity.this, ServiceB.class);
bindService(a, connB, BIND_AUTO_CREATE);
}
}
//ServiceB
public class ServiceB extends Service {
public void showLog() {
Log.i(tag, "serviceB--showLog()");
}
public class MyBinderB extends Binder {
public ServiceB getService() {
return ServiceB.this;
}
}
private MyBinderB myBinderB = new MyBinderB();
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return myBinderB;
}
}
启动前台服务
前台服务是被认为是用户已知的正在运行的服务,当系统需要释放内存时不会优先杀掉该进程。前台进程必须发一个 notification 在状态栏中显示,直到进程被杀死。因为前台服务会一直消耗一部分资源,但不像一般服务那样会在需要的时候被杀掉,所以为了能节约资源,保护电池寿命,一定要在建前台服务的时候发notification ,提示用户。当然,系统提供的方法就是必须有 notification 参数的,所以不要想着怎么把 notification 隐藏掉。
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
Intent notificationIntent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
Notification noti = new Notification.Builder(this)
.setContentTitle("Title")
.setContentText("Message")
.setSmallIcon(R.drawable.ic_launcher)
.setContentIntent(pendingIntent)
.build();
startForeground(12346, noti);
return Service.START_STICKY;
}
startForeground() 方法就是将服务设为前台服务。参数12346就是这个通知唯一的id,只要不为0即可。
关于百度音乐 api接口和百度语音api使用教程的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
百度音乐 api接口的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于百度语音api使用教程、百度音乐 api接口的信息别忘了在本站进行查找喔。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
暂时没有评论,来抢沙发吧~