startservice 失败和 bindService的区别

1、要使用Service,首先就是在配置文件里吗添加Service,如果不填加,你的Service是不能够使用的。目前学到的方法有两种&& 方法一:&service android:enabled=&true& android:name=&.PlayService& /&&& 方法二:&service android:name=&.PlayService& /&& 点后面是Service类的名字。2、工程包括两个类:ServiceActivity.javaPlayService.java其中:ServiceActivity.java定义了两个按钮,分别控制音乐的播放与停止。用startService和stopService完成Activity与Service之间的切换,启动Service以及取消Service,如果不用按钮,可以在Activity的OnCreate和OnDestrpy里面启动和取消Service,如下:代码 & @Override & &public void onCreate(Bundle savedInstanceState) { & & & &super.onCreate(savedInstanceState); & & & &setContentView(R.layout.main);this.startService(new Intent(this, PlayService.class));}@Overrideprotected void onDestroy() {super.onDestroy();this.stopService(new Intent(this,PlayService.class));}在activity里面,如果需要使用Service的话,需要调用startService(),从而利用startService()去调用Service中的OnCreate()和onStart()方法来启动一个后台的Service。启动一个Service的过程如下:context.startService()&-&onCreate()-&onStart()-&Servicerunning其中onCreate()可以进行一些服务的初始化工作,onStart()则启动服务。停止一个Service的过程如下:context.stopService() |-&onDestroy() -&Service stop&创建Service需要继承自 android.app.Service 的类,然后重新实现在Service各个状态要回调的方法,Service的回调方法有三个,分别是:onCreate()创建onStart()开始onDestry()释放注意:Service是不能自己启动的,只有通过 Context 对象 调用startService和bindService方法来启动。也就是说Service不能自己调用的,所以我们看见很多Service都是用Activity调用的。(1)Context.startService():Service会经历onCreate -& onStart(如果Service还没有运行,则android先调用onCreate()然后调用onStart();如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次);stopService的时候直接onDestroy,如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。该Service的调用者再启动起来后可以通过stopService关闭Service。&注意,多次调用Context.startservice()不会嵌套(即使会有相应的onStart()方法被调用),所以无论同一个服务被启动了多少次,一旦调用Context.stopService()或者stopSelf(),他都会被停止。补充说明:传递给startService()的Intent对象会传递给onStart()方法。调用顺序为:onCreate --& onStart(可多次调用) --& onDestroy。(2)Context.bindService():Service会经历onCreate() -& onBind(),onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind -& onDestroyed相应退出,所谓绑定在一起就共存亡了。补充说明:传递给bindService()的Intent对象会传递给onBind(),传递给unbindService()的Intent对象会传递给onUnbind()方法。调用顺序为:onCreate --& onBind(只一次,不可多次绑定) --& onUnbind --& onDestory。(3)注意事项:在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。还有一点,目前我没有遇到过需要startService和bindService交互使用的情况(我认为不会有这种需求),所以不必去考虑交互的问题,待遇到时再考虑不迟。(4)BroadcastReceiver只能通过startService启动Service,因为广播本身生命周期很短,bind的话没有意义PlayService.java是Service类,包括OnCreate,OnStart,OnDestroy三种方法,&& 其中OnCreate可有可无,如果有,可以在这里创建与MediaPlayerd的链接。如果无,可以在Onstart里面创建这个链接。&&&&&&& OnCreate在音乐播放周期里面(未OnDestroy)之前,只创建一次,而每按一次播放,OnStart就会被调用一次。&&&&&&& OnStart,里面可以启动播放音乐,&&&&&&& OnDestroy,里面调用停止播放音乐。如果按了停止按钮,会调用(或者打印Log更直观)“ServiconDestroy“,但是Activity不会退出。当退出Activity的时候,会相继调用(或者打印Log更直观)&ActivityonStop&,和&ActivityOnDestroy&此时,音乐播放是不会停止的,可以知道,如果想让Service一启动就执行的代码,可以写在Service的OnCreate或OnStart,里面,会在启动Service的时候自动调用,与Activity自动调用OnCreate道理是一样的。代码如下:代码package com.service.import android.app.Aimport android.content.Iimport android.os.Bimport android.util.Limport android.view.Vimport android.view.View.OnClickLimport android.widget.Bpublic class ServiceActivity extends Activity implements OnClickListener { & &/** Called when the activity is first created. */ & &Button buttonOn, buttonO & &String TAG = &ServiceActivity&; & &@Override & &public void onCreate(Bundle savedInstanceState) { & & & &super.onCreate(savedInstanceState); & & & &setContentView(R.layout.main); & & & &buttonOn = (Button) findViewById(R.id.button_on); & & & &buttonOff = (Button) findViewById(R.id.button_off); & & & &buttonOn.setOnClickListener(this); & & & &buttonOff.setOnClickListener(this); & & & &Log.v(TAG, &ActivityonCreate&); & &} & &@Override & &public void onClick(View v) { & & & &// TODO Auto-generated method stub & & & &switch (v.getId()) { & & & &case (R.id.button_on): & & & & & &Log.v(TAG, &ActivitystartService&); & & & &this.startService(new Intent(this,PlayService.class)); & & & &// startService(new Intent(this, PlayService.class)); & & & & & & & & & & & &break; & & & &case (R.id.button_off): { & & & & & &Log.v(TAG, &ActivitystopService&); & & & & & & this.stopService(new Intent(this,PlayService.class)); & & & & & & //stopService(new Intent(this, PlayService.class)); & & & & & & & &} & & & & & &break; & & & & & & & & & & default: & & & & & & break; & & & & & & & &} & &} & &@Override & &protected void onStop() { & & & &// TODO Auto-generated method stub & & & &super.onStop(); & & & &Log.v(TAG, &ActivityonStop&); & &} & &@Override & &protected void onDestroy() { & & & &// TODO Auto-generated method stub & & & &Log.v(TAG, &ActivityonDestroy&); & & & &super.onDestroy(); & &}}代码package com.service.import java.io.IOEimport android.app.Simport android.content.Iimport android.media.MediaPimport android.os.IBimport android.util.Limport android.widget.Tpublic class PlayService extends Service { & &String TAG = &ServiceActivity&; & &MediaPlayer mediaP & &@Override & &public IBinder onBind(Intent intent) { & & & &// TODO Auto-generated method stub & & & &return null; & &} & &@Override & &public void onCreate() { & & & &// TODO Auto-generated method stub & & & &super.onCreate(); & & & &Toast.makeText(this, &Play Service Created&, Toast.LENGTH_LONG).show(); & & & &Log.v(TAG, &ServiceonCreate&); & & & &mediaPlayer = MediaPlayer.create(this, R.raw.test); & & & &/* & & & & * 要用MediaPlayer来创建,不能用MediaPlayer的对象来创建 // 不用带后缀 mediaPlayer = new & & & & * MediaPlayer(); mediaPlayer.create(this, R.raw.test); & & & & */ & & & &/* & & & & * try { mediaPlayer.setDataSource(&/sdcard/music/lost times.mp3&); & & & & * mediaPlayer.prepare(); & & & & *
& & & & * //方法二,从网上的链接获取歌曲 try { mediaPlayer.setDataSource( & & & & * &/uploadfile/mp3/13.mp3& & & & & * ); & & & & */ & & & &// mediaPlayer.setLooping(true); & &} & &@Override & &public void onStart(Intent intent, int startId) { & & & &// TODO Auto-generated method stub & & & &super.onStart(intent, startId); & & & &/* & & & & * //可以在OnCreate里面创建与音乐的链接,也可以在OnStart里面创建 mediaPlayer = & & & & * MediaPlayer.create(this, R.raw.test); & & & & */ & & & &Toast.makeText(this, &Play Service onStart&, Toast.LENGTH_LONG).show(); & & & &Log.v(TAG, &ServiceonStart&); & & & &mediaPlayer.start(); & &} & &@Override & &public void onDestroy() { & & & &// TODO Auto-generated method stub & & & &super.onDestroy(); & & & &Toast.makeText(this, &Play Service Stopped&, Toast.LENGTH_LONG).show(); & & & &Log.v(TAG, &ServiconDestroy&); & & & &mediaPlayer.stop(); & &}}
Powered by
v4.2 (C) Tunynet Inc.
联系站长:(QQ)扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
AndroidService服务(三)——bindService与remoteService
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口@Android @Java @性能优化 @开源
本文主要介绍Service的概念及作用、使用(包括长时间运行的服务、应用内交互的服务、应用间交互的服务的分别举例、生命周期、使用场景)、特殊的Service。
示例代码见,示例APK见:。
1、概念及作用
由于ANR对Activity和BroadcastReceiver响应时间的限制(Activity对事件响应不超过5秒,BroadcastReceiver执行不超过10秒),使得在其中都不适合执行较耗时操作,这样像网络、数据库、复杂计算这类耗时操作的执行就需要一个组件来承担。Service作为Android四大组件之一,其功能之一就是耗时操作的执行,主要功能如下:
a. 执行需要长时间运行的操作,这个操作不与用户进行交互,如网络下载、大文件I/O、复杂计算。b. 应用内或应用间数据通信,Android每个应用程序都在自己的dalvik虚拟机中运行,一个应用是不允许访问其他应用的内存信息的,为此Android引入了Content Provider在不同应用间共享数据,BroadcastReceiver广播信息给不同应用程序,但Content Provider更多用于数据的共享,BroadcastReceiver广播的信息会被所有应用接收较耗费系统资源,对于两个应用间动态的进行交互还需要通过Service来完成。
2、使用(1) startService启动不可进行交互的Service
a. 示例代码及介绍
Service示例
public class MyService extends Service {
public void onCreate() {
super.onCreate();
Toast.makeText(this, "Service Create", Toast.LENGTH_SHORT).show();
public void onDestroy() {
Toast.makeText(this, "Service Destroty", Toast.LENGTH_SHORT).show();
super.onDestroy();
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "Service Start", Toast.LENGTH_SHORT).show();
return super.onStartCommand(intent, flags, startId);
public IBinder onBind(Intent intent) {
return null;
服务都必须在AndroidManifest.xml文件中注册&service android:name=".MyService"/&,在Activity中定义对象private Intent myServiceIntent&= new Intent(this, MyService.class);在onCreate函数中startService(myServiceIntent)启动服务; onDestroy函数中stopService(myServiceIntent)关闭服务;
b. 生命周期通过startService启动服务,若服务未启动,会先执行onCreate函数(若服务已启动则不执行此函数),再执行onStartCommand函数。由此可知多次调用startService传入相同参数不会启动多个服务(onStartCommand函数会执行多次),所以最终只需要调用一次stopService或stopSelf函数停止服务;我们可以将service的处理逻辑放入onStartCommand函数中。服务一直运行,在程序退出后服务也不会停止,直到stopService或stopSelf函数被调用,当然可能被系统回收。
对于onStartCommand的返回值,若返回表示服务通过显式调用启动或停止,若返回&or表示服务仅在有请求发送过来处理时才处于运行状态。
c. 使用场景
因为这种方式Service无法与外部进行方便的动态交互,所以适合做后台服务,如网络下载(用户通过Intent传入Url到Service,推荐使用IntentService).
(2) bindService启动的Service应用内交互
a. 示例代码及介绍
在上面的方式中Context可以通过Intent向Service传入简单的信息,但是如果希望调用Service的接口进行操作或是获取Service的属性则无法实现,这里我们可以通过bindService实现,如下先定义自己的服务
自定义Service
public class MyService extends Service {
private int
private MyBinder myBinder = new MyBinder();
public void onCreate() {
Toast.makeText(this, "Service onCreate", Toast.LENGTH_SHORT).show();
count = 0;
super.onCreate();
public void onDestroy() {
Toast.makeText(this, "Service onDestroy", Toast.LENGTH_SHORT).show();
super.onDestroy();
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
* 服务被绑定时调用
* 返回值用于让调用者和服务通信,传入ServiceConnection的public void onServiceConnected(ComponentName name, IBinder service)函数第二个参数
public IBinder onBind(Intent intent) {
return myB
public int getCount() {
public int increaseCount() {
public int decreaseCount() {
public class MyBinder extends Binder {
MyService getService() {
return MyService.this;
从上可以看出我们重写onBind函数并返回自己的Binder用于调用者和服务之间通信。下面我们在调用者中进行调用
定义自己的Service、Intent、ServiceConnection对象
private MyService
private Intent
myServiceI
private ServiceConnection con = new ServiceConnection() {
* 服务所在进程被kill或是crash时系统调用,而不是unbindService时调用
public void onServiceDisconnected(ComponentName name) {
Toast.makeText(getApplicationContext(), "Service disconnect",
Toast.LENGTH_SHORT).show();
* 服务连接时调用,若已经连接不进行调用
public void onServiceConnected(ComponentName name, IBinder service) {
myService = ((MyBinder)service).getService();
Toast.makeText(getApplicationContext(), "Service Connect", Toast.LENGTH_SHORT).show();
接着调用bindService(myServiceIntent, con, Context.BIND_AUTO_CREATE);绑定服务,绑定成功返回true。这时会执行ServiceConnection对象的onServiceConnected函数为myService变量赋值。接着我们就可以通过myService.increaseCount();操作Service的属性,myService.getCount()获得Service的属性,这样我们就成功和Service进行了通信。在不需要通信时通过unbindService(con);解除服务绑定。
b. 生命周期通过bindService绑定服务,若服务未启动,会先执行Service的onCreate函数,再执行onBind函数,最后执行ServiceConnection对象的onServiceConnected函数。若服务已启动但尚未绑定,先执行onBind函数,再执行ServiceConnection对象的onServiceConnected函数。若服务已绑定成功,则直接返回。这里不会自动调用onStartCommand函数。
通过unbindService解除绑定服务,若已绑定成功,会先执行Service的onUnbind函数,再执行onDestroy函数,注意这里不会执行ServiceConnection对象的onServiceDisconnected函数,因为该函数是在服务所在进程被kill或是crash时被调用。若服务尚未绑定系统会报服务尚未注册异常,我们可以通过如下代码解决
if (myService != null) {
unbindService(con);
myService = null;
与startService启动的Service不同,若服务通过bindService启动并且没有通过startService启动过后,则在连接断开时服务就会自动解绑(onUnbind)并终止(onDestroy),而在调用者(Activity)退出后会自动断开连接,所以这时服务会自己解绑并终止。若存在某个组件绑定了该服务,则调用该服务的stopService不会停止服务。
c. 使用场景
应用内通信,如音乐播放器,在服务中控制播放器的播放、暂停、停止,在Activity中通过对服务操作控制播放器。
(3)&bindService启动的Service应用间交互&&AIDL
在Android AIDL应用间交互中 详细介绍见。
通过上面的三个例子我们可以看出和的区别
a.&bindService启动的Service可以和Context进行交互,而startService启动的Service不可以交互,因而使用场景也不同
b. 执行的生命周期不同
3、特殊的Service
(1). 异步服务IntentService
默认Service是运行在主线程内的 ,如果在Service内运行一个耗时操作就会阻塞主线程,可能导致ANR,为此我们可以在Service中自己新建线程去执行耗时操作,不过Android系统引入了IntentService方便的解决了这个问题,&IntentService会启动一个工作线程去完成用户onHandleIntent中定义的操作,需要注意的是对于同一个IntentService的多次请求(startService调用),在同一个线程中处理,一次只会执行一个请求的onHandleIntent函数。对于不同IntentService的同时请求,在不同的线程中处理,所以每个请求的onHandleIntent函数可以并发执行。示例代码如下:
IntentService示例
public class MyIntentService extends IntentService {
public MyIntentService(){
super("MyIntentService");
protected void onHandleIntent(Intent intent) {
System.out.println("IntentService1 Begin Sleep. " + "Thread name: " + Thread.currentThread().getName()
+ ", Thread Id: " + Thread.currentThread().getId());
Thread.sleep(3000);
System.out.println("IntentService1 End. ");
} catch (InterruptedException e) {
e.printStackTrace();
在AndroidManifest.xml文件中注册服务&service android:name=".MyIntentService"/&,在Activity中定义service对象private Intent myIntentServiceIntent&= new Intent(ServiceDemo.this, MyIntentService.class);在onCreate函数中startService(myIntentServiceIntent)启动服务;
从上面我们可以看出a. IntentService只需要重定义onHandleIntent函数并定义一个无参构造函数(xml中服务注册初始化时使用)即可。b. IntentService服务在onHandleIntent执行结束后会自动关闭。
IntentService和普通Service的区别如下:a. 普通Service运行在主线程中,IntentService运行在一个工作线程中不会阻塞主线程。b. 普通Service需要手动调用停止接口,IntentService自动停止。c. IntentService的onStartCommand函数根据mRedelivery属性值返回START_REDELIVER_INTENT或START_NOT_STICKY,而普通Service自定义返回。
阅读(...) 评论()[转载]android之Service(1)startService
运行service的方法有两种startService和bindService,区别startService的调用者和serice没有联系,及调用者结束后,service依然继续运行,而bindService组件结束后,service也结束。
该文主要讲的是使用startService启动服务。
在startService调用方法中,service的生命周期:
onCreate()-&onStratCommand()-&onStart()-&服务-&onDestroy()
说明:系统中不存在服务时,才执行oncreate方法,否则直接执行onStartCommand
首先创建服务程序,继承service基类
//文件名:servicejava
package jun.
import android.app.S
import android.content.I
import android.media.MediaP
import android.os.IB
import android.util.L
import android.widget.VideoV
public class
service extends Service {
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
public void
onCreate() {
Auto-generated method stub
super.onCreate();
Log.i("Service","Oncreate");
public void
onDestroy() {
Auto-generated method stub
super.onDestroy();
Log.i("Service","OnDestroy");
public void onRebind(Intent intent) {
// TODO Auto-generated method stub
super.onRebind(intent);
public void
onStart(Intent intent, int startId) {
Auto-generated method stub
super.onStart(intent, startId);
Log.i("Service","OnStart");
MediaPlayer
m=new MediaPlayer();
m.setDataSource("/sdcard/test.mp3");
m.prepare();
m.start();
catch(Exception
Log.i("播放音乐",
e.getMessage());
public int
onStartCommand(Intent intent, int flags, int startId)
Auto-generated method stub
Log.i("Service","OnStartCommand");
super.onStartCommand(intent, flags, startId);
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
return super.onUnbind(intent);
创建activity,调用startService方法
//文件名:xiaotech.java
package jun.
import android.app.A
import android.content.I
import android.os.B
import android.view.V
import android.widget.B
import android.widget.T
public class xiaotech extends Activity {
&@Override
&& &public
void onCreate(Bundle savedInstanceState) {
&super.onCreate(savedInstanceState);
&setContentView(R.layout.main);
start=(Button)findViewById(R.id.button1);
stop=(Button)findViewById(R.id.button2);
&start.setOnClickListener(lis);
&stop.setOnClickListener(lis);
&& &private
Button.OnClickListener lis=new Button.OnClickListener()
public void onClick(View v) {
// TODO Auto-generated method stub
intent=new Intent(xiaotech.this,service.class);
switch(v.getId())
case R.id.button1:
startService(intent);
Toast.makeText(xiaotech.this, "开启服务",
Toast.LENGTH_SHORT).show();
case R.id.button2:
stopService(intent);
Toast.makeText(xiaotech.this, "停止服务",
Toast.LENGTH_SHORT).show();
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 startservice 失败 的文章

 

随机推荐