android Service 的简单使用
2017-01-05 00:00
337 查看
1、要使用Service,首先就是在配置文件里吗添加Service,如果不填加,你的Service是不能够使用的。目前学到的方法有两种
方法一:<serviceandroid:enabled="true"android:name=".PlayService"/>
方法二:<serviceandroid:name=".PlayService"/>
点后面是Service类的名字。
2、工程包括两个类:
ServiceActivity.java
PlayService.java
其中:ServiceActivity.java定义了两个按钮,分别控制音乐的播放与停止。
用startService和stopService完成Activity与Service之间的切换,启动Service以及取消Service,
如果不用按钮,可以在Activity的OnCreate和OnDestrpy里面启动和取消Service,如下:
代码
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.startService(newIntent(this,PlayService.class));
}
@Override
protectedvoidonDestroy(){
super.onDestroy();
this.stopService(newIntent(this,PlayService.class));
}
在activity里面,如果需要使用Service的话,需要调用startService(),从而利用startService()去调用Service中的OnCreate()和onStart()方法来启动一个后台的Service。
启动一个Service的过程如下:context.startService()->onCreate()->onStart()->Servicerunning其中onCreate()可以进行一些服务的初始化工作,onStart()则启动服务。
停止一个Service的过程如下:context.stopService()|->onDestroy()->Servicestop
创建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道理是一样的。
代码如下:
代码
packagecom.service.su;
importandroid.app.Activity;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.util.Log;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
publicclassServiceActivityextendsActivityimplementsOnClickListener{
/**Calledwhentheactivityisfirstcreated.*/
ButtonbuttonOn,buttonOff;
StringTAG="ServiceActivity";
@Override
publicvoidonCreate(BundlesavedInstanceState){
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
publicvoidonClick(Viewv){
//TODOAuto-generatedmethodstub
switch(v.getId()){
case(R.id.button_on):
Log.v(TAG,"ActivitystartService");
this.startService(newIntent(this,PlayService.class));
//startService(newIntent(this,PlayService.class));
break;
case(R.id.button_off):{
Log.v(TAG,"ActivitystopService");
this.stopService(newIntent(this,PlayService.class));
//stopService(newIntent(this,PlayService.class));
}
break;
default:
break;
}
}
@Override
protectedvoidonStop(){
//TODOAuto-generatedmethodstub
super.onStop();
Log.v(TAG,"ActivityonStop");
}
@Override
protectedvoidonDestroy(){
//TODOAuto-generatedmethodstub
Log.v(TAG,"ActivityonDestroy");
super.onDestroy();
}
}
代码
packagecom.service.su;
importjava.io.IOException;
importandroid.app.Service;
importandroid.content.Intent;
importandroid.media.MediaPlayer;
importandroid.os.IBinder;
importandroid.util.Log;
importandroid.widget.Toast;
publicclassPlayServiceextendsService{
StringTAG="ServiceActivity";
MediaPlayermediaPlayer;
@Override
publicIBinderonBind(Intentintent){
//TODOAuto-generatedmethodstub
returnnull;
}
@Override
publicvoidonCreate(){
//TODOAuto-generatedmethodstub
super.onCreate();
Toast.makeText(this,"PlayServiceCreated",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/losttimes.mp3");
*mediaPlayer.prepare();
*
*
*//方法二,从网上的链接获取歌曲try{mediaPlayer.setDataSource(
*"http://www.yousss.com/uploadfile/mp3/2007-11/20071129134414713.mp3"
*);
*/
//mediaPlayer.setLooping(true);
}
@Override
publicvoidonStart(Intentintent,intstartId){
//TODOAuto-generatedmethodstub
super.onStart(intent,startId);
/*
*//可以在OnCreate里面创建与音乐的链接,也可以在OnStart里面创建mediaPlayer=
*MediaPlayer.create(this,R.raw.test);
*/
Toast.makeText(this,"PlayServiceonStart",Toast.LENGTH_LONG).show();
Log.v(TAG,"ServiceonStart");
mediaPlayer.start();
}
@Override
publicvoidonDestroy(){
//TODOAuto-generatedmethodstub
super.onDestroy();
Toast.makeText(this,"PlayServiceStopped",Toast.LENGTH_LONG).show();
Log.v(TAG,"ServiconDestroy");
mediaPlayer.stop();
}
}
方法一:<serviceandroid:enabled="true"android:name=".PlayService"/>
方法二:<serviceandroid:name=".PlayService"/>
点后面是Service类的名字。
2、工程包括两个类:
ServiceActivity.java
PlayService.java
其中:ServiceActivity.java定义了两个按钮,分别控制音乐的播放与停止。
用startService和stopService完成Activity与Service之间的切换,启动Service以及取消Service,
如果不用按钮,可以在Activity的OnCreate和OnDestrpy里面启动和取消Service,如下:
代码
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.startService(newIntent(this,PlayService.class));
}
@Override
protectedvoidonDestroy(){
super.onDestroy();
this.stopService(newIntent(this,PlayService.class));
}
在activity里面,如果需要使用Service的话,需要调用startService(),从而利用startService()去调用Service中的OnCreate()和onStart()方法来启动一个后台的Service。
启动一个Service的过程如下:context.startService()->onCreate()->onStart()->Servicerunning其中onCreate()可以进行一些服务的初始化工作,onStart()则启动服务。
停止一个Service的过程如下:context.stopService()|->onDestroy()->Servicestop
创建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道理是一样的。
代码如下:
代码
packagecom.service.su;
importandroid.app.Activity;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.util.Log;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
publicclassServiceActivityextendsActivityimplementsOnClickListener{
/**Calledwhentheactivityisfirstcreated.*/
ButtonbuttonOn,buttonOff;
StringTAG="ServiceActivity";
@Override
publicvoidonCreate(BundlesavedInstanceState){
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
publicvoidonClick(Viewv){
//TODOAuto-generatedmethodstub
switch(v.getId()){
case(R.id.button_on):
Log.v(TAG,"ActivitystartService");
this.startService(newIntent(this,PlayService.class));
//startService(newIntent(this,PlayService.class));
break;
case(R.id.button_off):{
Log.v(TAG,"ActivitystopService");
this.stopService(newIntent(this,PlayService.class));
//stopService(newIntent(this,PlayService.class));
}
break;
default:
break;
}
}
@Override
protectedvoidonStop(){
//TODOAuto-generatedmethodstub
super.onStop();
Log.v(TAG,"ActivityonStop");
}
@Override
protectedvoidonDestroy(){
//TODOAuto-generatedmethodstub
Log.v(TAG,"ActivityonDestroy");
super.onDestroy();
}
}
代码
packagecom.service.su;
importjava.io.IOException;
importandroid.app.Service;
importandroid.content.Intent;
importandroid.media.MediaPlayer;
importandroid.os.IBinder;
importandroid.util.Log;
importandroid.widget.Toast;
publicclassPlayServiceextendsService{
StringTAG="ServiceActivity";
MediaPlayermediaPlayer;
@Override
publicIBinderonBind(Intentintent){
//TODOAuto-generatedmethodstub
returnnull;
}
@Override
publicvoidonCreate(){
//TODOAuto-generatedmethodstub
super.onCreate();
Toast.makeText(this,"PlayServiceCreated",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/losttimes.mp3");
*mediaPlayer.prepare();
*
*
*//方法二,从网上的链接获取歌曲try{mediaPlayer.setDataSource(
*"http://www.yousss.com/uploadfile/mp3/2007-11/20071129134414713.mp3"
*);
*/
//mediaPlayer.setLooping(true);
}
@Override
publicvoidonStart(Intentintent,intstartId){
//TODOAuto-generatedmethodstub
super.onStart(intent,startId);
/*
*//可以在OnCreate里面创建与音乐的链接,也可以在OnStart里面创建mediaPlayer=
*MediaPlayer.create(this,R.raw.test);
*/
Toast.makeText(this,"PlayServiceonStart",Toast.LENGTH_LONG).show();
Log.v(TAG,"ServiceonStart");
mediaPlayer.start();
}
@Override
publicvoidonDestroy(){
//TODOAuto-generatedmethodstub
super.onDestroy();
Toast.makeText(this,"PlayServiceStopped",Toast.LENGTH_LONG).show();
Log.v(TAG,"ServiconDestroy");
mediaPlayer.stop();
}
}
相关文章推荐
- Android 版本号
- Android Phoenix Pull-to-Refresh炫酷装逼
- TextWatcher接口
- Android中的静态变量
- Android 用adb pull或push 拷贝手机文件到到电脑上
- Android常见问题
- Android 与 SwitchButton亲密约会《-》
- 自定义动态圆形ProgressBar_(二)
- 自定义布局监听软件盘弹出关闭
- 属性动画详解
- Android Handler 实例化-->发送消息-->处理消息流程
- volley的重试机制及错误处理机制
- android中handler简单用法
- Android 使用Volly解析JSON数据获取天气预报
- android Activity启动过程 简析
- Timer和CountDownTimer的使用
- Android6.0以上悬浮窗崩掉的问题
- Android应用程序------精算达人
- onWindowFocusChanged重要作用
- textview的跑马灯效果设置