您的位置:首页 > 移动开发 > Android开发

Android学习笔记(2)————Android四大组件之二(Service )

2014-10-10 23:30 537 查看
/********************************************************************************************

* author:conowen@大钟

* E-mail:conowen@hotmail.com

* http://blog.csdn.net/conowen

* 注:本文为原创,仅作为学习交流使用,转载请标明作者及出处。

********************************************************************************************/

1、首先service如windows下面的服务是差不多的,没有用户界面,只是在后台工作。

2、看一下service的继承关系



3、service本身不能自己启动,要调用其他方法才能启动service。有如下两种方法

a、Context.startService()

使用这个方法时,service与启动者是没有关系的,只是单纯的启动service,若启动者退出了,service依旧在后台运行。

(如音乐播放,即使退出了程序,音乐还在播放着)

b、Context.bindService()

使用此方法时,顾名思义,就是把启动者与service绑定在一起了,启动者退出,service也跟着停止。

4、service的生命周期

a、采用startService()方法启动的服务,只能调用stopService()方法结束服务,服务结束时会自动调用onDestroy()方法。

b、采用bindService()方法启动的服务,可以调用unbindService()方法来解绑,调用该方法时,也会同时导致系统自动调用服务的onUnbind()和onDestroy()方法.

[java]
view plaincopy

//Context.startService方式的生命周期:
启动时,调用startService方法 –>onCreate() –> onStart()
停止时,调用stopService 方法 –> onDestroy()

//Context.bindService方式的生命周期:
绑定时,调用bindService方法 ->onCreate() –> onBind()
解绑定时,调用unbindService方法 –>onUnbind() –> onDestory(

Service的生命周期方法比Activity少,只有onCreate, onStart, onDestroy 。



5、简单音乐播放例子

MP3文件在res目录下的raw目录里面,拖动mp3文件进去即可。(raw为自己新建)

文件格式为mp3和ogg,文件名为0~9或者a~z,比特率最好低于或等于320kps

[java]
view plaincopy

//第一个Activity
package conowen.szu.Service;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
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;

public class ServiceActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button play = (Button) findViewById(R.id.play);
Button stop = (Button) findViewById(R.id.stop);
Button bind = (Button) findViewById(R.id.bind);
Button unbind = (Button) findViewById(R.id.unbind);
final Intent intent = new Intent(ServiceActivity.this,MusicService.class);
// 定义intent为final,全局变量,供下面两个匿名内部类(onclicklisenter)使用
play.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
startService(intent);
// 开始播放,通过前面定义好的intent传递

}
});
stop.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
stopService(intent);
// 停止播放

}
});
/*******************************以下为bindService方式启动Service*****************************************/
final ServiceConnection conn=new ServiceConnection() {
//全局变量final ,供下面两个内部类使用
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
Toast.makeText(ServiceActivity.this, "绑定成功", Toast.LENGTH_LONG).show();

}

@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
Toast.makeText(ServiceActivity.this, "解绑成功", Toast.LENGTH_LONG).show();

}
};
//当采用bindService启动Service,Service和执行bindService所在的Activity绑定成功以后会调用ServiceConnection;
//同理,当的Service和使用该Service的客户端取消绑定以后会调用onServiceDisconnected
//ServiceConnection(conn)也为下面的bindService和unbindService的参数

bind.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
bindService(intent, conn, Context.BIND_AUTO_CREATE);

}

});
unbind.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
unbindService(conn);


}
});
}
}

第二个class为service的处理方法,通过复写各种service方法实现不同的功能。

[java]
view plaincopy

//第二个class
package conowen.szu.Service;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;

public class MusicService extends Service {

MediaPlayer player;
//新建播放器

@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
player = MediaPlayer.create(this, R.raw.lt26);
player.setLooping(true);
//两种方式的第一个生命周期都是onCreate()
}

@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
player.start();

}

@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
player.start();
return null;
}

@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
player.stop();
return super.onUnbind(intent);
}

@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
player.stop();
}

}

效果图:



6、

注:第二个java文件

[java]
view plaincopy

public class MusicService extends Service {

继承的是Service,则要在AndroidManifest里面开启Service

[html]
view plaincopy

<service
android:label="player"
android:name=".MusicService" >

</service>

若第一个java文件继承的是Activity,则AndroidManifest里面为

[html]
view plaincopy

<activity
android:label="player"
android:name=".MusicService" >

</activity>

/********************************************************/

对于每多一次点击“播放”按钮时,音乐就多播放一个。(都是同一个音乐,但是播放起步时间不同)

可以把player.start()方法置于onCreate里面,这样就算多次点击“播放”按钮,也没事。因为Service的onCreate的方法只会被调用一次。

如下代码所示(只有“播放”与“停止功能”)并没有加入绑定与解绑

onStart方法不用写出

[java]
view plaincopy

package conowen.szu.Service;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;

public class MusicService extends Service {
MediaPlayer player;

@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
player = MediaPlayer.create(this, R.raw.lt26);
player.start();
}

// player.start()在onCreate方法里面时,多次点击play按钮,一样正常播放,也就是说音乐不会再开多一个。
//若play.start()放在onStart方面里面,没多一次点击play按钮,就会多播放一次,同样的音乐同时播放(起步不同)

@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}


@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
player.stop();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: